Javascript Browserify:如果需要,使用module.exports,否则公开全局

Javascript Browserify:如果需要,使用module.exports,否则公开全局,javascript,browserify,Javascript,Browserify,我正在考虑在我的一些项目中采用browserify,但是如果其他人想要使用(捆绑的)代码,我想确保他们不必使用browserify。显而易见的方法是通过module.exports以及窗口公开模块导出。global。但是,对于那些需要编写脚本的人,我不希望污染全局名称空间 是否可以检测脚本是否正在required?如果是的话,我可以这样做: var mymodule = (function() { ... })(); if (isRequired()) { module.exports =

我正在考虑在我的一些项目中采用browserify,但是如果其他人想要使用(捆绑的)代码,我想确保他们不必使用browserify。显而易见的方法是通过
module.exports
以及
窗口公开模块导出。
global。但是,对于那些
需要
编写脚本的人,我不希望污染全局名称空间

是否可以检测脚本是否正在
require
d?如果是的话,我可以这样做:

var mymodule = (function() { ... })();
if (isRequired()) {
  module.exports = mymodule;
} else {
  window.mymodule = mymodule;
}
请注意,无论发生什么情况,这都将预先绑定,因此
var mymodule
不会公开全局变量。另外,目前我正在使用,但愿意切换到更适合browserify的版本


如果另一个库没有创建全局module.exports对象,您可以简单地检查module.exports是否存在,那么使模块既能
require
又能
的最佳方法是什么

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

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

  • 使用browserify和NPM的人
  • 那些只需下载mylib.min.js并以某种方式使用的用户
  • 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;
    }
    

    《福布斯·林赛》有一篇很好的文章解释了如何进行独立构建:

    对于短版本,请使用独立选项:

    browserify beep.js --standalone beep-boop > bundle.js
    

    为什么不用一个闭包将整个过程包装起来,然后作为参数传递
    exports

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

    通过这种方式,它还将其导出到WebWorker范围和其他“无窗口”环境。

    浏览使
    模块
    模块。导出
    要求所有捆绑文件都可用。因此,仅凭我的捆绑就可以实现这些功能。感谢您的回复。链接使用了不推荐使用的代码。无法再将选项传递给bundle()。另外,link没有解释beep boop是从哪里来的,名称是否重要,以及在现实世界中用什么来替换它。我不确定术语是否正确,但本例中的“beep boop”是您希望包含独立函数的“名称空间”。因此,如果我使用
    browserify infle--standalone myspace--o outfile
    浏览函数
    byteLength(…){…}
    ,我将通过调用
    myspace.byteLength(…)
    从包含
    outfile
    via
    require()
    的JS文件中访问该函数;将browserify 17.0.0版与上述版本一起使用,我得到了一个工作包,并正确地公开了一个驼峰式全局“beepBoop”。难道“global”与“window”不一样吗?如果是,它不应该是“global.mylib=mylib”而不是“global.window.mylib=…”吗?