JavaScript 现在有两种模块。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 CJS。
CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用require()和module.exports,ES6 模块使用import和export。
Babel 转码器将还未被宿主环境(各浏览器、Node.js)直接支持的 ES6 Module 编译为 ES5 的 CommonJS —— 也就是 require/exports 这种写法
目前你编写的 import/export 最终都是编译为 require/exports 来执行的。
**
区别:
**
1:写法不同
- require/exports
const fs = require(‘fs’)
exports.fs = fs
module.exports = fs
import/export
- import/export
import fs from ‘fs’
import {default as fs} from ‘fs’
import * as fs from ‘fs’
import {readFile} from ‘fs’
import {readFile as read} from ‘fs’
import fs, {readFile} from ‘fs’
export default fs
export const fs
export function readFile
export {readFile, read}
export * from 'fs
'default 是 ES6 Module 所独有的关键字
2:
require可以在文件中的任何地方写
import和export命令只能在模块的顶层,不能在代码块之中,如if语句中
3:
require:动态加载,到底加载哪一个模块,只有运行时才知道。
import:“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。
参考文章
https://www.zhihu.com/question/56820346
https://flexiple.com/javascript-require-vs-import/
https://es6.ruanyifeng.com/#docs/module-loader