降低代码耦合度, 功能模块之间不会互相影响, 优点:
好的模块封装应该是高度独立的,任何一个模块的加入或移除不会对已有的模块功能造成影响,为了良好的解耦,模块化需要关注以下几点:
模块化最初是由 CommonJS 发展起来的,而后分化出 AMD 和 CMD,UMD 的出现实现了服务端和浏览器端的统一,ES2015 将模块化写入 js 标准,使得模块化成为标准。而 webpack 的出现使得模块化不仅仅是 js 层面的东西,它提倡一切皆模块,css 甚至图片也加入了模块化的领域。
早期js的模块化有以下几种方式
也就是jQuery的设计方式:通过将全局变量传入匿名函数的方式进行放大。
|
|
以上两种方式的模块化都需要直接或者间接地依赖全局变量,就算模块化的架构经过深思熟虑,设计了各种冲突策略,也难以改变全局污染的事实,除此之外,随着项目复杂性的增加,全面变量将变得越来越大,越来越难以维护。
一年一个版本的迭代不是吹的,随着 ES2015 的落地,模块化也开始有约可寻。ES Module 为开发者们提供了 class 写法的 js 模块开发方式,将模块内变量限制与外部方法隔离,虽然只是个语法糖,但是对于后端转型的开发以及面向对象的开发者们简直不能太友好。
ES2015 的优点:
关于模块,可以参照 模块 Modules - InfoQ
|
|
CMD 规范中不使用 id 和 deps 参数, 只保留 factory 。(也可以带上 id 和 deps , 但是不属于规范)
用法:
define(function(require, exports, module){});
require(“xxx”);
require.async(“xxx”, cb); (注意,如果要完全改写模块接口,则需要使用module.exports={});
|
|
AMD 是在发现 CommonJS 的局限性之后产生的一种解决方案,这种方案要求所有的依赖都要在 require 的时候写好,回调函数的参数则是各个被引用模块的引用。在引入新模块时,被引用模块会预先下载并执行,然后才会执行回调函数中的逻辑,那么问题来了:
好,AMD 支持在用到的时候 require, 比如这样:
b.js 确实是要等到 click 事件触发才会去下载然后执行,好了,网络爆炸,b 根本下不下来,button 点到死没用。
参考