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立一个图书馆,这里是一个舆论。 我认为我们需要首先将图书馆的观众分为几类:
- 那些使用browserify和NPM的人
- 那些只会下载mylib.min.js并使用这种或那种方式
- 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范围和其他“无窗口”环境中。