Commonjs、Amd、Cmd、Umd、EsMoudle

nodejs出现之前,没有过于复杂的开发场景,所以是没有模块化的,后端才有。在nodejs之后就开始了commonjs的规范。

Commonjs

一个文件就是一个模块,拥有单独的作用域,不会污染全局作用域;
通过module.exports或者exports来暴露;
通过require来加载模块;
moudle.exports会覆盖exports
可多次加载,但是只会第一次运行时加载,后面加载的都是缓存

暴露模块:moudule.exports = value; exports.xxx = value;
引入模块:const xxx = require('xxx')

commonjs用同步的方式加载模块。在服务端,模块文件都存放于本地磁盘,所以读取非常快。但是在服务端,由于网络的问题,应该用异步加载更合理。

AMD

AMD采用的是异步加载模块的方式,是一个浏览器端模块化的规范,需要用到require.js。所有这个模块的语句都定义在一个回调函数中,等到加载完成之后,这个回调函数才会执行。

用require.config()指定引用路径。用define()来定义模块用require来加载模块

// 执行基本操作
define('moduleName',['aa','bb'],function(ma, mb) {
    return xxx;
})

require(['aa', 'bb'], function(ma, mb) {
  // do something
 })

主要解决的问题 1.js文件多的时候可能会有依赖关系,而被依赖的文件需要优先加载
2.同步加载文件越多,页面失去响应时间越长

CMD

CMD是另一种模块化方案,它和AMD很类似,不同点在于:AMD推崇依赖前置,提前执行,而CMD推崇依赖就近,延迟执行,这个规范其实就是sea.js推广过程产生的。

UMD

一个整合了commonJS和AMD规范的方法。希望能解决跨平台模块的解决方案。
运行的原理:
UMD会先判断是否支持Node.js的模块(export)是不是存在。存在则使用node.js的模块方式。
再判断是不是支持AMD(define是不是存在。存在则使用AMD方式加载模块。

ESModule

实现了模块化功能,主要由两个命令构成:export和import。es6还提供了export default的命令

export xxx
export default {xx}

import {xxx} from 'xxx' //export
import xx from 'xx' //export default

总结

1.commonjs主要针对服务端,amd、cmd和esmodule主要针对浏览器端
2.amd和cmd都是异步加载,但是amd是预加载(加载某个模块前,会先将依赖模块加载完成),cmd则是懒加载,虽然一开始就异步加载好js文件,但是不会执行,而在需要的时候才执行
3.amd虽然是异步加载,但是加载顺序不一定,会导致出现一些问题。cmd只有在使用的时候才执行js,所以是可控的,但是js执行是同步的,所以在执行大文件的时候等待时间会很长
4.umd是amd和commonjs的糅合
5.ES6模块是动态引入的,并不会缓存值。
6.commonjs模块是对象,运行时加载,运行时才把整个模块挂载到export中。esmoudle不是对象,编译时加载,遇到import就会生成一个只读引用,等到运行时根据引用去加载取值,不会加载整个模块,仅取所需
7.commonjs是一个值的拷贝,esmoudle是值的引用

你可能感兴趣的:(javascript,前端,开发语言)