要求没有与browserify定义错误

我是新的浏览器,并试图加载浏览器中的npm模块,但我得到以下错误:

未捕获的ReferenceError:require是未定义的

我正在浏览http://browserify.org/的教程。 创build了以下内容的JavaScript文件:

var unique = require('uniq');

然后运行

npm安装uniq

browserify main.js -o bundle.js

生成的bundle.js文件,我把它包括在我的HTML,但仍然得到上述错误。 任何想法我做错了什么?

这是最终的HTML文件的内容:

<!DOCTYPE html> <html> <head> <title></title> <script src="bundle.js"></script> <script src="script.js"></script> </head> <body> </body> </html> 

这是bundle.js的内容: http ://pastebin.com/1ECkBceB

这是script.js:

var unique = require('uniq');

“require”函数仅在“bundle.js”脚本上下文中可用。 Browserify会将所有需要的脚本文件放到“bundle.js”文件中,因此您只需要在HTML文件中包含“bundle.js”,而不是“script.js”文件。

简短的回答 :删除script.js导入

较长的回答 :您正在收到错误,因为浏览器中未定义方法require 。 你不应该包含script.js

Browserify背后的思想是,你可以使用CommonJS模块拆分你的源代码,并将它们打包成一个文件,以便在浏览器中使用。 Browserify将遍历所有的源代码,并将所有require d文件连接到包中。

我个人更喜欢保持我的库代码和应用程​​序代码独立。 所以我也创build了一个像bundle.jsscript.js

有一个简单的解决方法,这使得这项工作。 这是我的browserify文件中的某个地方:

 window.require = require; 

这将暴露require到“全局”命名空间。 然后,您可以从script.js所需的全部内容。

但是,您放弃了一个优势,您必须将所有必需的库包含在您的browserify文件中。 那么你没有find所有你的依赖的奢侈品!

我完全期待人们哭泣“肮脏的黑客”或“这不是它的意思”。 也许吧。 但我希望这些文件分开。 只要我不包含任何其他所谓的“要求”,我会很好,非常感谢。

有时候一个全球化可以使所有的差异。

似乎要运行这样的脚本,你必须使用独立的捆绑软件。

 browserify main.js --standalone Bundle > bundle.js 

之后,你应该有window.Bundle中的bundle.js
所以在这一点上,你应该能够访问script.js

如果你正在使用咕噜声

如果您正在使用grunt install grunt-browserify

 npm install grunt-browserify --save-dev 

然后在grunt.js Gruntfile:

 // Add the task grunt.loadNpmTasks('grunt-browserify'); // Add the configuration: browserify: { dist: { options: { // uncomment if you use babel // transform: [ // ["babelify", { "presets": ["env"] }] // ], browserifyOptions: { standalone: 'Bundle' } }, files: { "bundle.js": ["main.js"] } } }, 

如果你正在使用gulp

  // on your build task var bundled = browserify('main.js', { standalone: 'Bundle' }) .bundle() .pipe(source('bundle.js')) .pipe(gulp.dest(outDir)); 

在这里查看Chart.js gulp文件。

如果你使用巴贝尔

如果你正在使用babel和es6可能你正在导出你的Bundle类。

 // you should have something like that class Bundle { ... } export default Bundle; 

所以,因为babel现在使用Bundle你应该使用Bundle.default ,所以:

 // in script.js var bundle = new Bundle.default(); 

为了避免这种语法,你可以用Bundle.default覆盖Bundle

在bundle.js的末尾插入:

 window.Bundle = window.Bundle.default; 

所以现在你会有:

 // in script.js var bundle = new Bundle.default(); 

来源

独立浏览器构build