模块化总结笔记

96 阅读2分钟

为什么要模块化

解决命名冲突、提高可维护性、代码可读性、可复用性、减少代码冗余

早期解决方式

  • 普通函数 缺点就是依赖关系不清晰、然后多个文件中可能还是会造成命名冲突。
  • 命名空间 缺点就是对象内的属性都会暴露出来,内部状态可以被外部更改。
  • IIFE 立即执行函数,通过函数闭包特性实现私有数据和共享方法。
  • 依赖注入 主要是为了解决添加引入依赖的问题,就是一个发布订阅

CommonJs

服务端特有的模块化方式,也就是nodejs。CommonJs规定每一个文件都是一个独立的模块,有自己的作用域、变量,必须通过module.exports暴露,外部通过require引入才可以调用。

  • 模块可以多次加载,但是第一次加载后就会被缓存,想要使其重新运行必须清除缓存。
  • 模块加载的顺序就是其在代码中出现的顺序
  • 为什么他只能在服务端,因为他所有模块都是同步加载的,也就是会阻塞后续操作,在浏览器体验不好

AMD

浏览器的模块加载方式必须是异步的,而且浏览器引入文件只能通过动态创建script标签的方式,AMD规范满足这两个条件。script标签引入文件完成后会触发onload事件,只有在js文件加载完成后才能执行回调,我们可以用一个栈存储回调函数,只有依赖的模块加载完才能执行栈内的回调。

CMD

CMD和AMD的区别主要是AMD主要是依赖前置,而CMD是依赖就近。用人话说就是AMD会在代码执行前,加载所有引入的模块,不管他是否有使用到,而CMD在使用到这个模块前是不会对他进行加载的。

UMD

可以在服务端和客户端运行。

ES Module

es6新特性,export导出,import引入,在编译时就引入模块代码,而不是在运行时动态加载。

CJS和ESM的区别

  • CJS是执行时引入,ESM是编译时引入
  • 由于两者引入的区别,treeshaking只支持ESM,不支持CJS