跳至主要內容

模块

大约 3 分钟

模块

模块介绍

一个 .js 文件即一个模块 模块之间可以通过关键字 import 与 export 相互加载

使用模块

export

在变量或函数前使用关键字 export 表明此变量或函数可以被其他模块 import

export function fun()
{
    ...
}
export let val = 0; 

import

加载目标模块, 并将其他模块中 export 的变量或函数导入当前模块, 名称不变

import {fun} from "./test.js"
fun();

浏览器

允许在浏览器中使用模块, 但其 type 属性要为 module

<script type='module' src='./test.js'></script>

且只用使用 html:// 访问下, module 才能生效, 直接打开 html 文件则失效

模块功能

默认严格模式

使用模块时, 默认使用严格模式, 变量在使用前必须声明

模块作用域

一个模块中的非 export 变量不能被另一个模块访问 当不同的模块 export 了同一个模块的同一个变量 两个模块 export 到的变量为同一个

// a.js
import {val} from "./test.js"
val = 100;
// b.js
console.log(val);//输出100

模块仅在第一次导入时解析

如果同一个模块被导入到多个其他位置,那么它的代码只会执行一次 即使多次 import, 模块仅会运行一次

模块中的 this

在模块中最外层的 this 为 undefined

导入与导出语法

export {}

通过 export {...} 将多个函数/变量同时导出 并且分离 export 与声明

import *

import * as obj from "./obj.js"

将模块 obj.js 以 obj 的成员的形式导出 此时从 obj.js 导出的变量将成为对象 obj 的成员 不推荐

import as

import {fun as f, val as v} from "./test.js"

使用 as 可以对导入的变量起别名

export as

也可以在导出时起别名

export {fun as f, val as v}

export default

当只有一个变量/函数被导出时, 可以使用 default 关键字 default 也可视为一个变量名, 在导出时将会把名称为 default 的变量默认导出

//a.js
export default function{...} // default 导出的变量/函数允许没有名称
//b.js
function b(){...}
export{b as default} // 当以名称 default 导出时, 也视为默认导出
//import.js
import a from "./a.js" // 导入默认导出模块时不需要加括号
import c from "./b.js" // 也不要求与导出变量同名

不推荐

export from

导入后导出

export {default as a} from "./a.js"
export {fun} from "./test.js"

当模块的功能由多个小模块构成时, 可将功能在一个 index.js 中集中导出 可以使用此方法

动态导入

import 语句不能用于 if 等结构内 可以使用 import() 以动态导入(不是函数, 为语法结构) 将返回一个 result 为所有导出的 Promise

let obj = await import("./a.js")
obj.default()// 当有默认导出时, 导出的变量名为 default

Node.js 模块

导入

node.js 中使用函数 require 导入模块 对于 npm 管理的模块可以直接输入模块名 否则要指定路径

const obj = require("./obj")

除了 .js 还可以导入 .json 与 .node (二进制模块) 其中, .js 可以省略

导出

// 导出多个变量时的导出方式
exports.fun = function()
{...}
// 导出单个变量的导出方式
module.exports = {
    ...
}
//只能使用其中一种