为什么ES模块比CommonJS更好?
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更好?相关推荐
- 漫画:深入浅出 ES 模块
翻译自:ES modules: A cartoon deep-dive (https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-div ...
- [译] 漫画:深入浅出 ES 模块
原文地址:ES modules: A cartoon deep-dive 原文作者:Lin Clark 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:st ...
- ES Module 和 CommonJS
一.前言 早期的 JavaScript 作为一种脚本语言,其产生的目的只是为了简单的表单验证或动画实现. 并且不需要分离多个 js 文件来写,功能相对简单.只需要内嵌一个 script 标签即可. a ...
- Nodejs模块、自定义模块、CommonJs的概念和使用
场景 CommonJs JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器.然而, JavaScript 标准定义的API 是为了构建基于浏览器的应用程序.并没有制定一个用于更广泛 ...
- ES6模块与commonJS模块的差异
参考: 前端模块化 ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,旨在成为浏览器和服务器通用的模块解决方案. 其模块功能主要由两个命令构成:export和import.export命 ...
- 模块化:ES Module与commonJS
模块化以及模块化开发: 模块化开发的目的是将程序划分成一个个小的结构,这个结构有属于自己的代码逻辑,有自己的作用域,不会影响到其他的结构,这个结构希望暴露的变量,函数,对象给其他结构使用,也可以通过某 ...
- 了解一下ES module 和 Commonjs
最近测试了几个 ES module 和 Commonjs 的例子,理解了之前不太理解的概念,记录一下.要是想多了解的可以去看看阮老师的 Module 那部分.会贴一小部分的代码,不会贴所有验证的代码. ...
- ES module和commonJS循环引用问题
ES module和commonJS在对于循环引用模块的问题上处理方式不太相同,这是因为它们链接模块的机制不同,具体参考文章: 文章地址: ES module和commonJS循环引用问题
- ES Module 和 CommonJS 学习笔记(二) —— NodeJS 中使用 ESM 和 CJS
在 NodeJS 中使用 ES6 模块 当前较新版本的 NodeJS 支持 ESM 和 CJS ,但默认使用的是 CJS 规范去解析 JS 代码,直接使用 CJS 是没有任何问题的,而使用 ESM 需 ...
最新文章
- LeetCode实战:不同路径
- 一些比较好的设计网站的收藏
- 分布式调用跟踪系统的设计和应用
- SpringBoot中对thymeleaf的时间进行格式化显示
- C++ 双向链表的建立与遍历
- Codeforces Round #715 (Div. 2) D. Binary Literature 构造
- 关于orm传递ctx的一点理解
- 2句搞定 DataGridView 让选中行在可视范围内
- python 强类型 弱类型_强类型、弱类型
- C#文件夹操作-Directory类
- 手机照片局部放大镜_手机摄影,竟然有3种对焦方式,想拍出专业水准,你必须了解...
- android 文件上传工具类,Android快速开发架构PlanA(五),文件上传下载了解一下...
- Python 进阶 —— x = x+1 vs x += 1
- socket简介 - 获取简单网页内容
- Spring源码之bean的销毁registerDisposableBeanIfNecessary方法解读
- 电子电路仿真软件中文版_一个电子工程师的自我修养
- 微信小程序发布流程(上传审核)
- APUD命令详解 3GPP USIM 卡文件
- Caused by java.lang.Exception Failed to send data to Kafka Expiring
- uniapp 小程序用高德地图sdk
热门文章
- 它估值 25 亿!被马云领投,是华为“老战友”,网友:也许股价能超茅台!
- 雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条...
- 28 岁裸辞转行程序员,一年的心路历程大曝光
- 从「蒸汽时代」到「高铁时代」,SUNMI DevOps 转型之路 | 原力计划
- 政企上云正当时,华为云12.12大促助力中小企业数字转型升级
- 神经网络中的分类器该如何改成生成器?
- 在C语言中如何高效地复制和连接字符串?
- 爆红的变老神器 FaceApp,夹杂着安全隐患?
- 腾讯、阿里能像 Facebook 一样发币吗?
- 中国计算机学会暂停与IEEE合作;百度接连五位高管离职;所有版本 Docker 被爆严重漏洞!| 极客头条...