遵循的规范不同
- require/exports是CommonJS的一部分
- import/export是ES6的新规范
出现时间不同
CommonJS 作为 Node.js 的规范,一直沿用至今。由于 npm 上 CommonJS 的类库众多,以及 CommonJS 和 ES6 之间的差异,Node.js 无法直接兼容 ES6。所以现阶段 require/exports 仍然是必要且是必须的。出自 ES6 的 import/export 相对就晚了许多。被大家所熟知和使用也是 2015 年之后的事了。 这其实要感谢 babel这个神一般的项目。由于有了 babel 将ES6 Module 编译为 ES5 的 CommonJS 才能让大家可以很自在的去使用ES6而没有任何问题。
形式不同
- require/exports 的用法只有以下三种简单的写法:
const fs = require('fs');
— — — — — — — — — — — — — —
exports.fs = fs;
module.exports = fs;
- 而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';
本质上的不同

运行结果:

import 是在编译过程中执行,而common的require是同步。
还有import传的是值引用,require是值拷贝。
import是read-only的,比如:
//// a.js
module.exports = 0;
//// main.js
var a0 = require('./a.js');
import a1 from './a.js';
a0++; /// 1
a1++; ///报错,babel直接编辑不过
出错信息:

网友评论