JavaScript 模块

· 608 words · 4 min

脚本和模块

JS 有两种源文件:脚本和模块。脚本是由浏览器或者 node 引入执行的,而模块只能由 JS 代码用 import 引入执行。 模块和脚本的区别在于是否包含 importexport

Import

import 有两种语法,一种是直接 import 一个模块,另一种是带 fromimport。 直接 import 一个模块即执行该模块,无法获得该模块的任何信息。 带 fromimport 是引入模块的部分信息,可以把它们变成本地变量。

// 引入模块中导出的默认值
import x from "./a.js";
// 引入模块中的变量
import { a as x, modify } from "./a.js";
// 把模块中所有的变量以类似对象属性的方式引入
import * as x from "./a.js";

// 组合用法
import d, { a as x, modify } from "./a.js";
import d, * as x from "./a.js";

Export

export 用来导出。模块中导出变量的方式有两种,一种是独立使用 export 声明,另一种是直接在声明型语句前添加 export 关键字。

export { a, b, c }

export var a = 1
export function fn() {}
export class Cls {}
export let b = 'abc'
export const bool = true

使用上面的方式导出的变量,在引入的模块中实际上仍然受到导出模块的控制。 导入与一般的赋值不同,导入后的变量只是改变了名字,它仍然与原来的变量是同一个。

// a.js
export var a = 1;
export function modify(){
	a = 2;
}

// b.js
import { a, modify } from "./a.js";
console.log(a); // 1
modify();
console.log(a); // 2

export 还有一种特殊用法,就是和 default 联合使用。export default 表示导出一个默认变量值, 导出的变量是没有名称的,可以使用 import x from "./a.js" 这样的语法,在模块中引入。 使用 export default 语法导出变量的值以后,修改变量不会使得其他模块中引入的 default 值发生改变。

var a  = 123;
export default a; // 导出后不会再变化

还可以使用 export from 语法:

// b.js
import a from 'a.js'
export a;

// b.js
export a from 'a.js'

指令序言机制

脚本和模块都支持一种特别的语法,叫做指令序言(Directive Prologs)。 这里的指令序言最早是为了 "use strict" 设计的,它规定了一种给 JS 代码添加元信息的方式。 "use strict" 是 JS 标准中规定的唯一一种指令序言。

From 极客时间