「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);
相關文章
相關標籤/搜索