· 608 words · 4 min
JS 有两种源文件:脚本和模块。脚本是由浏览器或者 node 引入执行的,而模块只能由 JS 代码用 import
引入执行。
模块和脚本的区别在于是否包含 import
和 export
。
import
有两种语法,一种是直接 import
一个模块,另一种是带 from
的 import
。
直接 import
一个模块即执行该模块,无法获得该模块的任何信息。
带 from
的 import
是引入模块的部分信息,可以把它们变成本地变量。
// 引入模块中导出的默认值
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 { 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 标准中规定的唯一一种指令序言。