为什么要模块化,如何定义一个amdcmd的模块

JavaScript022

为什么要模块化,如何定义一个amdcmd的模块,第1张

模块化更一种开发规范,比如cmd amd 是为了更好的解藕,比如一个网站,按照不同的模块来开发,比如你有个评论区,a 项目有,b 项目有,如果仅是单纯的模块开发,这个js 文件你就可以单独来回引用,

更比如 ,一个页面 分好多个功能, 这时候你要是都写在一个js 中 会越来越大,

而你把他分成不同的模块,

比如评论是一块

分页又是一块,

已经上线,或你不做了,后期别人拉手,或你接手别人的项目, 这时候来个需求让你把分页去掉,或修改 你可以清楚的找到对应模块文件 进行修改 或去掉

模块是自定义的,

组件,更想当于一个通用的东西,有的分功能组件,有的分业务组件

大图切换,这种就是单纯的一个效果展示,只要调用就ok

一个分页,也是只单纯的调用,

组件更是一个多处都可以使用 ,不需要再单独开发的

最明显的区别就是在模块定义时对依赖的处理不同

1、AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块

2、CMD推崇就近依赖,只有在用到某个模块的时候再去require

这种区别各有优劣,只是语法上的差距,而且requireJS和SeaJS都支持对方的写法

AMD和CMD最大的区别是对依赖模块的执行时机处理不同,注意不是加载的时机或者方式不同

很多人说requireJS是异步加载模块,SeaJS是同步加载模块,这么理解实际上是不准确的,其实加载模块都是异步的,只不过AMD依赖前置,js可以方便知道依赖模块是谁,立即加载,而CMD就近依赖,需要使用把模块变为字符串解析一遍才知道依赖了那些模块,这也是很多人诟病CMD的一点,牺牲性能来带来开发的便利性,实际上解析模块用的时间短到可以忽略。

CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。 类似的还有 CommonJS Modules/2.0 规范,是 BravoJS 在推广过程中对模块定义的规范化产出。 还有不少6868 这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的。 目前这些规范的实现都能达成浏览器端模块化开发的目的。 区别: 1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible. 2. CMD 推崇依赖就近,AMD 推崇依赖前置。

1、从官方推荐的写法上面得出:

CMD ----- 依赖就近

Js代码

//CMD

define(function(require,exports,module){

var a = require('./a')

a.doSomthing()

})

AMD ----- 依赖前置

Js代码

//AMD

define(['./a','./b'],function(a,b){

//......

a.doSomthing()

//......

b.doSomthing()

})

当然AMD也支持CMD的写法。

2、执行顺序上:

CMD是延迟执行

推崇的是as lazy as possible

AMD是提前执行

requireJS从2.0开始可以延迟执行

3、api设计角度:

CMD的API推崇职责单一,没有全局的require

AMD的API默认是一个当多个用:比如require有全局的和局部的