支持CommonJS和AMD

slo*_*obo 36 javascript amd commonjs

有没有办法创建一个javascript微库(没有依赖的库),它支持以下所有模块格式:

  • 异步模块定义
  • CommonJS的
  • 将库的导出公开为全局命名空间对象(无加载器)

Mar*_*arc 49

是的,我对ded和他令人敬畏的模块的答案是:

(function(name, definition) {
    if (typeof module != 'undefined') module.exports = definition();
    else if (typeof define == 'function' && typeof define.amd == 'object') define(definition);
    else this[name] = definition();
}('mod', function() {
    //This is the code you would normally have inside define() or add to module.exports
    return {
        sayHi: function(name) {
            console.log('Hi ' + name + '!');
        }
    };
}));
Run Code Online (Sandbox Code Playgroud)

然后可以使用它:

  1. 在AMD中(例如使用requireJS):

    requirejs(['mod'], function(mod) {
        mod.sayHi('Marc');
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在commonJS中(例如nodeJS):

    var mod = require('./mod');
    mod.sayHi('Marc');
    
    Run Code Online (Sandbox Code Playgroud)
  3. 全局(例如在HTML中):

    <script src="mod.js"></script>
    <script>mod.sayHi('Marc');</script>
    
    Run Code Online (Sandbox Code Playgroud)

这种方法需要得到更多的宣传 - 如果jQuery和co.开始使用它生活会容易得多!

  • 如果模块具有我想要的依赖项,这会工作吗?如果我在里面做var x = require('./x'); 我希望在amd和node中正常工作,没有加载器我会想要使用window.x. (2认同)

Lee*_*Lee 22

以下是各种交叉兼容模块格式的列表.

我怀疑你正在寻找的是他们所谓的" commonjsStrict.js "


Ang*_*las 7

uRequire,通用模块和资源转换器就是这样做的工具.

  • 它主要将AMD和CommonJS转换UMD/AMD/CommonJS/Plain脚本(不需要AMD加载程序).

  • 它允许模块化的声明性导出,带有noConflict()烘焙.

  • 它可以在构建模块时操作模块(注入/替换/删除依赖项或代码).

  • 它转换为coffeescript,coco,Livescript,icedCoffeescript,你可以在一个衬里添加你自己的转换!