40

我正在考虑为我的一些项目采用browserify,但想确保其他人如果想使用(捆绑的)代码就不必使用browserify。显而易见的方法是module.exports通过window.全局和全局公开模块导出。但是,我宁愿不要污染那些正在require编写脚本的人的全局命名空间。

是否可以检测脚本是否正在被required?如果是,那么我可以执行以下操作:

var mymodule = (function() { ... })();
if (isRequired()) {
  module.exports = mymodule;
} else {
  window.mymodule = mymodule;
}

请注意,无论如何,这将预先捆绑,因此var mymodule不会暴露全局。此外,目前我正在使用显示模块模式,但愿意切换到更适合 browserify 的东西。

使模块既require能干又<script src=能干的最好方法是什么?在这两种情况下最好只公开一个全局变量吗?

4

4 回答 4

43

Forbes Lindesay 有一篇很好的文章解释了如何进行独立构建: http ://www.forbeslindesay.co.uk/post/46324645400/standalone-browserify-builds

简短版本,使用独立选项:

browserify beep.js --standalone beep-boop > bundle.js
于 2014-01-19T02:05:10.340 回答
20

我正在处理建立图书馆的同样问题,这是一个粗略的意见。我认为我们需要首先将图书馆的受众分为几类:

  1. 使用 browserify 和NPM的人
  2. 那些只会下载 mylib.min.js 并使用一种或另一种方式的人
  3. AMD(有凉亭?),可能是第三类。

因此,对于1来说,这很容易,您将拥有一个 index.js 模块:

module.exports = function () { /* code */ }

你的 package.json 将有一个 main

“主”:“index.js”

请注意,我没有向 index.js 添加任何 window.xx 代码。

对于2,我认为最好的主意是创建一个standalone.js

var mylib = require('./index.js');
global.window.mylib = mylib;

这就是 browserify 应该构建的。

对于3(如果您关心的话),您可以按如下方式调整standalone.js:

var mylib = require('./index.js');
if (typeof global.window.define == 'function' && global.window.define.amd) {
  global.window.define('mylib', function () { return mylib; });
} else {
  global.window.mylib = mylib;
}
于 2013-10-24T14:07:51.563 回答
2

假设另一个库没有创建全局 module.exports 对象,您可以简单地检查 module.exports 的存在

var mymodule = (function() { ... })();
if (module && module.exports) {
  module.exports = mymodule;
} else {
  window.mymodule = mymodule;
}
于 2013-04-27T15:51:32.543 回答
0

为什么不直接用闭包包裹整个东西并exports作为参数传递呢?

(function (exports) {
    // code here
    // ...
    exports.foo = bar;
})(exports || this);

这样它也会将其导出到 WebWorker 范围和其他“无窗口”环境。

于 2015-12-09T11:22:23.930 回答