CommonJS在运行时才能却确定输入和输出的变量和依赖关系,而es6则是在编译时就能确定。
let { stat } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
上面代码的是指是整体加载fs模块(加载fs所有方法)生成一个对象后再从这个对象读取的方法。这种加载称为‘运行时加载’,因为只有在运行时,才能确定一个变量。
ES6
import { stat } from 'fs';
上面代码的实质是从fs模块加载stat方法,而不加载其他方法。这种加载称为‘编译时加载’或静态加载,在编译时即可完成加载
1.js中所有的问题都可已称为一个模块,比如a模块同时b和c多次引用,只会在首次b引用是加载,如果a中涉及到运算,只会在b引用时运算,引用时就计算,但是a导出的function,或者class,只有在调用才会使用function或者class。
2.es6 module被多个模块引用后,其中一个模块改变值,其他模块也会改变,(不推荐改变直接改变值):
(1)基本类型,可以重新赋值给其他变量后,改变其他变量的值,如果直接改变这个值会报错
(2)引用类型,不重新给引用的变量赋值,比如只改变对象的一个属性,是可以改变成功的,同时其他模块引用这个模块的地方也会改变。
3.import具有提升效果,不管在哪import的模块,都会提升到文件的最前面
4.始终记得import是在静态编译时执行的,在代码运行之前,不能使用表达式和变量
最后export 对外必须是输出的是接口
何为接口?使用import能够通过变量的引用到这个值(误解)
export 1;//是吗?很显然不是,其他模块不能获取这个值
const a = 1;
export a; // 是吗?也不是,a变量表示的就是1 也是export 1 等价