JS模块化(cmd)

2019-02-11  本文已影响0人  原来哥哥是万家灯火

AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
cmd规范和amd规范基本类似,先总结seajs的用法,再回头看两者的些许区别。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script src="js/sea.js"></script>
<script>
    seajs.config({
        alias: {
            "jquery": "jquery/jquery/1.10.1/jquery.js"
        }
    });

    // 加载入口模块
    seajs.use("./js/app");
</script>
</body>
</html>

define() 方法

定义模块
define方法可以传入一个函数作为参数,在函数中书写业务并暴露出本模块的参数,如果不需要,也可以不对外暴露参数。

// add.js

define(function (require, exports, module) {
    // require可用来加载依赖,exports和module可用来暴露模块参数,
    // 与commonjs一样,不能直接exports = ...,这会修改exports原来的指向
    module.exports = function (a, b) {
        return a + b;
    }
});

也可以直接传入你要暴露的参数,如:

// add.js

define(5555);
// define('床前明月光');
// define({ name: '赵绪琦'});

相当于:

define(function (require, exports, module) {
    module.exports = 5555;
});

require()方法

加载模块
seajs并没有专门提供一个可以直接调用的require方法,而是在define的函数中作为参数提供

define(function(require, exports, module) {
    let add = require('./add');
    console.log(add);
    
    // let oneModule = require('oneModule');
    // oneModule.doSomething()

    let poem = require.async('./poem', function () {
        console.log(poem);
    })
});

注意到上面例子中并没有像RequireJs一样,直接把需要加载的模块在一开始就写进define方法的参数中去,而是在函数内部执行require方法去加载。官方说的依赖就近应该意思是依赖就近书写:我的理解是在实际需要用到某模块是就近加载它。我想可能包含两层意思:

*打个比方:两个人修自行车。

而且cmd是拿来了螺丝刀就马上做螺丝刀的事,拿来了扳手就马上做扳手的事。这句话的意思是:

var a  = require('a');
a.doSomething();

var b  = require('b');
b.doSomething();

而不是:

var a  = require('a');
var b  = require('b');

a.doSomething();
b.doSomething();

区别

开发者的回答:

config的配置项,

只要不用seajs的话,没必要深究了,大概了解cmd就行

上一篇 下一篇

猜你喜欢

热点阅读