最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • CommonJS 与 ES6 Module 的区别

    正文概述 掘金(一條小喇叭)   2021-06-09   286

    这两者的主要区别主要有以下两点:

    1. 对于模块的依赖,CommonJS是动态的,ES6 Module 是静态的
    2. CommonJS导入的是值的拷贝,ES6 Module导入的是值的引用

    exports和module.exports

    //首先明白
    exports === module.exports //true
    //也就是说他们指向同一个地址
    //相当于
    let module = {
      exports:{
        ...
      }
    }
    let exports = module.exports
    

    export和export default

    //export.js
    export default function App() {}
    class Clock extends React.Component {};
    const a = 1;
    export { Clock, a}
    
    //import.js
    import App, {Clock as Clock1,a} from './export.js';
    

    区别一

    对于模块的依赖,何为动态?何为静态? 动态是指对于模块的依赖关系建立在代码执行阶段; 静态是指对于模块的依赖关系建立在代码编译阶段; 上文提到,CommonJS导入时,require的路径参数是支持表达式的,例如

    // A.js
    let fileName = 'example.js'
    const bModule = require('./' + fileName)
    

    因为该路径在代码执行时是可以动态改变的,所以如果在代码编译阶段就建立各个模块的依赖关系,那么一定是不准确的,只有在代码运行了以后,才可以真正确认模块的依赖关系,因此说CommonJS是动态的。 那么现在你也应该也知道为什么 ES6 Module 是静态的了吧

    区别二

    为了验证这一点,我准备用实例来演示一下 首先来验证CommonJS,代码如下

    // B.js
    let count = 3
    function change() {
        count ++    // 变量count + 1
        console.log('原count值为:', count);  // 打印B.js模块中count的值
    }
    module.exports = {
        count,
        change
    }
    // A.js
    let count = require('./B.js').count 
    let change = require('./B.js').change
    console.log('改变前:', count);   
    change()     // 调用模块B.js中的change方法,将原来的count + 1
    console.log('改变后:', count); 
    // 运行A.js文件的结果
    改变前:3
    原count值为:4
    改变后:3
    

    在上述代码中我们可以看到,在A.js文件中导入了B.js文件中的变量count和 函数change,因为导入的count只是对原有值的一个拷贝,因此尽管我们调用了函数change改变了B.js文件中变量count的值,也不会影响到A.js文件中的变量count 根据这个结果得出结论:CommonJS导入的变量是对原值的拷贝 接下来再来验证一下ES6 Module,代码如下

    // B.js
    let count = 3
    function change() {
        count ++        // 变量count + 1
        console.log(count);   // 打印B.js模块中count的值
    }
    export {count, change}
    // A.js
    import {count, change} from './B.js';
    console.log('改变前:',count);
    change()         // 调用模块B.js中的change方法,将原来的count + 1
    console.log('改变后:', count);
    // 运行A.js文件的结果
    改变前:3
    原count值为:4
    改变后:4
    

    相比较于CommonJS的结果,ES6 Module导入的变量count随着原值的改变而改变了 根据这个结果得出结论:ES6 Module导入的变量是对原值的引用


    起源地下载网 » CommonJS 与 ES6 Module 的区别

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元