# ModuleJS

### 介绍
ModuleJS,一个兼容CMD、AMD、UMD规范的js模块管理。

### 安装

```
npm i silis-modulejs
```


### 文件大小
|文件名|文件大小|文件说明|
|--|--|--|
|module.min.js.zip|1.18k|js代码压缩 + zip压缩,用于网络要求更高的生产运营环境|
|module.min.js|2.4k|js代码压缩,用于生产运营时使用|
|module.js|7.3k|js源代码,用于开发测试时使用|

### 定义模块(define module)

1. 定义模块
```
define(function(){
    ...
})
```

2. 定义别名模块
```
define("myModule.js",[],function(){
    ...
})
```


### 导出模块(export module)

1. return导出模块
```
define(function(){
    return ... //返回任意数据类型的模块
})
```

2. exports导出模块

- 默认依赖exports导出模块
```
define(function(require, exports, module){
    exports.sayHello = ...
})
```

- 指定依赖exports导出模块

```
define(["exports"], function(exports){
    exports.sayHello = ...
})
```

3. module.exports导出模块

- 默认依赖module.exports导出模块
```
define(function(require, exports, module){
    module.exports = ...
})

```
- 指定依赖module.exports导出模块

```
define(["exports"], function(exports){
    module.exports = ...
})
```

4. 全局变量导出模块

```
(
    (typeof window == "object" && window) ||
    (typeof global == "object" && global)
).myModule = ... //导出任意数据类型的模块
```



### 导入模块(import module)

1. 同步导入模块

- 同步导入单个模块
```
var myModule = require("myModule.js");
```
或
```
var myModule = require("myModule.js", false);
```

- 同步导入多个模块
```
var myModule1 = require("myModule1.js");
var myModule2 = require("myModule2.js");
```
或
```
var myModule1 = require("myModule1.js", false);
var myModule2 = require("myModule2.js", false);
```

2. 异步导入模块

- 异步导入单个模块
```
require("myModule.js", function(myModule){
    ...
})
```
或
```
var myModulePromise = require("myModule.js", true);
myModulePromise.then(function(myModule){
    ...
})
```

- 异步导入多个模块
```
require(["myModule1.js"...], function(myModule1...){
    ...
})
```
或
```
var myModulesPromise = require(["myModule1.js"...], true);
myModulesPromise.then(function(modules){
    var myModule1 = modules[0];
    ...
})
```


### 依赖模块(dependent module)

1. 提前导入依赖模块
```
define(["dependentModule1.js"...], function(dependentModule1...){
    var mainModule = {
        subMudle1: dependentModule1
    };
    
    return mainModule;
})
```

2. 推后导入同步依赖模块

```
define(function(){
    var mainModule = {
        subMudle1: require("dependentModule1.js")
    };

    return mainModule;
})
```

3. 推后导入异步依赖模块
```
define(function(){
    var mainModule = {};

    return require(["dependentModule1.js"...], function(dependentModule1...){
        mainModule.dependentModule1 = dependentModule1;
        return mainModule;
    })
})
```




### AMD规范示例

> AMD规范指异步模块定义(Asynchronous Module Definition),即通过异步方式加载模块

AMD规范定义模块:

```
define(function(){

    return function(text){
        setTimeout(function(){
            document.body.innerText = text;
        }, 100);
    }

})
```
> 代码文件:/example/print-amd-module.js

```
define(["print-amd-module.js"], function(print){

    return {
        sayHello:function()
        {
            print("Hi,我的AMD规范定义的模块");
        }
    }

})
```
> 代码文件:/example/hello-amd-module.js



异步方式加载AMD规范定义的模块:

```
<html>
    <head>
        <script>
            require(["hello-amd-module.js"], function(helloAmdModule){
                helloAmdModule.sayHello();
            })
        </script>
    </head>
    <body>
        加载异步模块中...
    </body>
</html>
```
> 代码文件:/example/async-load-amd-module-exmaple.html

### CMD规范示例

> CMD规范指同步模块定义(Common Module Definition),即通过同步方式加载模块

CMD规范定义模块:

```
define(function(require, exports, module){

    module.exports = function(text){
        setTimeout(function(){
            document.body.innerText = text;
        }, 100);
    }

})
```
> 代码文件:/example/print-cmd-module.js

```
define(function(require, exports, module){
    
    exports.sayHello = function(){
        var print = require("print-cmd-module.js");
        print("Hi,我的CMD规范定义的模块");
    }

})
```
> 代码文件:/example/hello-cmd-module.js

同步方式加载CMD规范定义的模块:

```
<html>
    <head>
        <script>
            var helloAmdModule = require(["hello-cmd-module.js"]);
            helloAmdModule.sayHello();
        </script>
    </head>
    <body>
        加载异步模块中...
    </body>
</html>
```

> 代码文件:/example/sync-load-cmd-module-exmaple.html


### CMD规范示例

```
((root, factory) => {
    if (typeof define === "function" && define.amd) {
        //AMD
        define(["dependentModule1", "dependentModule2"...], factory);
    } else if (typeof exports === 'object') {
        //CommonJS
        module.exports = factory(requie("dependentModule1"), requie("dependentModule2")...);
    } else {
        root.currentModule = factory(root.dependentModule1, root.dependentModule2);
    }
})(
    (typeof window == "object" && window) || (typeof global == "object" && global), 
    (dependentModule1, dependentModule2...) => {
        //todo
    }
)
```