CommonJs和ES6 Modules有什么区别?What is the difference between CommonJS and ES6 Modules?

内部问题链接数
0

背景

CommonJS是一种JavaScript模块系统,由Mozilla工程师Kevin Dangoor于2009年1月创立,最初命名为ServerJS。在同年8月,该项目被重新命名为CommonJS。这个项目的目的是为了解决JavaScript中缺少统一模块化标准的问题。在服务器端环境中,特别是Node.js中,CommonJS模块规范得到了广泛应用。

由于 CommonJS 并不是 ECMAScript 标准的一部分,所以 类似 module 和 require 并不是 JS 的关键字,仅仅是对象或者函数。

ECMAScript 6引入了一种新的模块系统,即ES6 Modules。它支持在语言层面上原生的模块功能,简洁易用,有望成为浏览器和服务器端通用的解决方案。然而,由于浏览器对ES6模块兼容性较差,所以我们通常会在使用Webpack时使用exportimport,再转换成CommonJS规范。

区别

从语法上看,CommonJS 模块使用require()加载和module.exports输出,ES6 模块使用importexport

从用法上看,require()是同步加载,后面的代码必须等待这个命令执行完,才会执行。import命令则是异步加载,或者更准确地说,ES6 模块有一个独立的静态解析阶段,依赖关系的分析是在那个阶段完成的,最底层的模块第一个执行。

使用

Node.js 要求 ES6 模块采用.mjs后缀文件名。也就是说,只要脚本文件里面使用import或者export命令,那么就必须采用.mjs后缀名。Node.js 遇到.mjs文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict"

.mjs文件总是以 ES6 模块加载,.cjs文件总是以 CommonJS 模块加载,.js文件的加载取决于package.json里面type字段的设置。如果如下设置,则默认全部按照es6来执行。需要使用CommonJs时,需要使用.cjs后缀。

参考