我的日常开发记录日志
首页
  • Laravel
  • Thinkphp
  • Swoole
  • Workman
  • php
  • HTML
  • CSS
  • JavaScript
  • Vue
  • ES6
  • 小程序
  • Mysql
  • Redis
  • Es
  • MongoDb
  • Git
  • Composer
  • Linux
  • Nginx
  • Docker
  • Vpn
  • 开发实战
  • 开发工具类
  • 友情链接
💖关于
💻收藏
  • 分类
  • 标签
  • 归档数据
GitHub (opens new window)

我的日常开发记录日志

never give up
首页
  • Laravel
  • Thinkphp
  • Swoole
  • Workman
  • php
  • HTML
  • CSS
  • JavaScript
  • Vue
  • ES6
  • 小程序
  • Mysql
  • Redis
  • Es
  • MongoDb
  • Git
  • Composer
  • Linux
  • Nginx
  • Docker
  • Vpn
  • 开发实战
  • 开发工具类
  • 友情链接
💖关于
💻收藏
  • 分类
  • 标签
  • 归档数据
GitHub (opens new window)
  • html

  • css

  • javascript

    • Html
    • Axios的基本使用
    • 模块编程

      • 模块 (Module) 简介
      • 导出和导入
      • 动态导入
        • import() 表达式
    • 异步编程

  • vue

  • 小程序

  • Es6

  • 前端
  • javascript
  • 模块编程
窝窝侠
2022-11-19

动态导入

# 动态导入

我们在前面章节中介绍的导出和导入语句称为“静态”导入。语法非常简单且严格。

首先,我们不能动态生成 import 的任何参数。

模块路径必须是原始类型字符串,不能是函数调用,下面这样的 import 行不通:

import ... from *!*getModuleName()*/!*; // Error, only from "string" is allowed
1

其次,我们无法根据条件或者在运行时导入:

if(...) {
  import ...; // Error, not allowed!
}

{
  import ...; // Error, we can't put import in any block
}
1
2
3
4
5
6
7

这是因为 import/export 旨在提供代码结构的主干。这是非常好的事儿,因为这样便于分析代码结构,可以收集模块,可以使用特殊工具将收集的模块打包到一个文件中,可以删除未使用的导出("tree-shaken")。这些只有在 import/export 结构简单且固定的情况下才能够实现。

但是,我们如何才能动态地按需导入模块呢?

# import() 表达式

import(module) 表达式加载模块并返回一个 promise,该 promise resolve 为一个包含其所有导出的模块对象。我们可以在代码中的任意位置调用这个表达式。

我们可以在代码中的任意位置动态地使用它。例如:

let modulePath = prompt("Which module to load?");

import(modulePath)
  .then(obj => <module object>)
  .catch(err => <loading error, e.g. if no such module>)
1
2
3
4
5

或者,如果在异步函数中,我们可以使用 let module = await import(modulePath)。

例如,如果我们有以下模块 say.js:

// 📁 say.js
export function hi() {
  alert(`Hello`);
}

export function bye() {
  alert(`Bye`);
}
1
2
3
4
5
6
7
8

……那么,可以像下面这样进行动态导入:

let {hi, bye} = await import('./say.js');

hi();
bye();
1
2
3
4

或者,如果 say.js 有默认的导出:

// 📁 say.js
export default function() {
  alert("Module loaded (export default)!");
}
1
2
3
4

……那么,为了访问它,我们可以使用模块对象的 default 属性:

let obj = await import('./say.js');
let say = obj.default;
// or, in one line: let {default: say} = await import('./say.js');

say();
1
2
3
4
5

这是一个完整的示例:

[codetabs src="say" current="index.html"]

动态导入在常规脚本中工作时,它们不需要 `script type="module"`.
1
尽管 `import()` 看起来像一个函数调用,但它只是一种特殊语法,只是恰好使用了括号(类似于 `super()`)。

因此,我们不能将 `import` 复制到一个变量中,或者对其使用 `call/apply`。因为它不是一个函数。
1
2
3
在线编辑 (opens new window)
上次更新: 2022/11/20, 00:31:57
导出和导入
回调异步

← 导出和导入 回调异步→

最近更新
01
showprocess用法
04-29
02
vue3中尖括号和冒号的使用细则
04-29
03
sd使用
02-22
更多文章>
🖥️

© 2025窝窝侠 💌 豫ICP备20005263号-2 🛀 Theme by 💝 Vdoing && 小胖墩er

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×