「JavaScript」如何让你的插件兼容CommonJS, AMD, CMD 和 原生 JS

模块标准

CommonJS

CommonJS 有三个全局变量 moduleexportsrequire。可是因为 AMD 也有 require 这个全局变量,故不使用这个变量来进行检测。javascript

若是想要对外提供接口的话,能够将接口绑定到 exports (即 module.exports) 上。java

function MyModule() {
    // ...
}

if(typeof module !== `undefined` && typeof exports === `object`) {
    module.exports = MyModule;
}

CMD

CMD 规范中定义了 define 函数有一个公有属性 define.cmd函数

CMD 模块中有两种方式提供对外的接口,一种是 exports.MyModule = ...,一种是使用 return 进行返回。ui

AMD

AMD 规范中,define 函数一样有一个公有属性 define.amdthis

AMD 中的参数即是这个模块的依赖。那么如何在 AMD 中提供接口呢?它是返回一个对象,这个对象就做为这个模块的接口,故咱们能够这样写:code

function MyModule() {
    // ...
}

if(typeof define === `function` && define.amd) {
    define(function() { return MyModule; });
}

总结

咱们除了提供 AMD 模块接口,CMD 模块接口,还得提供原生的 JS 接口。
因为 CMDAMD 均可以使用 return 来定义对外接口,故能够合并成一句代码。对象

一个直接能够用的代码以下:接口

;(function(){
    function MyModule() {
        // ...
    }
    
    var moduleName = MyModule;
    if (typeof module !== 'undefined' && typeof exports === 'object') {
        module.exports = moduleName;
    } else if (typeof define === 'function' && (define.amd || define.cmd)) {
        define(function() { return moduleName; });
    } else {
        this.moduleName = moduleName;
    }
}).call(this || (typeof window !== 'undefined' ? window : global);
相关文章
相关标签/搜索