说明
- module.exports与exports是CommonJS的规范
- export与export default是es6规范
- require 是 AMD规范引入方式
- import是es6的一个语法标准
module.exports与exports
- module变量代表当前模块。这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象;
1 | module.exports.aa="我是aa"; |
- 引用方法
1 | var req=require("./app.js"); |
- 而exports只是module.exports的一个引用,可以理解为:
1 | var exports = module.exports; |
- 但是这个两个还是有一定区别的,因为exports只是module.exports的一个引用,所以module.exports可以导出一个匿名函数,而exports不可以。因为这会切断和modeule.exports的联系。
- 如果不是很理解的话,下面举例说明(需要先明白引用数据类型和基础数据类型):
1 | var m={} |
- 也就是说也不能这样写exports= { name,say },它同样会改变exports地址指向
!
export与export default
二者的区别有以下几点:
- export default在一个模块中只能有一个,当然也可以没有。export在一个模块中可以有多个。
- export default的对象、变量、函数、类,可以没有名字。export的必须有名字。
- export default对应的import和export有所区别
1 | 1.export写法 |
1 | 2.export default |
import和require
调用时间
- require是运行时调用,所以require理论上可以运用在代码的任何地方
- import是编译时调用,所以必须放在文件开头
本质
- require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
- import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
对比
require/exports
- 遵循 CommonJS/AMD,只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化
- 用法只有以下三种简单的写法:
1 | const fs = require('fs') |
import/export
- 遵循 ES6 规范,支持编译时静态分析,便于JS引入宏和类型检验。动态绑定。
- 写法就比较多种多样:
1 | import fs from 'fs' |
注意
- 通过require引入基础数据类型时,属于复制该变量。
- 通过require引入复杂数据类型时,数据浅拷贝该对象。
- 出现模块之间的循环引用时,会输出已经执行的模块,而未执行的模块不输出(比较复杂)
- CommonJS模块默认export的是一个对象,即使导出的是基础数据类型
- 本文作者: Juaoie
- 本文链接: http://uaoie.top/2019/12/04/javaScript/js_export_import/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!