- cjs commonJs。
-
node
node支持直接引用。 -
浏览器js
不支持使用
- mjs esModuel。
- node
node暂不支持原生使用。非要用,需要改后缀为mjs。并执行时添加
node --experimental-modules index.mjs
- 浏览器js
反而支持。只要加上类型说明
<script type="module" src="http://xx/es.js"></script>
区别:
- cjs是运行时执行的,所以可放到代码中的任何地方。mjs是编译时引入的,只能放到开头。
- 平台兼容性区别。上述。
- esmodule得益于静态分析,所以打包工具都使用它来做tree-shaking。require是运行时的,只有运行才知道引入什么模块,就做不了tree-shaking。
==注==:以前看到过的值引用不同,是无稽之谈。凡是对象的,对象属性值改变了,引用的对象也会随之改变。凡是基本类型的,改变了都不会随之改变。
- cjs.js
let p = { a: 1 }
let c = 1
function changeP(v) {
p.a = v
}
function changeC(v) {
c = v
}
module.exports = { p, changeP, c, changeC }
- ejs.mjs
let p = { a: 1 }
let c = 1
function changeP(v) {
p.a = v
}
function changeC(v) {
c = v
}
export { p, changeP, c, changeC }
- testCjs.js
const { changeP, p, changeC, c } = require('./cjs.js')
console.log('p', p)
changeP(2)
console.log('p', p)
console.log('c', c)
changeP(2)
console.log('c', c)
// node testCjs
// p { a: 1 }
// p { a: 2 }
// c 1
// c 1
- testEs.mjs
import { p, changeP, c, changeC } from './esjs.mjs'
console.log('p', p)
changeP(2)
console.log('p', p)
console.log('c', c)
changeP(2)
console.log('c', c)
// node --experimental-modules testES.mjs
// p { a: 1 }
// p { a: 2 }
// c 1
// c 1