Browserify: Use module.exports if required, otherwise expose global

…衆ロ難τιáo~ 提交于 2019-12-02 17:55:18

There is a good article from Forbes Lindesay explaining how to do standalone builds: http://www.forbeslindesay.co.uk/post/46324645400/standalone-browserify-builds

The short version, use the standalone option:

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

I'm dealing with the same problem building a library and here is a rought opinion. I think we need to separate first the audiences for a library in few categories:

  1. those who use browserify and NPM
  2. those who will just download a mylib.min.js and use one way or another
  3. AMD (with bower?), might be the third category.

So, for 1 it is easy, you will have a your index.js module:

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

and your package.json will have a main

"main": "index.js"

Notice I haven't add any window.xx code to index.js.

For 2 I think the best idea is to create a standalone.js

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

This is what browserify should build.

For 3 (if you care about) you can tweak standalone.js as follows:

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

Assuming another library hasn't created a global module.exports object, you can simply check for the existence of module.exports

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

Why not just wrap the entire thing with a closure and pass exports as a parameter?

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

This way it will also export it to WebWorker scope and other 'windowless' environments.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!