js模块导入/导出

125 阅读2分钟
1module.exportsexportsCommonJS的规范
2exportexport default 是es6规范
3requireAMD规范引入方式
4import是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

exports只是module.exports的一个引用
可理解为:var exports = module.exports;
不可以导出一个匿名函数

export与export default

export default 在一个模块中只能有一个,也可以没有。export 在一个模块中可以有多个
export default 的对象、变量、函数、类,可以没有名字。export 必须有名字
export default 对应的importexport有所区别

1export 写法
var name = '我是name';
var say = function () { console.log('我是func') };
export { name, say };
export const a = 1; // 也可以直接一个一个的export但是必须得有名字
export function data () { return false; };
其他页面引入
import { name, say } from './app.js'

2export default
export defaunt function ( return false ) // 可以没有函数名字
export default const a = 1 // 报错 不能这样导出
const a = 1;
export default a;
其他页面引入
import data from './app.js'

import和require

1、调用时间
require是运行时调用,所以require理论上可以运用在代码的任何地方
import是编译时调用,所以必须放在文件开头
2、本质
require是赋值过程,require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
import是解构过程,
3、对比
require/exports
3.1、遵循CommonJS/AMD,只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化
3.2、用法:
    exports.fs = fs
    module.exports = fs
    const fs = require('fs')
import/export
3.3、遵循ES6规范,支持编译时静态分析,便于JS引入宏和类型检验。动态绑定
3.4、写法
    export default fs
    export const fs
    export function readFil
    export { readFile, read }
    export * from 'fs'
    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'
4、注意
通过require引入基础数据类型时,属于复制该变量
通过require引入复杂数据类型时,数据浅拷贝该对象
出现模块之间的循环引用时,会输出已经执行的模块,而未执行的模块不输出
CommonJS模块默认export的是一个对象,即使导出的时基础数据类型