• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-04-29 19:19 Aet 隐藏边栏 |   抢沙发  0 
文章评分 0 次,平均分 0.0

模块 (Module)

概述

  1. 随着我们的应用越来越大,我们想要将其拆分成多个文件,即所谓的“模块(module
  2. 一个模块可以包含用于特定目的的类或函数库
  3. 模块可以相互加载,并可以使用特殊的指令 exportimport 来交换功能,从另一个模块调用一个模块的函数:
    1. export 关键字标记了可以从当前模块外部访问的变量和函数
    2. import 关键字允许从其他模块导入功能

  1. import 指令通过相对于当前文件的路径 ./sayHi.js 加载模块,并将导入的函数 sayHi 分配(assign)给相应的变量
    1. 由于模块支持特殊的关键字和功能,因此我们必须通过使用 <script type="module"> 特性(attribute)来告诉浏览器,此脚本应该被当作模块(module)来对待
    2. 浏览器会自动获取并解析(evaluate)导入的模块,然后运行该脚本

注意1

  1. 模块只通过 HTTP(s) 工作,而非本地

始终使用 “use strict

  1. 模块始终在严格模式下运行

模块级作用域

  1. 每个模块都有自己的顶级作用域(top-level scope
  2. 换句话说,一个模块中的顶级作用域变量和函数在其他脚本中是不可见的

  1. 在浏览器中,对于 HTML 页面,每个 <script type="module"> 都存在独立的顶级作用域

注意2

  1. 在浏览器中,我们可以通过将变量显式地分配给 window 的一个属性,使其成为窗口级别的全局变量
  2. 例如 window.user = "John"

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

  1. 如果同一个模块被导入到多个其他位置,那么它的代码只会执行一次,即在第一次被导入时
    1. 然后将其导出(export)的内容提供给进一步的导入(importer
  2. 这里有一条规则:顶层模块代码应该用于初始化,创建模块特定的内部数据结构
    1. 如果我们需要多次调用某些东西 —— 我们应该将其以函数的形式导出

import.meta

  1. 包含关于当前模块的信息

在一个模块中,“this” 是 undefined

模块脚本是延迟的

  1. 模块脚本 总是 被延迟的,与 defer 特性对外部脚本和内联脚本(inline script)的影响相同
  2. 也就是说:
    1. 下载外部模块脚本 <script type="module" src="..."> 不会阻塞 HTML 的处理,它们会与其他资源并行加载
    2. 模块脚本会等到 HTML 文档完全准备就绪(即使它们很小并且比 HTML 加载速度更快),然后才会运行
    3. 保持脚本的相对顺序:在文档中排在前面的脚本先执行

Async 适用于内联脚本(inline script

  1. 对于非模块脚本,async 特性(attribute)仅适用于外部脚本
    1. 异步脚本会在准备好后立即运行,独立于其他脚本或 HTML 文档
  2. 对于模块脚本,它也适用于内联脚本
  3. 例如,下面的内联脚本具有 async 特性,因此它不会等待任何东西

外部脚本

  1. 具有 type="module" 的外部脚本(external script)在两个方面有所不同:
    1. 具有相同 src 的外部脚本仅运行一次:

  1. 如果一个模块脚本是从另一个源获取的,则远程服务器必须提供表示允许获取的 header Access-Control-Allow-Origin

不允许裸模块(“baremodule

  1. 浏览器中,import 必须给出相对或绝对的 URL 路径
  2. 没有任何路径的模块被称为“裸(bare)”模块。在 import 中不允许这种模块

导入导出

在声明前导出

导出与声明分开

注意

  1. 导出 class/function 后没有分号

Import *

Import “as”

Export “as”

Export default

  1. 每个文件应该只有一个 export default

重新导出

动态导入

import() 表达式

  1. import(module) 表达式加载模块并返回一个 promise,该 promise resolve 为一个包含其所有导出的模块对象
    1. 或者,如果在异步函数中,我们可以使用 let module = await import(modulePath)

注意

  1. 动态导入在常规脚本中工作时,它们不需要 script type="module"
  2. 尽管 import() 看起来像一个函数调用,但它只是一种特殊语法,只是恰好使用了括号
    1. 因此,我们不能将 import 复制到一个变量中,或者对其使用 call/apply。因为它不是一个函数

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享