zoukankan      html  css  js  c++  java
  • commonjs module和es6 module

    CommonJS与ES6 Module最本质的区别在于CommonJS对模块依赖的解决是“动态的”而ES6 Module是“静态的”;

    即commonjs是运行时加载模块,ES6是在静态编译期间就确定模块的依赖;

    ES6在编译期间会将所有import提升到顶部,commonjs不会提升require;

    两者的模块导入导出语法不同,commonjs是module.exports,exports导出,require导入;ES6则是export导出,import导入;

    commonjs导出的是一个值拷贝,会对加载结果进行缓存,一旦内部再修改这个值,则不会同步到外部。ES6是导出的一个引用,内部修改可以同步到外部;

    CommonJS

    1. 对于基本数据类型,属于复制。即会被模块缓存。同时,在另一个模块可以对该模块输出的变量重新赋值。
    2. 对于复杂数据类型,属于浅拷贝。由于两个模块引用的对象指向同一个内存空间,因此对该模块的值做修改时会影响另一个模块。
    3. 当使用require命令加载某个模块时,就会运行整个模块的代码。
    4. 当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。
    5. 循环加载时,属于加载时执行。即脚本代码在require的时候,就会全部执行。一旦出现某个模块被"循环加载",就只输出已经执行的部分,还未执行的部分不会输出。

    ES6模块

    1. ES6模块中的值属于【动态只读引用】。
    2. 对于只读来说,即不允许修改引入变量的值,import的变量是只读的,不论是基本数据类型还是复杂数据类型。当模块遇到import命令时,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。
    3. 对于动态来说,原始值发生变化,import加载的值也会发生变化。不论是基本数据类型还是复杂数据类型。
    4. 循环加载时,ES6模块是动态引用。只要两个模块之间存在某个引用,代码就能够执行。
    // common.js
    B文件
    //calculator.js
    module.exports={name:"calculator"};
    
    A文件
    //index.js
    const name=require('./calculator.js').name;
    // es6 module
    //calculator.js
    export const name='calculator';
    
    //index.js
    import {name} from './calculator.js';

     原文:https://www.cnblogs.com/unclekeith/archive/2017/10/17/7679503.html

  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/xjy20170907/p/12753635.html
Copyright © 2011-2022 走看看