1. js模块中的cjs和ejs

1,007 阅读1分钟
  1. cjs commonJs。
  • node
    node支持直接引用。

  • 浏览器js
    不支持使用

  1. mjs esModuel。
  • node
    node暂不支持原生使用。非要用,需要改后缀为mjs。并执行时添加
node --experimental-modules index.mjs 
  • 浏览器js
    反而支持。只要加上类型说明
<script type="module" src="http://xx/es.js"></script>

区别:

  1. cjs是运行时执行的,所以可放到代码中的任何地方。mjs是编译时引入的,只能放到开头。
  2. 平台兼容性区别。上述。
  3. 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