1.ES6 Module

javascript在ES2015(ES6)中出现了语言层面的模块(module)。

ES6的模块既可以用于浏览器端,也可以用于服务器端(nodeJS)。

ES6模块是静态化的模块加载,可以实现静态优化,在编译时就可以分析确认模块的依赖和输入输出变量。

webpack中TreeShaking的实现就是依赖于该性质。

而AMD和CommonJS是在运行时才能确认这些东西。

2. AMD

在此之前,浏览器端使用的模块加载方案主要是AMD,基于require.js;

AMD和CMD其实都是浏览器端的异步模块加载规范;

AMD是RequireJS输出的规范;CMD是seaJS输出的规范;

用法

// 1. 想在页面中使用AMD加载模块,需要手动引入require.js
<script src="https://cdn.bootcss.com/require.js/2.3.6/require.js" data-main="main.js" defer async="true"></script>
// 2. 每一个文件是一个模块,AMD要求模块使用define()定义模块
// test.js 模块
define(['jquery'], function(){ // 前面的数组表示依赖的模块
return function test() {
console.log(test);
}
})
// 3. 在main.js中引入test.js
require(['tset'], function(test) {
test()
})

3.CommonJS

ES6之前,服务器端(nodeJS)是CommonJS规范。

09年,nodejs项目是使用CommonJS规范实现的模块系统。

有一个全局的require()方法。

// 返回结果就是模块名字
// CommonJS里面的require用法和AMD里面的require用法不一致
let {readFile} = require('fs');

导出是module.exports = {}

⚠️: CommonJS输出的值是缓存,不是实时数据。但是ES6的export命令导出的是接口,可以访问模块的实时数据。

CommonJS第一次require,就会执行整个脚本,并在内存中生成一个对象(缓存):

{
id: 'xxx', //模块名,
exports: {...}, //输出的拷贝
loaded: true/false // 加载是否完成
...
}

以后再require该模块,直接到缓存中取exports对象的值。

即无论执行加载多少次,返回的都是第一次加载时返回的值。可以手动清空缓存,清除之前的运行结果。

4. UMD

通用模块化系统,兼容AMD和CommonJS;

通常以AMD为基础,然后再包裹一层特殊代码实现CommonJS的兼容性。

快速了解AMD、CMD、CommonJS、ESM的更多相关文章

  1. js模块系统 - amd|cmd|commonjs|esm|umd

    写过前端代码大概率听说过amd cmd umd commonjs esm这些名词, 想当初我第一次看到这些的时候, 人都麻了, 都是些啥啊. 后来我知道了, 这些都是js的模块规范. amd - 浏览 ...

  2. AMD/CMD/CommonJs到底是什么?它们有什么区别?

    知识点1:AMD/CMD/CommonJs是JS模块化开发的标准,目前对应的实现是RequireJs/SeaJs/nodeJs.   知识点2:CommonJs主要针对服务端,AMD/CMD主要针对浏 ...

  3. FW: AMD, CMD, CommonJS和UMD

    javascript 我是豆腐不是渣 4月5日发布 推荐 2 推荐 收藏 32 收藏,486 浏览 今天由于项目中引入的echarts的文件太大,requirejs经常加载超时,不得不分开来加载ech ...

  4. AMD, CMD, CommonJS和UMD

    我的Github(https://github.com/tonyzheng1990/tonyzheng1990.github.io/issues),欢迎star 今天由于项目中引入的echarts的文 ...

  5. AMD,CMD.CommonJs和UMD还有es6的模块化对比

    CommonJS CommonJS是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行, ...

  6. JS模块之AMD, CMD, CommonJS、UMD和ES6模块

    CommonJS 传送门 同步加载,适合服务器开发,node实现了commonJS.module.exports和require 判断commonJS环境的方式是(参考jquery源码): if ( ...

  7. 把自己的js模块兼容到AMD CMD CommonJS

    为了让同一个模块可以运行在前后端,在写作过程中需要考虑兼容前端也实现了模块规范的环境.为了保持前后端的一致性,类库开发者需要将类库代码包装在一个闭包内.以下代码演示如何将hello()方法定义到不同的 ...

  8. 深度扫盲JavaScript的模块化(AMD , CMD , CommonJs 和 ES6)

    原文地址 https://blog.csdn.net/haochangdi123/article/details/80408874 一.commonJS 1.内存情况 对于基本数据类型,属于复制.即会 ...

  9. AMD CMD commonJS es6

    看到很多人傻傻的分不清楚 AMD.CMD . commonJS . es6的区别,实际上这跟这几年前段技术的发展有很大的关系. 实际上这是JavaScript的模块化思想演进的一个过程. 最开始的时候 ...

  10. js模块化开发 AMD CMD Commonjs

    在es6全面实行开来之前  js实现模块开发方案有: 1.AMD 异步模块开发定义  依赖前置,requireJs应用了这一规范 require([module], callback); 加载完后回调 ...

随机推荐

  1. 四、poll()、select()和epoll()

    在用户程序中,poll()和select()系统调用用于对设备进行无阻塞访问.poll()和select()最终会调用设备驱动中的poll()函数,在我所使用的Linux内核中,还有扩展的poll() ...

  2. sysbench安装和测试

    1.首先安装依赖 yum install mariadb-devel yum install automake libtool –y 2.下载安装包 wget https://github.com/a ...

  3. mysql常见内置函数

    在mysql中有许多内置的函数,虽然功能都能在PHP代码中实现,但巧妙的应用mysql内置函数可以大大的简化开发过程,提高效率. 在这里我总结一下一些常用的,方便以后查看: mysql字符串函数: c ...

  4. hdu 5900 区间dp

    题意:给你n对pair 里面有两个值,分别是key 和 val .你可以取相邻的两个pair 获得其中的val,前提是两个pair 的key 的 gcd 不为 1.当然你把相邻的两个取走了之后原本不相 ...

  5. jvm类加载原理和类加载器介绍

    虚拟机的类加载机制 在Class文件中描述的各种信息最终都需要加载到虚拟机中之后才能运行和使用.   虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被 ...

  6. eclipse设置各种编码

    https://blog.csdn.net/qq_32786873/article/details/81910022

  7. 【前端】安装wampserver提示丢失MSVCR100.dll的解决方法

    先装Visual C++,再装wampserver 下载的时候请注意选择对应的32bit还是64bit的.然后安装. 再安装wamp

  8. Linux Jetbrains Datagrip 图标找不到

    问题 系统版本:Ubuntu 18.04,Datagrip版本:2019.2 从官网下载的 tar.gz 解压之后,找到 datagrip.sh 就可以使用了.但是有个问题,它没有自动创建快捷方式,所 ...

  9. 如何让某些用户对Marketing Cloud的contact数据只能实施只读操作

    打开maintain business role这个应用: 创建一个新的business role,然后添加下列这几个catalogs: SAP_CEC_BC_MKT_ADM_PC Marketing ...

  10. 让你在上司眼里“更靠谱”的六个建议

    "勇于创新"是职场一大谎言 晋升选择题 你有两个下属,你想从他们中挑一个升职,你觉得哪一个更适合? 员工A: 优点:奉行"80%的精力维护20%的重要客户"的原 ...