Angular 2/webpack 中的“未捕获的 ReferenceError:未定义要求”

Posted

技术标签:

【中文标题】Angular 2/webpack 中的“未捕获的 ReferenceError:未定义要求”【英文标题】:"Uncaught ReferenceError: require is not defined" with Angular 2/webpack 【发布时间】:2016-03-29 21:56:39 【问题描述】:

我正在使用 node 和 webpack 将来自图形设计公司的 html 模板添加到我的 Angular 2 项目中。

HTML 会像这样引入各种脚本:

<script src="js/jquery.icheck.min.js"></script>
<script src="js/waypoints.min.js"></script>

所以我在 component.ts 中需要它们:

var icheckJs = require('../js/jquery.icheck.min');
var waypointsJs = require('../js/waypoints.min');

还有其他几个脚本和一些看起来工作正常的 SASS。

webpack 很高兴并构建了这一切,并且“npm start”也成功了。但是,当它到达浏览器时,我收到了这样的抱怨:

Uncaught ReferenceError: require is not defined node_modules/angular2/platform/browser.js:1 Uncaught ReferenceError: require is not defined

这实际上是由 url.js 中的这一行抛出的:

var punycode = require('punycode');

这是 CommonJs 的要求吗?几周前我还没有在 web 开发中使用过这个,所以我仍然在解决 webback、CommonJs 等的各种需求。

从我的 webpack.config.js 中提取的 .js 加载器如下所示:

 test: /\.js$/, loader: 'script' 

如何解决此错误?

【问题讨论】:

看这个答案,可能是重复的:***.com/questions/19059580/… 你找到解决方案了吗? 你能发布你的整个 webpack 配置和入口 js 吗? 我们可以看看你的 package.json 吗? 你可以在这里添加你的 tsConfig.json 文件吗? 【参考方案1】:

对于任何正在寻找答案但上述方法不起作用的人:

webpack.config.js 中的当前target 添加或替换为target: 'web'

再长一点

Webpack 有不同的targets,如果你已经尝试过这个并将你的目标更改为node,它将使用'require'来加载块。 最好的办法是让你的目标(或添加)target: 'web' 在你的webpack.config.js 中。这是默认目标,并以浏览器可以处理的方式加载您的块。

我最终找到了这个解决方案here。

【讨论】:

【参考方案2】:

假设你有,你可以在一行中做到这一点

dist/bundle.js 中的捆绑包

将在浏览器中呈现页面的源文件客户端代码 client/client.js

webpack && webpack ./client/client.js dist/bundle.js \ && webpack-dev-server --progress --color

您需要再次运行webpack,因为如果库中的某些源发生更改,您将在dist/bundle.js 包中获得最后的更改(当然,您可以为此添加grunt 文件监视任务)。然后webpack-dev-server 将运行服务器。

【讨论】:

【参考方案3】:

WebPack 可以单独做到这一点。您需要确保首先使用脚本 src 标签加载初始块。它通常是条目的值:WebPack 配置中的键,附加了 -bundle。如果您没有进行显式分块,那么您的入口块应该既是初始块又是入口块,并且其中包含 WebPack 运行时。 WebPack 运行时包含并在您的代码运行之前加载 require 函数。

您的组件或您需要的任何东西都需要从入口文件中获取,因为您的脚本将从那里开始。基本上,如果您没有明确分块,则入口点 JS 文件是您可以包含在脚本 src 中的唯一文件。其他一切都需要它。您包含的内容通常会在 JS 文件名中包含 bundle。默认情况下,它应该是 main-bundle.js。

【讨论】:

以上是关于Angular 2/webpack 中的“未捕获的 ReferenceError:未定义要求”的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的错误:Angular JS 中的 [$injector:modulerr] 和 ngRoute 错误

Angular - 未捕获的 ReferenceError:$ 未在 Object../src/assets/dist/js/pages/dashboard2.js 中定义

Angular AOT 和汇总 - 未捕获的 ReferenceError:未定义导出

angular.js 和 require.js 得到未捕获的错误:[$injector:modulerr]

Bazel + Angular + SocketIO 原因:未捕获的 TypeError:XMLHttpRequest 不是构造函数

未捕获的错误:Bootstrap 的 JavaScript 在 Angular 4 上需要 jQuery