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. 【动态规划】Überwatch

    Überwatch 题目描述 The lectures are over, the assignments complete and even those pesky teaching assista ...

  2. 2019杭电多校一 L. Sequence (NTT)

    大意: 给定序列$a$, 给定$m$个操作, 求最后序列每一项的值. 一共$3$种操作, 其中第$k$种操作将序列变为$b_i=\sum\limits_{j=i-kx}a_j$, $(0\le x,1 ...

  3. jacascript CSS样式的脚本化(js)操作

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 引入CSS有3种方式:行间样式,内联样式和外部链接样式. 在实际工作中,我们使用 javascript 操 ...

  4. 16-MySQL DBA笔记-调优基础理论和工具

    第五部分 性能调优与架构篇 本篇将为读者介绍性能调优的一些背景知识和理论,然后介绍一些工具的运用,最后介绍从应用程序到操作系统.到数据库.到存储各个环节的优化. 性能调优是一个高度专业的领域,它需要一 ...

  5. (十五)Hibernate中的多表操作(5):双向多对多

    Hibernate的双向关联. 对象之间可以相互读取.        双向只针对读取的操作.对于增.删除.改的操作没有任何影响. 案例 : 实现双向多对多 MenuBean.java package ...

  6. C#强制回收垃圾

    [DllImport("psapi.dll")] private static extern int EmptyWorkingSet(int hProcess); public v ...

  7. JavaBean 详细

    一.什么是JavaBean? JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方 ...

  8. string和char*

    string转const char* string s = "hello furong."; const char *c = s.c_str(); string转char* str ...

  9. python 链接impala执行SQL

    项目中用python来链接impala数据库最常见,一个简单的链接,获取结果. #!/usr/bin/python # -*- coding:utf-8 -*- from impala.dbapi i ...

  10. lvs 中的DR模式 ,解释

    CIP即为客户端的IP地址 . DIR为调度器 . VIP为虚拟IP地址 . RIP为真实服务器IP地址 . 假设CIP的mac为A1,ip为B1:DIR只有一个物理网卡mac为A2,IP为B2:RI ...