1、导出
module.exports:模块对外的接口。(CommonJS模块规范)——require方法引入加载此模块
export default:为模块指定默认输出。(ES6模块规范)
exports:指向module.exports。(CommonJS模块规范)
2、引入
import (ES6模块规范)
require(CommonJS模块规范)
3、module的语法
CommonJS模块就是对象,所以需要查找对象属性。
eg:let { stat, exists, readfile } = require('fs');相当于加载整体的模块,后读取模块对象中的部分方法。
ES6是通过export输出指定代码,再通过import命令输入。
eg:import { stat, exists, readFile } from 'fs';只加载对应需要使用的方法。
export:
// 写法一
export var m = 1;
// 写法二
var m = 1;
export {m};
// 写法三
var n = 1;
export {n as m};
=====================
// 报错
function f() {}
export f;
// 正确
export function f() {};
// 正确
function f() {}
export {f};
import有提升作用;import是静态执行,所以不能使用表达式和变量,这些只有在运行时才能得到结果的语法结构。
import整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。
eg:import * as circle from './circle'
4、CommonJS
module变量(一对象)代表当前模块,它的exports属性是对外的接口。
require方法相当于加载模块。模块可以多次加载,但是只会在第一次加载时运行一次。
目录的加载规则:require发现指向一目录后,会查看该目录下的package.json文件,然后加载main字段指定的入口文件,若package.json文件无main字段,或没有package.json文件,则会加载该目录下的index.js or index.node文件。
5、ES6
使用 export(规定对外的接口) 和 import 来导出、导入模块。使用export default命令,为模块指定默认输出。
因为export default命令其实只是输出一个叫做default的变量,所以它后面不能跟变量声明语句。
// 正确
export var a = 1;
// 正确
var a = 1;
export default a;
// 错误
export default var a = 1;
require动态加载,import静态加载。但es2020引入import()函数,支持动态加载。import()返回一个 Promise 对象。
动态加载:
require:同步
import():异步