首先主要体现在他们的用法上,
require是CommonJS的语法,它的模块是对象,导入时实际倒入一个对象,然后再根据对象去查找对应的属性。所以会可能加载一些模块内不被用到的方法或其他。
let { stat, exists, readFile } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
这里涉及到一个概念,叫‘运行时加载‘,就是说,只有在代码真正运行的时候才会去加载对应需要的东西,所以不能做到编译时就把想加载的模块加载进来,即不能做到编译时静态化。
而import是属于ES6内的,es6默认使用严格模式,模块内的变量在外部是无法使用的,必须通过exports导出。
导出的方式有:
export var firstName = 'Michael';
export {firstName, lastName, year};
export function multiply(x, y) { return x * y; }; //导出函数或者类
export {
v1 as streamV1,
v2 as streamV2,
v2 as streamLatestVersion
}; //用as重命名
export模块可以位于模块中的任何位置,但是必须是在模块顶层,如果在其他作用域内,会报错。
function foo() {
export default 'bar' // SyntaxError
}
foo()
还有默认导出
export default function () { console.log('foo'); }
与之对应的是需要import引入
import {firstName, lastName, year} from './profile';
import { lastName as surname } from './profile'; //重命名
import * as circle from './circle'; //用星号代表所有
import命令接受一对大括号,里面指定要从其他模块导入的变量名,必须与被导入模块(profile.js)对外接口的名称相同。
注意,import命令具有提升效果,会提升到整个模块的头部,首先执行。(是在编译阶段执行的)
因为import是静态执行的,不能使用表达式和变量,即在运行时才能拿到结果的语法结构
适用场景就是按需加载和条件加载