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

  • 相关阅读:
    [译] 我最终是怎么玩转了 Vue 的作用域插槽
    通俗易懂的Git使用入门教程
    JS取出两个数组的不同或相同元素
    jQuery中四种事件监听的区别
    vuex里mapState,mapGetters使用详解
    php 获取时间今天明天昨天时间戳
    Linux crontab定时执行任务
    php返回json数据函数实例_php技巧_脚本之家
    mysql查看表结构命令
    Mysql命令大全
  • 原文地址:https://www.cnblogs.com/xjy20170907/p/12753635.html
Copyright © 2011-2022 走看看