require 和 import 的区别?

遵循的规范不同

1.require/exports是CommonJS的一部分 2.import/export是ES6新规范

出现时间不同

CommonJS 作为 Node.js 的规范,一直沿用至今。由于 npm 上 CommonJS 的类库众多,以及 CommonJS 和 ES6 之间的差异,Node.js 无法直接兼容 ES6。所以现阶段 require/exports 仍然是必要且是必须的。

形式不同

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';
-----------------------------
export default fs;
export const fs;
export * from 'fs';

本质上的不同

1.CommonJS还是ES6 Module 输出都可以看成是一个具备多个属性或者方法的对象; 2.default 是ES6 Module所独有的关键字,export default 输出默认的接口对象,import from 'fs'可直接导入这个对象; 3.ES6 Module中导入模块的属性或者方法是强绑定的,包括基础类型;而 CommonJS 则是普通的值传递或者引用传递。

ES6 模块与 CommonJS 模块的差异

CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。 CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。 ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。 commonJS 和 es6模块化 区别: es6 {   export : '可以输出多个,输出方式为 {}' ,   export default : ' 只能输出一个 ,可以与export 同时输出,但是不建议这么做',   解析阶段确定对外输出的接口,解析阶段生成接口,   模块不是对象,加载的不是对象,   可以单独加载其中的某个接口(方法),   静态分析,动态引用,输出的是值的引用,值改变,引用也改变,即原来模块中的值改变则该加载的值也改变,   this 指向undefined } commonJS {   module.exports = ... : '只能输出一个,且后面的会覆盖上面的' ,   exports. ... : ' 可以输出多个',   运行阶段确定接口,运行时才会加载模块,   模块就是对象,加载的是该对象,   加载的是整个模块,即将所有的接口全部加载进来,   输出的是值的拷贝,即原来模块中的值改变不会影响已经加载的该值,   this 指向当前模块 }

上次更新:
Contributors: jingmin.jiang