require is not defined 错误与 browserify

require is not defined error with browserify

我是 browserify 的新手,正在尝试在浏览器中加载 npm 模块,但出现以下错误:

Uncaught ReferenceError: require is not defined

我正在学习 http://browserify.org/ 中的教程。创建了包含以下内容的 javascript 文件:

var unique = require('uniq');

然后 运行

npm install 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');

简答:移除script.js导入

更长的答案: 您收到错误是因为浏览器中未定义方法 require。你不应该包括 script.js.

Browserify 背后的想法是,您可以使用 CommonJS 模块拆分您的源代码,并将它们捆绑到一个文件中,以便在浏览器中使用。 Browserify 将遍历所有源并将所有 required 个文件连接到包中。

"require" 函数仅在 "bundle.js" 脚本上下文中可用。 Browserify 将获取所有必要的脚本文件并将它们放入 "bundle.js" 文件中,因此您只需将 "bundle.js" 包含在 HTML 文件中,而不是 "script.js" 文件中。

我个人更喜欢将我的库代码和应用程​​序代码分开。所以我也创建了类似 bundle.jsscript.js.

的东西

有一个简单的解决方法,可以解决这个问题。这是我的浏览器文件中的某个地方:

window.require = require;

这会将 require 公开到 "global" 命名空间中。然后,您可以从 script.js.

中获取您想要的一切

不过,您确实放弃了一项优势:您必须在 browserify 文件中包含所有必需的库。那么,您没有找到所有依赖项的奢侈!

我完全希望人们哭泣 "dirty hack" 或 "this is not how it's meant to be"。也许吧。但我希望这些文件分开。只要我不包含任何其他称为 "require" 的内容,我就可以了,非常感谢。

有时一个全球性的东西可以改变一切。

似乎要 运行 像这样的脚本你必须在包上使用独立的。

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

在那之后你应该在 bundle.js 中有 window.Bundle
所以到那时你应该能够从 script.js 访问。

如果您使用的是 g运行t

如果您正在使用 grunt,请安装 grunt-browserify

npm install grunt-browserify --save-dev

然后在 grunt.js G运行tfile:

// 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));

请参阅 here Chart.js gulp 文件。

如果你使用的是 babel

如果您正在使用 babel 并且 es6 可能您正在导出 Bundle class。

// 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();

来源

Standalone browserify builds