说明
module.exports 与 exports 是 CommonJS 的规范
export 与 export default 是 es6 规范
require 是 AMD 规范引入方式
import 是 es6 的一个语法标准
module.exports 与 exports
module 变量代表当前模块. 这个变量是一个对象, module 对象会创建一个叫 exports 的属性, 这个属性的默认值是一个空的对象;
- module.exports.aa="我是 aa";
- module.exports.bb="我是 bb";
- // 上边这段代码就相当于一个对象
- {
- "aa":"我是 aa",
- "bb":"我是 bb",
- }
引用方法
- var req=require("./app.js");
- req.aa // 这个值是 "我是 aa"
而 exports 只是 module.exports 的一个引用, 可以理解为:
var exports = module.exports;
但是这个两个还是有一定区别的, 因为 exports 只是 module.exports 的一个引用, 所以 module.exports 可以导出一个匿名函数, 而 exports 不可以. 因为这会切断和 modeule.exports 的联系.
如果不是很理解的话, 下面举例说明 (需要先明白引用数据类型和基础数据类型):
- var m={}
- m.e1={}
- var e2=m.e1;
- e2.aa=1
- console.log(m.e1.aa)// 打印 1
- e2=function(){
- return 123;
- }
- console.log(m.e1)// 打印 {aa:1}
- console.log(e2)// 打印 ƒ (){return 123;}
- // 也就是说如果给 exports 导出匿名函数, 就会重写 exports 引用地址指向
也就是说也不能这样写 exports= { name,say }, 它同样会改变 exports 地址指向
!
export 与 export default
二者的区别有以下几点:
export default 在一个模块中只能有一个, 当然也可以没有. export 在一个模块中可以有多个.
export default 的对象, 变量, 函数, 类, 可以没有名字. export 的必须有名字.
export default 对应的 import 和 export 有所区别
1.export 写法
- var name="我是电脑";
- var say=function(){
- console.log("我可以干很多事");
- }
- export {name,say};
- // 也可以直接一个一个的 export 但是必须得有名字
- export const a=1;
- export function data(){
- return data;
- }
- // 其他页面引入时必须这样
- import {name,say} from "./app.js"
- 2.export default
- // 可以没有函数名字
- export default function(){
- return data;
- }
- // 这里 export 不能这样导出
- export default const a=12;// 报错
- // 应该这样导出
- const a=12;
- export default a
- // 其他页面引入时必须这样
- import data from "./app.js"
import 和 require
调用时间
require 是运行时调用, 所以 require 理论上可以运用在代码的任何地方
import 是编译时调用, 所以必须放在文件开头
本质
require 是赋值过程, 其实 require 的结果就是对象, 数字, 字符串, 函数等, 再把 require 的结果赋值给某个变量
import 是解构过程, 但是目前所有的引擎都还没有实现 import, 我们在 node 中使用 babel 支持 ES6, 也仅仅是将 ES6 转码为 ES5 再执行, import 语法会被转码为 require
对比
require/exports
遵循 CommonJS/AMD, 只能在运行时确定模块的依赖关系及输入 / 输出的变量, 无法进行静态优化
用法只有以下三种简单的写法:
- const fs = require('fs')
- exports.fs = fs
- module.exports = fs
- import/export
遵循 ES6 规范, 支持编译时静态分析, 便于 JS 引入宏和类型检验. 动态绑定.
写法就比较多种多样:
- 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'
注意
通过 require 引入基础数据类型时, 属于复制该变量.
通过 require 引入复杂数据类型时, 数据浅拷贝该对象.
出现模块之间的循环引用时, 会输出已经执行的模块, 而未执行的模块不输出 (比较复杂)
CommonJS 模块默认 export 的是一个对象, 即使导出的是基础数据类型
来源: https://www.cnblogs.com/Juaoie/p/11984339.html