使用browserify时,require未定义错误

Kin*_*ien 30 javascript node.js browserify

我是浏览器并尝试在浏览器中加载npm模块的新手,但是我收到以下错误:

未捕获的ReferenceError:未定义require

我正在关注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>
Run Code Online (Sandbox Code Playgroud)

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

这是script.js:

var unique = require('uniq');

小智 37

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

  • 我现在明白了 - browserify不会从浏览器创建一个你需要的模块 - 它打包你的代码并将整个东西包装在一个闭包中 - 你需要特殊的步骤来创建一个可以从浏览器中使用的库.我想出这些步骤并将它们添加到这个答案中,因为很多人会对OP和我自己造成同样的错误观念. (4认同)
  • 所以我不能要求为此目的捆绑在一起的模块..? (2认同)

ame*_*hes 14

我个人更喜欢将我的库代码和应用程​​序代码分开.所以我也创造了类似a bundle.js和a的东西script.js.

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

window.require = require;
Run Code Online (Sandbox Code Playgroud)

这将暴露require到"全局"命名空间.然后,您可以要求您提供所需的一切script.js.

但是,您确实放弃了一个优势:您必须在browserify文件中包含所有必需的库.那么你找不到所有的依赖关系就无法获得它的奢侈!

我完全希望人们哭泣"肮脏的黑客"或"这不是它的意思".也许吧.但我希望这些文件分开.只要我不包含任何其他被称为"要求"的东西,我会没事的,非常感谢你.

有时一个全球可以发挥重要作用.


tho*_*aux 8

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

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

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


bor*_*Blu 8

似乎要运行这样的脚本,你必须在bundle上使用standalone.

browserify main.js --standalone Bundle > bundle.js
Run Code Online (Sandbox Code Playgroud)

之后你应该window.Bundle进去bundle.js.
所以在那时你应该可以访问script.js.

如果你正在使用咕噜声

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

npm install grunt-browserify --save-dev
Run Code Online (Sandbox Code Playgroud)

然后在grunt.jsGruntfile上:

// 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"]
        }
    }
},
Run Code Online (Sandbox Code Playgroud)

如果你正在使用gulp

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

这里的chart.js之一饮而尽文件.

如果你使用babel

如果您正在使用babel而且es6可能正在出口您的Bundle课程.

// you should have something like that 

class Bundle {
    ...

}

export default Bundle;
Run Code Online (Sandbox Code Playgroud)

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

// in script.js
var bundle = new Bundle.default();
Run Code Online (Sandbox Code Playgroud)

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

在bundle.js的末尾插入:

window.Bundle = window.Bundle.default;
Run Code Online (Sandbox Code Playgroud)

所以现在你将拥有:

// in script.js
var bundle = new Bundle();
Run Code Online (Sandbox Code Playgroud)

来源

独立浏览器构建