CommonJs、AMD、CMD、ESModule介绍

CommonJs

CommonJs规范介绍

  • NodeJs默认模块化规范,每个文件是一个模块,有自己的作用域
  • CommonJs规范采用同步加载方式
  • 通过require加载模块,module.exports和exports输出模块

CommonJs规范特点

  • 所有代码都运行在模块作用域,不会污染全局作用域
  • 模块可以加载多次,第一次加载时会运行模块,模块输出结果会被缓存,再次加载时,会从缓存结果中直接读取模块输出结果
  • 模块按出现顺序加载

browserify打包原理

  • 通过自执行函数实现模块化
  • 将每个模块编号,存入一个对象,每个模块标记依赖模块
  • 实现了require方法,核心是通过call方法调用模块,并传入requrie、module、exports方法,通过module存储模块信息,通过exports存储模块输出信息

AMD(针对CommonJs同步加载方式)

AMD规范介绍

  • AMD规范采用异步加载模块,允许指定回调函数
  • Node模块加载速度快,所以适用于同步加载
  • 浏览器环境下,模块需要请求获取,所以适用于异步加载
  • requireJs是AMD的一个具体实现库

CMD

CMD规范介绍

  • CMD整合了CommonJs和AMD的优点,模块加载是异步的
  • CMD专门用于浏览器端,seaJS是CMD规范的一个实现
  • AMD和CMD最大的问题是没有通过语法升级解决模块化

AMD和CMD目前开发过程中很少使用了,主要使用CommonJs和ESModule

ESModule(目前应用最为广泛的模块化规范)

** ESModule规范介绍**

  • ESModule设计理念是希望在编译时就确定模块依赖关系及输入输出
  • CommonJs和AMD必须在运行时才能确定依赖和输入输出
  • ESM通过import加载模块,通过export输出模块

模块化开发,如果使用浏览器默认标准:
所有依赖的模块文件需要单独引入
所有的依赖需要加上.js后缀

CommonJs和ESModule规范对比

  1. CommonJs输出的是值的拷贝,ESM输出的是值的引用
  2. CJs模块是运行时加载,ESM是编译时输出接口
  3. CJs是单个值导出,ESM可以导出多个
  4. CJS模块是同步加载,ESM支持异步加载
  5. CJS的this指向当前模块的module.exports,ESM的this指向undefined
  6. 语法不同

NodeJs 14后默认支持ESM

脚本和模块的对比

  • 模块具备更高的开发效率(可读性强、复用高效)
  • 脚本具有更高的页面性能(模块文件多,加载速度慢)
  • 模块在浏览器中运行会存在兼容性问题

浏览器模块化的局限

  • 缺乏模块管理能力,模块分散在各个项目中
  • 性能加载慢,无法大型项目中直接使用
  • 以上两个问题是npm和webpack核心解决的问题

npm解决模块化项目之间不能复用的问题
webpack解决页面性能问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值