要求没有与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.js
和script.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