ES6 模块与 CommonJS 模块的差异

news/2024/7/11 0:11:29 标签: CommonJs, ES6

前面我们已经对ES6的模块化规划和CommonJs的模块化规范已经介绍过了,所以今天我们主要聊聊这两种模块化的差异,如果对这两种模块化规范不是特别了解的,可以点击ES6模块化规范和CommonJs模块化规范

ES6 模块与 CommonJS 模块完全不同。它们有两个重大差异。

  • CommonJS 输出是值的拷贝,即原来模块中的值改变不会影响已经加载的该值,ES6静态分析,动态引用,输出的是值的引用,值改变,引用也改变,即原来模块中的值改变则该加载的值也改变。
  • CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
  • CommonJS 加载的是整个模块,即将所有的接口全部加载进来,ES6 可以单独加载其中的某个接口(方法),
  • CommonJS this 指向当前模块,ES6 this 指向undefined
  • CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。

  

CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。ES6 模块的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。ES6 模块不会缓存运行结果,而是动态地去被加载的模块取值,并且变量总是绑定其所在的模块。

下面看两个经典的例子对比一下

CommonJs模块化

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

console.log(mod.counter);  // 3
mod.incCounter();
console.log(mod.counter); // 3

ES6模块化

// lib.js
export let counter = 3;
export function incCounter() {
  counter++;
}

// main.js
import { counter, incCounter } from './lib';
console.log(counter); // 3
incCounter();
console.log(counter); // 4

从上面我们看出,CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。而ES6 模块是动态地去被加载的模块取值,并且变量总是绑定其所在的模块。

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

目前阶段,通过 Babel 转码,CommonJS 模块的require命令和 ES6 模块的import命令,可以写在同一个模块里面,但是最好不要这样做。因为import在静态解析阶段执行,所以它是一个模块之中最早执行的。



http://www.niftyadmin.cn/n/951984.html

相关文章

python字符串逆置_字符串逆置算法

1,输人:字符串”123456“输出:”654321“。注意:字符数组不等于字符串,只有当字符数组结尾加上结束标志’\0’,才是字符串。所以字符串用字符数组来初始化时,结尾必须加上’\0’。比如 初始化字…

常用的 MSSQL Server 数据修复命令

出处: 作者: 发布时间:2006-8-24 MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令。 1. DBCC CHECKDB 重启服务器后,在没有进行任何操作的情况下,在…

react中的属性验证

PropType导出一系列验证器,这些验证器可以用来确保接收到的数据是有效的。在验证属性之前,要先安装一个propTypes库,执行npm i -S prop-types使用之前要先引入prop-type验证属性前要先定义好一个对象,添加属性验证不要忘了将定义好…

autocad.net 画多段线_解决AutoCAD2014绘制多段线的详细教程--系统之家

AutoCAD2014如何绘制多线段?多段是由相连的直线和圆弧曲线组成的, 在直线和圆弧曲线之间可进行自由切换。用户可以设置多段线的宽度,也可以在不同的线段中设置不同的线宽。此外, 线段的始末端点也可以设置为不同的线宽。今天为了帮助大家&…

.Net PetShop 4.0的消息处理

.Net PetShop 4.0对订单的处理提供了两种方式以供选择,一种是同步处理,一种是异步处理。同步处理就不再多说了,使用普通的数据库存取方式;异步处理便是采用消息处理方式。 MSDN中介绍说利用消息队列,应用程序开发人员可…

了解什么是JSX以及它的语法

一、什么是JSX?JSX 即 JavaScript XML,是一种在 React 组件内部构建标签的类 XML 语法。JSX 并不是一门新的语言,仅仅是个语法糖(syntactic sugar),允许开发者在 JavaScript 中书写 HTML 语法。最后&#x…

python中copy函数怎么用_Python中copy和deepcopy中的区别

import copyd {name : [An,Assan]}c d.copy()dc copy.deepcopy(d)d[name] [an]print cprint dprint dc结果如下:[python] view plain copy{name: [An, Assan]}{name: [an]}{name: [An, Assan]}(2)值修改[python] view plain copyimport copyd {name : [An,Assa…

ASP.net 2.0资料吐血收藏(^_^) (转)

asp.net控件开发基础(1) GridView模版列嵌套GirdView显示主从表数据 GridView中添加一个CheckBox列 域环境中安装部署VSTS全过程 设置VSS使支持通过Internet访问 浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息&…