在Node.js上包含带外部依赖的browserify-bundled模块?

时间:2015-03-17 14:44:03

标签: javascript node.js browserify

使用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模块的外部依赖项?

How do I use Browserify with external dependencies?

0 个答案:

没有答案