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 指向当前模块 }