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

我正在考虑对我的一些项目采用browserify ,但是要确保其他人不必使用browserify,如果他们想使用(捆绑)的代码。 做到这一点的显而易见的方式是通过module.exports以及通过window.来显示模块导出window. 全球。 但是,我宁愿不污染那些require脚本的全局名称空间。

是否有可能检测脚本是否require d? 如果是的话,我可以做一些事情:

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

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

什么是最好的方式来做一个模块都require能够和<script src= able? 在这两种情况下最好只是揭露全球?

福布斯Lindesay有一篇很好的文章解释了如何做独立构build: http : //www.forbeslindesay.co.uk/post/46324645400/standalone-browserify-builds

短版本,使用独立选项:

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

我正在处理同样的问题,build立一个图书馆,这里是一个舆论。 我认为我们需要首先将图书馆的观众分为几类:

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

所以,对于1来说很简单,你将有一个你的index.js模块:

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

和你的package.json将有一个主

“main”:“index.js”

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

对于2我认为最好的想法是创build一个standalone.js

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

这是browserify应该build立的。

对于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; } 

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

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

为什么不用一个闭包来包装整个东西,并把exports作为parameter passing呢?

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

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