成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何動(dòng)態(tài)導(dǎo)入ECMAScript模塊?

開(kāi)發(fā) 前端
import { concat } from './concatModule'使用ES模塊的方式是靜態(tài)的:意味著模塊之間的依賴關(guān)系在編譯時(shí)就已經(jīng)知道了。

[[408237]]

ECMAScript(又名ES2015或ES)模塊是在JavaScript中組織內(nèi)聚代碼塊的一種方法。

ES模塊系統(tǒng)有2個(gè)部分:

  • import模塊 - 使用 import { func } from './myModule'
  • export模塊- 使用 export const func = () => {}

import 模塊是使用 import 語(yǔ)法導(dǎo)入依賴項(xiàng)的模塊:

  1. import { concat } from './concatModule'
  2.  
  3. concat('a''b'); // => 'ab' 

而被導(dǎo)入的模塊使用export語(yǔ)法從自身導(dǎo)出組件:

  1. export const concat = (paramA, paramB) => paramA + paramB; 

import { concat } from './concatModule'使用ES模塊的方式是靜態(tài)的:意味著模塊之間的依賴關(guān)系在編譯時(shí)就已經(jīng)知道了。

雖然靜態(tài)導(dǎo)入在大多數(shù)情況下是有效的,但有時(shí)我們想節(jié)省客戶的帶寬并有條件地加載模塊。

為了實(shí)現(xiàn)這一點(diǎn),我們可以用不同的方式使用 import(pathToModule) 語(yǔ)法對(duì)模塊進(jìn)行新的動(dòng)態(tài)導(dǎo)入:作為一個(gè)函數(shù)。動(dòng)態(tài)導(dǎo)入是ES2020開(kāi)始的一個(gè)JavaScript語(yǔ)言特性。

1. 動(dòng)態(tài)模塊的導(dǎo)入

當(dāng)import關(guān)鍵字用作函數(shù)而不是靜態(tài)導(dǎo)入語(yǔ)法時(shí):

  1. const module = await import(pathToModule); 

它返回一個(gè)promise ,并開(kāi)始一個(gè)加載模塊的異步任務(wù)。如果模塊被成功加載,那么promise就會(huì)解析到模塊的內(nèi)容,否則,promise 就會(huì)被拒絕。

請(qǐng)注意,pathToModule可以是任何表達(dá)式,其值為表示導(dǎo)入模塊路徑的字符串。有效的值是普通的字符串字面意義(如./myModule)或有字符串的變量。

例如,我們?cè)谝粋€(gè)異步函數(shù)中加載一個(gè)模塊。

  1. async function loadMyModule() { 
  2.   const myModule = await import('./myModule'); 
  3.   // ... use myModule 
  4.  
  5. loadMyModule(); 

有趣的是,與靜態(tài)導(dǎo)入相反,動(dòng)態(tài)導(dǎo)入接受以模塊路徑求值的表達(dá)式。

  1. async function loadMyModule(pathToModule) { 
  2.   const myModule = await import(pathToModule); 
  3.   // ... use myModule 
  4.  
  5. loadMyModule('./myModule'); 

現(xiàn)在,了解了如何加載模塊后,我們來(lái)看看如何從導(dǎo)入的模塊中提取組件。

2.導(dǎo)入組件

2.1 導(dǎo)入命名組件

考慮下面的模塊:

  1. // namedConcat.js 
  2. export const concat = (paramA, paramB) => paramA + paramB; 

這里導(dǎo)出了一個(gè) concat 函數(shù)。

如果想動(dòng)態(tài)導(dǎo)入namedConcat.js,并訪問(wèn)命名的導(dǎo)出concat,那么只需通解構(gòu)的方式就行了:

  1. async function loadMyModule() { 
  2.   const { concat } = await import('./namedConcat'); 
  3.   concat('b''c'); // => 'bc' 
  4.  
  5. loadMyModule(); 

2.2 默認(rèn)導(dǎo)出

如果模塊是默認(rèn)導(dǎo)出的,我們可以使用default屬性來(lái)訪問(wèn)。

還是上面的例子,我們將defaultConcat.js里面的concat函數(shù)默認(rèn)導(dǎo)出:

  1. // defaultConcat.js 
  2. export default (paramA, paramB) => paramA + paramB; 

在動(dòng)態(tài)導(dǎo)入模塊中,可以使用default屬性來(lái)訪問(wèn):

  1. async function loadMyModule() { 
  2.   const { default: defaultImport } = await import('./defaultConcat'); 
  3.   defaultImport('b''c'); // => 'bc' 
  4.  
  5. loadMyModule(); 

注意,default在JavaScript中是一個(gè)關(guān)鍵字,所以它不能用作變量名。

2.3導(dǎo)入混合形式

如果模塊里面既有默認(rèn)導(dǎo)出也有命名導(dǎo)出,同樣也是使用解構(gòu)的方式來(lái)訪問(wèn):

  1. async function loadMyModule() { 
  2.   const {  
  3.     default: defaultImport, 
  4.     namedExport1, 
  5.     namedExport2 
  6.   } = await import('./mixedExportModule'); 
  7.   // ... 
  8.  
  9. loadMyModule(); 

3.何時(shí)使用動(dòng)態(tài)導(dǎo)入

建議在模塊比較大的,或者要根據(jù)條件才導(dǎo)入的模塊可以使用動(dòng)態(tài)導(dǎo)入。

  1. async function execBigModule(condition) { 
  2.   if (condition) { 
  3.     const { funcA } = await import('./bigModuleA'); 
  4.     funcA(); 
  5.   } else { 
  6.     const { funcB } = await import('./bigModuleB'); 
  7.     funcB(); 
  8.   } 
  9.  
  10. execBigModule(true); 

對(duì)于小模塊(如前面例子中的namedConcat.js或defaultConcat.js),只有幾十行代碼,使用動(dòng)態(tài)導(dǎo)入在點(diǎn)殺雞用牛刀感覺(jué)。

總結(jié)

當(dāng)調(diào)用 import(pathToModule) 作為一個(gè)函數(shù)時(shí),其參數(shù)表示一個(gè)模塊的指定符(又稱路徑),那么就會(huì)動(dòng)態(tài)加載該模塊。

在這種情況下,module = await import(pathToModule) 返回一個(gè) promise ,該承諾解析為一個(gè)包含導(dǎo)入模塊組件的對(duì)象。

Node.js(13.2及以上版本)和大多數(shù)現(xiàn)代瀏覽器都支持動(dòng)態(tài)導(dǎo)入。

作者:Dmitri Pavlutin

譯者:前端小智 來(lái)源:dmitripavlutin原文:https://dmitripavlutin.com/ecmascript-modules-dynamic-import/

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。

責(zé)任編輯:姜華 來(lái)源: 大遷世界
相關(guān)推薦

2025-02-07 15:58:43

2021-12-27 07:59:50

ECMAScript JSON模塊Node.js

2021-04-18 07:20:09

CMS系統(tǒng)模塊

2021-09-07 10:29:11

JavaScript模塊CSS

2020-09-08 08:27:25

JavaScript模塊ECMAScript

2017-10-30 12:50:40

Google

2022-07-10 21:20:11

C語(yǔ)言Linux

2011-07-01 15:53:19

Python 模塊

2011-06-21 14:42:37

ECMAScriptJavaScript

2022-08-26 13:56:30

模塊JavaScript

2023-03-23 09:04:32

ECMAScript元組結(jié)構(gòu)

2020-12-23 14:18:43

JavaScript模塊導(dǎo)出

2020-07-16 07:50:53

Nginx模塊動(dòng)態(tài)

2023-01-05 08:00:24

RegExpFoo類字段

2009-12-17 09:56:26

Linux添加驅(qū)動(dòng)模塊

2019-10-24 15:28:41

Python程序員數(shù)據(jù)

2015-11-13 11:33:39

阮一峰ecmascript

2010-05-10 13:30:27

LTE戰(zhàn)略SAMI模塊

2010-07-20 16:00:09

Perl模塊

2023-07-17 10:21:25

TC39JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久久久国产精品 | 国产在线观看不卡一区二区三区 | 欧美性猛片aaaaaaa做受 | 久久国产日韩欧美 | 午夜影院| 亚洲一区二区在线 | 亚洲视频一区在线观看 | 丁香婷婷综合激情五月色 | 欧美成人手机视频 | 成人精品在线观看 | 亚洲一区二区视频 | 日韩精品中文字幕一区二区三区 | 97av视频| 欧美v在线| 国产精品一区二区在线播放 | 亚洲精品一 | 午夜精品久久久久久久久久久久 | 亚洲手机视频在线 | 久久精品国产亚洲 | 操视频网站| 国产一卡二卡三卡 | 国产一区二区精品在线观看 | aaa在线观看 | 国产精品片aa在线观看 | 国产午夜精品久久久久免费视高清 | 日韩网站在线 | 日韩毛片免费视频 | 中文字幕欧美日韩一区 | 久草www| 少妇一级淫片免费播放 | 欧美精品1区 | 国产日韩一区二区三免费高清 | 91在线网 | www国产精品| 亚洲毛片在线 | 亚洲最大的黄色网址 | 亚洲欧洲一区二区 | 国偷自产av一区二区三区 | 亚洲国产欧美91 | 久久精品国产一区二区电影 | 亚洲精品女优 |