ES Module

573 阅读2分钟

export default 和对应的 import

1.认识导出和导入

导出(export)的东西可以被导入(import),并访问到

一个模块没有导出,也可以将其导入

 // a.js
 const age = 18
 console.log(age) 
 ​
 // main.js
 import './a.js' 
 // 控制台打印 18
 ​
 // 被导入的代码都会执行一遍,也仅会执行一遍
 import './a.js'
 import './a.js'
 import './a.js'
 // 导入多次,结果也只会打印一次 18

2.基本用法

export default 对应的 import 可以随便起名

 // a.js
 export default age
 ​
 // main.js
 import age111 from './a.js'

一个模块只能有一个 export default

 // a.js
 const name = 'xiaolong'
 const age = 18
 export default age
 export default name
 // Uncaught SyntaxError: Identifier '.default' has already been declared

export 和对应的 import

1.基本用法

 // export 声明或语句
 export const age = 18
 ​
 const age = 18
 export { age }
 // 必须加花括号
 export  age 
 // Uncaught SyntaxError: Unexpected token 'export'
 ​
 // main.js 导入
 main.js import { age } from './a.js' 
 // 必须加花括号
 import age from './a.js'
 // Uncaught SyntaxError: The requested module './a.js' does not provide an export named 'default'
 ​
 ​
 // 不能随意命名
 import { age1 } from './a.js' 
 // Uncaught SyntaxError: The requested module './a.js' does not provide an export named 'age1'

2.多个导出

 export { name, age, sayHello }

3.导出导入时起别名

 // a.js 导出
 export { sayHello as hello, name, age }
 // main.js 导入
 import { sayHello, age, name as Person } from './a.js'

4.整体导入

会导入所有输出,包括通过 export default 导出的

 import * as Person from './a.js' // Module {Symbol(Symbol.toStringTag): 'Module'}

5.同时导入

 import { age, name, sayHello } from './a.js'
 ​
 import age2 from './a.js'
 ​
 // 一定是 export default 的在前
 ​
 import age2, { age, name, sayHello } from './a.js'

Module 的注意事项

1.模块顶层的 this 指向

模块中,顶层的 this 指向 undefined

 // a.js
 console.log(this) 
 ​
 // main.js
 import './a.js' 
 // undefined

2.import 和 import()

import 命令具有提升效果,会提升到整个模块的头部,率先执行

 // a.js
 export { age }
 ​
 // main.js
 console.log('沙发')
 console.log('第二')
 import { age } from './a.js'
 ​
 // 18
 // 沙发
 // 第二

import 执行的时候,代码还没执行

importexport 命令只能在模块的顶层,不能在代码块中执行

 if(PC){
     import 'pc.js'
 }else if(Mobile){
     import 'mobile.js' // 报错
 }

import() 可以按条件导入

 if(PC){
     import('pc.js')
 }else if(Mobile){
     import('mobile.js')
 }

3.导入导出的复合写法

 // main.js
 export{age} from './a.js'
 //当前模块不可以访问age
 // 等价于
 import {age} from './a.js'
 export {age} from './a.js'
 //当前模块可以访问age

参考:

慕课前端课程

扩展:

【翻译】ES modules:通过漫画进行深入理解

「万字进阶」深入浅出 Commonjs 和 Es Module-