commonjs和esmodule的区别

63 阅读1分钟

commonjs(用于node)

  • 每一个文件都是一个模块,有着自己的作用域
  • 导入是同步的,通过require导入
  • 首次导入会有缓存,后续导入会返回缓存结果(可清除)
  • 导出是通过一个module.exports对象,exports初始指向这个module.exports,可以通过exporets导出。
  • 导出是值的引用,如果改变这个值,其他文件导入也会发生变化。
  • 不可以使用if switch去使用require

esmodule(用于浏览器)

  • 每一个文件都是一个模块,有着自己作用域
  • 导入是异步的,可以通过
    • 默认引入:import A from "data.js"
    • 统一导入 import * as A from "data.js"
    • 按需导入 import { a, b } from "data.js"
  • 多次导入时,只会加载一次
  • 编译阶段,import会提升到模块的顶部执行。
  • 还有动态导入,返回一个promise

amd(用于浏览器,异步导入)

cmd(commonjs 和amd的结合,适用于浏览器也适用于node,异步导入)

es6既可以使用在浏览器,也可以使用node中。可以取代amd和cmd,在node只需要将导入文件的后缀改成.mjs,以及在package.json文件添加type: 'module'即可。