js模块化

136 阅读1分钟

1.es6 import export

import是静态执行,不能放在if等判断逻辑中

// a.js 自己不能再文件中用default作为变量
export default 'default code'
export const name = 'code'
export function fn() { console.log('fn'); }

const age = 18
export { age }

const s = 'girl'
export { s as sex }

// b.js
import *** from './a.js'               							***为'default code'  ***可以是自定义变量名称
import { name } from './a.js'          							name为'code'
import { name as firstName } from './a.js'          firstName'code'
import { fn } from './a.js'  	         							fn()执行后打印fn
import { age } from './a.js'           							age 18
import { sex } from './a.js'           							sex girl
import * as person from './a.js'										person上有name,age等属性(同时还有default属性)

本质上,export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字。

// a.js
export default 1

// b.js
import { default as data } from './a.js'; 					data的值为1

// a.js
const data = 13
export { data as default }

// b.js
import all from './a.js'														all的值为13

import后在访问时会动态更新引入的值

// a.js
let height = 183
setTimeout (() => ++height, 500)
export { height }

// b.js
import { height } from './a.js'
console.log(height)										 打印183
setTimeout(() => {
  console.log(height);
}, 1000)                               1秒后打印184

// c.js
const { height } = require('./a.js')   和上面一样,本质上是因为在webpack环境下,而不是在node环境,如果在node环境下依旧打印1

import 的时候不是值的拷贝,而是沿用了原本对象的内存地址,但是此用法不建议使用

// a.js
let obj = { name: 'zzz' }
setTimeout (() => console.log(obj.name), 500)    // 打印ppp
export { obj }

// b.js
import { obj } from './a.js'
console.log(obj.name);
obj.name = 'ppp'

export和import混用

// a.js
export { testC } from 'my_module'     这里相当于一个中转站,将my_module的值先导入再导出,同时当前模块不能使用testC

// b.js
import { testC } from './a.js'

import()函数 运行时引入,解决异步问题

if (condition) {
  import('moduleA').then(...);
} else {
  import('moduleB').then(...);
}