You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
//name.js
var name = 'William';
setTimeout(() => name = 'Yvette', 200);
export { name };
//index.js
import { name } from './name';
console.log(name); //William
setTimeout(() => console.log(name), 300); //Yvette
The text was updated successfully, but these errors were encountered:
前言
es6:
import / export
commonjs:
require / module.exports / exports
amd:
require / defined
Commond、AMD、CMD的区别
CommonJS规范
Node 应用由模块组成,采用 CommonJS 模块规范。
CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。
上面代码通过
module.exports
输出变量x
和函数addX
。require
方法用于加载模块。AMD、CMD规范
CommonJS规范加载模块是
同步
的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步
加载模块,允许指定回调函数。由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。AMD规范使用define方法定义模块,下面就是一个例子:
define 函数:
define 函数具有异步性,其首先会异步加载第二个参数中列出的依赖模块,当所有的模块被加载后,执行第三个参数的回调函数。
AMD:速度快、预先加载所有的依赖,直到使用的时候才执行,与CMD相比推荐此法。
CMD:只有真正需要才加载依赖、直到使用的时候才定义依赖。
AMD规范允许输出的模块兼容CommonJS规范,这时
define
方法需要写成下面这样:ES6 模块
require/exports
规范是 JavaScript 社区中的开发者自己草拟的规则,得到了大家的承认或者广泛的应用。比如CommonJS
、AMD
、CMD
等等。import/export
则是名门正派。TC39 制定的新的 ECMAScript 版本,即 ES6(ES2015)中包含进来。Node.js 无法直接兼容 ES6。所以现阶段 require/exports 任然是必要且实必须的,所以,目前编写的
import/export
最终都是编译为require/exports
来执行的。CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。如:
对比 ES6 模块看一下:
ES6 模块的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令 import ,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。
The text was updated successfully, but these errors were encountered: