1. 如何导出
ES Module 的导出
ES Module 分为两种导出方式:
- 具名导出(普通导出),可以导出多个
- 默认导出,只能导出一个
一个模块可以同时存在两种导出方式,最终会合并为一个「对象」导出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| export const a = 1; export function b() {}; export function c(){}
const d = 2; export { d }
const k = 10 export { k as temp }
const f = 4, g = 5, h = 6 export { f, g, h as default}
|
注意: 导出代码必须为顶级代码,即不可放到代码块中
2. 如何导入
针对具名导出和默认导出,有不同的导入语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import "模块路径"
import { a, b } from "模块路径"
import c from "模块路径"
import c, { a, b } from "模块路径"
import * as obj from "模块路径"
import {a as temp1, b as temp2} from "模块路径"
import {default as a} from "模块路径"
import {default as a, b} from "模块路径"
import("模块路径")
|
注意1: 静态导入的代码必须为在代码顶端,也不可放入代码块中
注意2: 静态导入的代码绑定的符号是常量,不可更改
注意3: 导入路径不可省略文件后缀
3. 示例代码
3-1. 主文件【index.html】
- 当
script
标签中存在属性 type="module"
,这个js就会以模块方式运行;
- 以模块方式运行就不会存在变量污染,即
index.js
中的全局变量不会污染其他文件也不会出现在 window
上;
1 2 3 4 5 6 7 8 9 10 11 12
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script src="./js/index.js" type="module"></script> </body> </html>
|
3-2. 功能模块【math.js】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| export function sum(a, b) { return a + b; }; export const isOdd = (n) => n % 2 !== 0;
export default { sum_d(a,b){ return a + b; }, isOdd_d(n){ return n % 2 !== 0; } };
|
3-3. 入口文件【index.js】【静态导入】
- 导入方式随意使用; 详情
- 静态导入的代码绑定的符号是常量,不可更改
1 2 3 4
| import { sum,m } from "./math.js"
import math from "./math.js"
|
3-4. 入口文件【index.js】【动态导入】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| setTimeout(()=>{ import("./math.js").then(m => { const result = m.default.sum_d(2,3) console.log(result); }); },1000)
setTimeout(async ()=>{ const m = await import("./math.js"); const math = m.default; const result = math.sum_d(2,3) console.log(result); },2000)
|
__END__