ES6 模块与 CommonJS 模块的差异

1.CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。2.CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。请看下面这个模块文件lib.js的例子。

// lib.js
var counter = 3;
function incCounter() { counter++;
}
module.exports = { counter: counter,   incCounter: incCounter,
};

上面代码输出内部变量counter和改写这个变量的内部方法incCounter。然后,在main.js里面加载这个模块。

// main.js
var mod = require('./lib');  console.log(mod.counter);  // 3
mod.incCounter();
console.log(mod.counter); // 3

上面代码说明,lib.js模块加载以后,它的内部变化就影响不到输出的mod.counter了。这是因为mod.counter是一个原始类型的值,会被缓存。除非写成一个函数,才能得到内部变动后的值。

ES6 模块的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。

换句话说,ES6 的import有点像 Unix 系统的“符号连接”,原始值变了,import加载的值也会跟着变。因此,ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块(动态绑定)。

第二个差异是因为 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。

// 不能这样写
const flag = true
if (flag) { import $ from 'jquery'
}
// 但是可以这样写
if (flag) { const $ = require('jquery')
}

为什么ES模块比CommonJS更好?

ES模块是官方标准,也是JavaScript语言明确的发展方向,而CommonJS模块是一种特殊的传统格式,在ES模块被提出之前做为暂时的解决方案。ES模块允许进行静态分析,从而实现像 tree-shaking 的优化,并提供诸如循环引用和动态绑定等高级功能。

什么是 ‘tree-shaking’?

Tree-shaking, 也被称为 "live code inclusion," 它是清除实际上并没有在给定项目中使用的代码的过程,但是它可以更加高效。

为什么ES模块比CommonJS更好?相关推荐

  1. 漫画:深入浅出 ES 模块

    翻译自:ES modules: A cartoon deep-dive (https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-div ...

  2. [译] 漫画:深入浅出 ES 模块

    原文地址:ES modules: A cartoon deep-dive 原文作者:Lin Clark 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:st ...

  3. ES Module 和 CommonJS

    一.前言 早期的 JavaScript 作为一种脚本语言,其产生的目的只是为了简单的表单验证或动画实现. 并且不需要分离多个 js 文件来写,功能相对简单.只需要内嵌一个 script 标签即可. a ...

  4. Nodejs模块、自定义模块、CommonJs的概念和使用

    场景 CommonJs JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器.然而, JavaScript 标准定义的API 是为了构建基于浏览器的应用程序.并没有制定一个用于更广泛 ...

  5. ES6模块与commonJS模块的差异

    参考: 前端模块化 ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,旨在成为浏览器和服务器通用的模块解决方案. 其模块功能主要由两个命令构成:export和import.export命 ...

  6. 模块化:ES Module与commonJS

    模块化以及模块化开发: 模块化开发的目的是将程序划分成一个个小的结构,这个结构有属于自己的代码逻辑,有自己的作用域,不会影响到其他的结构,这个结构希望暴露的变量,函数,对象给其他结构使用,也可以通过某 ...

  7. 了解一下ES module 和 Commonjs

    最近测试了几个 ES module 和 Commonjs 的例子,理解了之前不太理解的概念,记录一下.要是想多了解的可以去看看阮老师的 Module 那部分.会贴一小部分的代码,不会贴所有验证的代码. ...

  8. ES module和commonJS循环引用问题

    ES module和commonJS在对于循环引用模块的问题上处理方式不太相同,这是因为它们链接模块的机制不同,具体参考文章: 文章地址: ES module和commonJS循环引用问题

  9. ES Module 和 CommonJS 学习笔记(二) —— NodeJS 中使用 ESM 和 CJS

    在 NodeJS 中使用 ES6 模块 当前较新版本的 NodeJS 支持 ESM 和 CJS ,但默认使用的是 CJS 规范去解析 JS 代码,直接使用 CJS 是没有任何问题的,而使用 ESM 需 ...

最新文章

  1. LeetCode实战:不同路径
  2. 一些比较好的设计网站的收藏
  3. 分布式调用跟踪系统的设计和应用
  4. SpringBoot中对thymeleaf的时间进行格式化显示
  5. C++ 双向链表的建立与遍历
  6. Codeforces Round #715 (Div. 2) D. Binary Literature 构造
  7. 关于orm传递ctx的一点理解
  8. 2句搞定 DataGridView 让选中行在可视范围内
  9. python 强类型 弱类型_强类型、弱类型
  10. C#文件夹操作-Directory类
  11. 手机照片局部放大镜_手机摄影,竟然有3种对焦方式,想拍出专业水准,你必须了解...
  12. android 文件上传工具类,Android快速开发架构PlanA(五),文件上传下载了解一下...
  13. Python 进阶 —— x = x+1 vs x += 1
  14. socket简介 - 获取简单网页内容
  15. Spring源码之bean的销毁registerDisposableBeanIfNecessary方法解读
  16. 电子电路仿真软件中文版_一个电子工程师的自我修养
  17. 微信小程序发布流程(上传审核)
  18. APUD命令详解 3GPP USIM 卡文件
  19. Caused by java.lang.Exception Failed to send data to Kafka Expiring
  20. uniapp 小程序用高德地图sdk

热门文章

  1. 它估值 25 亿!被马云领投,是华为“老战友”,网友:也许股价能超茅台!
  2. 雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条...
  3. 28 岁裸辞转行程序员,一年的心路历程大曝光
  4. 从「蒸汽时代」到「高铁时代」,SUNMI DevOps 转型之路 | 原力计划
  5. 政企上云正当时,华为云12.12大促助力中小企业数字转型升级
  6. 神经网络中的分类器该如何改成生成器?
  7. 在C语言中如何高效地复制和连接字符串?
  8. 爆红的变老神器 FaceApp,夹杂着安全隐患?
  9. 腾讯、阿里能像 Facebook 一样发币吗?
  10. 中国计算机学会暂停与IEEE合作;百度接连五位高管离职;所有版本 Docker 被爆严重漏洞!| 极客头条...