背景
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时使用export
和import
,再转换成CommonJS规范。
区别
从语法上看,CommonJS 模块使用require()
加载和module.exports
输出,ES6 模块使用import
和export
。
从用法上看,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
后缀。