使用browserify成功将Javascript类的模块集合捆绑到单个库中。但我需要将_
和Backbone
定义为全局模块,并想知道这是否是最佳方式。
MyLib主要是一个Backbone集合,需要其他子模块:
var _ = require('lodash');
var Backbone = require('backbone');
if (typeof window !== 'undefined') Backbone.$ = window.$;
var foo = require('foo'), bar = require('bar');
module.exports = Backbone.Collection.extend({ ... my library... });
因为Backbone和Underscore更大更普遍,所以不想捆绑它们,而是将它们视为外部依赖项。所以在package.json
中,我使用browserify-shim
来排除它们:
...
"browserify": {
"transform": [
"browserify-shim"
]
},
"browserify-shim": {
"lodash": "global:_",
"backbone": "global:Backbone"
}
模块在浏览器中加载正常,因为_
被定义为全局变量:
<script src="/javascripts/underscore.js"></script>
<script src="/javascripts/mylib.js"></script>
<script type="text/javascript">
console.log(new MyLib()); // loads fine standalone or via require.js
</script>
但是在Node.js中,browserify-bundled模块在名为global
var _ = require("lodash");
var MyLib = require("./libs/mylib");
由于TypeError: Cannot call method 'isEqual' of undefined
未定义_
,因此失败。在顶部mylib.js
内,我看到了一行:
var _ = (typeof window !== "undefined" ? window._ : typeof global !== "undefined" ? global._ : null)
但是,我可以通过全局定义依赖关系来实现它:
var _ = GLOBAL.global._ = require("lodash");
var MyLib = require("./libs/mylib");
但这会产生全局变量,许多人强烈反对这篇文章:node.js global variables?
是否有更好的方法在Node.js中包含Browerify模块的外部依赖项?