【问题标题】:WebPack with React Uncaught Reference Error带有 React 未捕获引用错误的 WebPack
【发布时间】:2014-09-27 16:29:29
【问题描述】:

我非常松散地遵循示例here,直到它开始运行开发服务器。

我有一个测试 React 组件(在 scripts/test.jsx 中):

/** @jsx React.DOM */

var React = require('react');

var Test = React.createClass({
    render: function(){
        return <h1>HI!</h1>
    }
});

module.exports = Test;

我有一个 webpack.config,我在其中对源目录使用 jsx 加载程序(它与 the example 中的基本相同,除了我添加了 library properties)。

我运行 webpack 并像我期望的那样生成捆绑文件,但是,当我尝试在 html 文件中使用组件时(在包含 bundle.js 脚本参考之后),我在控制台中得到以下信息:“未捕获的 ReferenceError:未定义测试”。

HTML 包含以下内容:

<div id="hi">
</div>
<script type="text/jsx">
    /** @jsx React.DOM */
    React.renderComponent(
      <Test />,
      document.getElementById('hi')
    );
</script>

我在使用 CommonJS 样式中定义的组件对技术上不使用模块加载器的 html 页面做不正确的事情(我试图将此测试视为有人试图加载没有任何类型的结构化模块加载器的组件)?

webpack 的输出可用here

编辑 2:完整的示例代码可用as a github repo

【问题讨论】:

  • 脚本在例如Chrome 调试器?编译后的脚本是否正确显示在“资源”选项卡中?
  • 我已更新问题以包含指向已编译输出的链接。脚本出现在 Chrome 调试器的资源选项卡中。

标签: reactjs react-jsx webpack


【解决方案1】:

是的,您最好遵循示例并从 .jsx 文件中要求 Test 而不是将其内联到 HTML 中。

否则,Test 需要导出为全局,因此您需要遵循与 browserify --standalone 标志类似的约定,看起来像这样:

output: {
    library: "Test",
    libraryTarget: "umd"
}

http://webpack.github.io/docs/webpack-for-browserify-users.html#standalone

编辑:查看您的 GH 存储库后,您有:

<script src="bundle.js" type="text/js"></script>

而不是

<script src="bundle.js" type="text/javascript"></script>

所以它根本没有加载包。此外,您不能拥有 2 个单独的 react 副本,按照您当前拥有它的方式,您需要从 webpack 中进行 React,然后您还将其加载到页面上。您应该导出一个采用 React 对象的函数,或者使用全局函数以便能够在包之外使用它。

例如这会起作用:

/** @jsx React.DOM */
module.exports = function(React) {

var Test = React.createClass({
    render: function(){
        return <h1>HI!!</h1>
    }
});

return Test;
};

然后:

    /** @jsx React.DOM */
    React.renderComponent(
      Test(React)(),
      document.getElementById('hi')
    );

或者这个

/** @jsx React.DOM */
var Test = React.createClass({
    render: function(){
        return <h1>HI!!</h1>
    }
});

module.exports = Test;

然后:

    /** @jsx React.DOM */
    React.renderComponent(
      <Test />,
      document.getElementById('hi')
    );

虽然我无法想象大多数使用 React 包的人会使用脚本标签来加载它,而且您通常不想要全局变量,所以最好只使用 CommonJS 样式的 require 并让人们了解出匀场或什么的。

【讨论】:

  • 我知道 UMD 包含 var / require / common 结构,但不应该将 libraryTarget 设置为 var 也使组件对页面可用? webpack.github.io/docs/configuration.html#output-librarytarget
  • 另外,我同意使用这种内联 HTML 不是一个好习惯。问题是我正在开发一个供其他人使用的库,我不想对他们的设置做出太多假设(除了说你需要 React 等)。 UMD 是一个很好的选择(因为它可以使用 Common/Require/inline),但是设置 UMD 选项具有相同的行为。我首先使用 var 进行测试,这似乎是最简单的开始方式。
  • 那么您仍然对 var/umd 配置有问题吗?
  • 不幸的是,是的。我可以在 GitHub 上或稍后再提交测试项目,以便获得完整的源代码。似乎必须有一个配置选项或我缺少的东西,但不完全确定是什么。
  • 基于 gh repo 编辑的答案
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2015-07-07
  • 2013-04-05
  • 2021-02-19
  • 1970-01-01
  • 2013-10-27
  • 2014-10-11
  • 2018-02-07
相关资源
最近更新 更多