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

這些 ECMAScript 模塊知識,都是我需要知道的

開發 前端
ECMAScript模塊(簡稱ES模塊)是一種JavaScript代碼重用的機制,于2015年推出,一經推出就受到前端開發者的喜愛。在2015之年,JavaScript 還沒有一個代碼重用的標準機制。多年來,人們對這方面的規范進行了很多嘗試,導致現在有多種模塊化的方式。

[[341136]]

ES 模塊是什么?

ECMAScript模塊(簡稱ES模塊)是一種JavaScript代碼重用的機制,于2015年推出,一經推出就受到前端開發者的喜愛。在2015之年,JavaScript 還沒有一個代碼重用的標準機制。多年來,人們對這方面的規范進行了很多嘗試,導致現在有多種模塊化的方式。

你可能聽說過AMD模塊,UMD,或CommonJS,這些沒有孰優孰劣。最后,在ECMAScript 2015中,ES 模塊出現了。

我們現在有了一個“正式的”模塊系統。

ES 模塊無處不在?

理論上,ES 模塊應該在所有JavaScript環境中。實際上,ES 模塊的主要應用還是在瀏覽器上。

2020年5月,Node.js v12.17.0 增加了在不使用標記前提下對ECMAScript模塊的支持。這意味著我們現在可以在Node.js中使用import和export,而無需任何其他命令行標志。

ECMAScript模塊要想在任何JavaScript環境通用,可能還需要很長的路要走,但方向是正確的。

ES 模塊是什么樣的

ES 模塊是一個簡單的文件,我們可以在其中聲明一個或多個導出。以下面utils.js為例:

  1. // utils.js 
  2. export function funcA() { 
  3.   return "Hello named export!"
  4.  
  5. export default function funcB() { 
  6.   return "Hello default export!"

這里有兩個導出。

第一個是命名導出,后面是export default,表示為默認導出。

假設我們的項目文件夾中有一個名為utils.js的文件,我們可以將這個模塊提供的對象導入到另一個文件中。

如何從 ES模塊 導入

假設我們在項目文中還有一個Consumer.js的文件。要導入utils.js公開的函數,我們可以這樣做:

  1. // consumer.js 
  2. import { funcA } from "./util.js"

這種對應我們的命名導入方式.

如果我們要導入 utils.js 中的默認導出也就是 funcB 方法,我們可以這樣做:

  1. // consumer.js 
  2. import { funcA } from "./util.js"

當然,我們可以導入同時導入命名和默認的:

  1. // consumer.js 
  2. import funcB, { funcA } from "./util.js"
  3.  
  4. funcB(); 
  5. funcA(); 

我們也可以用星號導入整個模塊:

  1. import * as myModule from './util.js'
  2.  
  3. myModule.funcA(); 
  4. myModule.default(); 

注意,這里要使用默認到處的方法是使用 default() 而不是 funcB()。

從遠程模塊導入:

  1. import { createStore } from "https://unpkg.com/redux@4.0.5/es/redux.mjs"
  2.  
  3. const store = createStore(/* do stuff */) 

瀏覽器中的 ES 模塊

現代瀏覽器支持ES模塊,但有一些警告。要使用模塊,需要在 script 標簽上添加屬性 type, 對應值 為 module。

  1. <html lang="en"
  2. <head> 
  3.     <meta charset="UTF-8"
  4.     <title>ECMAScript modules in the browser</title> 
  5. </head> 
  6. <body> 
  7. <p id="el">The result is: </p> 
  8. </body> 
  9. <script type="module"
  10.     import { appendResult } from "./myModule.js"
  11.  
  12.     const el = document.getElementById("el"); 
  13.     appendResult(el); 
  14. </script> 
  15. </html> 

 myModule.js 內容如下:

  1. export function appendResult(element) { 
  2.   const result = Math.random(); 
  3.   element.innerText += result; 

動態導入

ES 模塊是靜態的,這意味著我們不能在運行時更改導入。隨著2020年推出的動態導入(dynamic imports),我們可以動態加載代碼來響應用戶交互(webpack早在ECMAScript 2020推出這個特性之前就提供了動態導入)。

考慮下面的代碼:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>Dynamic imports</title> 
  6. </head> 
  7. <body> 
  8. <button id="btn">Load!</button> 
  9. </body> 
  10. <script src="loader.js"></script> 
  11. </html> 

再考慮一個帶有兩個導出的JavaScript模塊

  1. // util.js 
  2. export function funcA() { 
  3.   console.log("Hello named export!"); 
  4.  
  5. export default function funcB() { 
  6.   console.log("Hello default export!"); 

為了動態導入 util.js 模塊,我們可以點擊按鈕在去導入:

  1. / loader.js 
  2. const btn = document.getElementById("btn"); 
  3.  
  4. btn.addEventListener("click", () => { 
  5.   // loads named export 
  6.   import("./util.js").then(({ funcA }) => { 
  7.     funcA(); 
  8.   }); 
  9. }); 

這里使用解構的方式,取出**命名導出 ** funcA 方法:

  1. ({ funcA }) => {} 

ES模塊實際上是JavaScript對象:我們可以解構它們的屬性以及調用它們的任何公開方法。

要使用動態導入的默認方法,可以這樣做

  1. // loader.js 
  2. const btn = document.getElementById("btn"); 
  3.  
  4. btn.addEventListener("click", () => { 
  5.   import("./util.js").then((module) => { 
  6.     module.default(); 
  7.   }); 
  8. }); 

當作為一個整體導入一個模塊時,我們可以使用它的所有導出

  1. // loader.js 
  2. const btn = document.getElementById("btn"); 
  3.  
  4. btn.addEventListener("click", () => { 
  5.   // loads entire module 
  6.   // uses everything 
  7.   import("./util.js").then((module) => { 
  8.     module.funcA(); 
  9.     module.default(); 
  10.   }); 
  11. }); 

還有另一種用于動態導入的常見樣式,如下所示:

  1. const loadUtil = () => import("./util.js"); 
  2.  
  3. const btn = document.getElementById("btn"); 
  4.  
  5. btn.addEventListener("click", () => { 
  6.   // 
  7. }); 

loadUtil返回的是一個 promise,所以我們可以這樣操作

  1. const loadUtil = () => import("./util.js"); 
  2.  
  3. const btn = document.getElementById("btn"); 
  4.  
  5. btn.addEventListener("click", () => { 
  6.   loadUtil().then(module => { 
  7.     module.funcA(); 
  8.     module.default(); 
  9.   }) 
  10. }) 

動態導入看起來不錯,但是它們有什么用呢?

使用動態導入,我們可以拆分代碼,并只在適當的時候加載重要的代碼。在 JavaScript 引入動態導入之前,這種模式是webpack(模塊綁定器)獨有的。

像React和Vue通過動態導入代碼拆分來加載響應事件的代碼塊,比如用戶交互或路由更改。

動態導入JSON文件

假設我們項目有一個 person.json 文件,內容如下:

  1.   "name""Jules"
  2.   "age": 43 

現在,我們需要動態導入該文件以響應某些用戶交互。

因為 JSON 文件不是一個方法,所以我們可以使用默認導出方式:

  1. const loadPerson = () => import('./person.json'); 
  2.  
  3. const btn = document.getElementById("btn"); 
  4.  
  5. btn.addEventListener("click", () => { 
  6.   loadPerson().then(module => { 
  7.     const { name, age } = module.default
  8.     console.log(name, age); 
  9.   }); 
  10. }); 

這里我們使用解構的方式取出 name 和 age :

  1. const { name, age } = module.default

動態導入與 async/await

因為 import() 語句返回是一個 Promise,所以我們可以使用 async/await:

  1. const loadUtil = () => import("./util.js"); 
  2.  
  3. const btn = document.getElementById("btn"); 
  4.  
  5. btn.addEventListener("click", async () => { 
  6.   const utilsModule = await loadUtil(); 
  7.   utilsModule.funcA(); 
  8.   utilsModule.default(); 
  9. }) 

動態導入的名字

使用import()導入模塊時,可以按照自己的意愿命名它,但要調用的方法名保持一致:

  1. import("./util.js").then((module) => { 
  2.     module.funcA(); 
  3.     module.default(); 
  4.   }); 

或者:

  1. import("./util.js").then((utilModule) => { 
  2.   utilModule.funcA(); 
  3.   utilModule.default(); 
  4. }); 

作者:Valentino Gagliardib 譯者:前端小智 來源:valentinog

原文:https://www.valentinog.com/blog/es-modules/

本文轉載自微信公眾號「大遷世界」,可以通過以下二維碼關注。轉載本文請聯系大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2018-02-08 08:08:12

2022-04-28 12:17:26

瀏覽器連字符hyphens

2018-05-16 09:41:13

神經網絡NN函數

2016-01-20 09:44:22

物聯網標準

2018-04-27 09:58:51

2018-01-03 11:35:34

推送AndroidiOS

2016-11-17 18:37:44

機房建設

2014-09-01 14:31:11

2012-07-27 09:25:40

2017-10-02 10:39:48

2018-01-09 15:44:57

2022-02-09 16:25:34

區塊鏈技術加密貨幣

2015-07-15 10:26:29

2018-07-03 14:40:31

2019-02-01 10:23:05

2021-05-08 11:16:44

手機快充技術

2023-09-08 13:46:12

ArrayList數據存儲容器

2022-09-22 08:00:00

API開發數據

2023-01-20 11:51:40

性能測試系統

2011-12-13 10:16:34

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊色综合久久之综合久久 | 伊人婷婷 | 99成人| 日韩视频精品在线 | 国产精品一区二区久久久久 | 日本精品一区二区 | 日韩黄色av | 一区二区三区视频在线观看 | 国产欧美一区二区在线观看 | 亚洲高清视频在线 | 成人中文字幕在线观看 | 亚洲精品无人区 | 欧美中文字幕一区 | 精品96久久久久久中文字幕无 | 鸳鸯谱在线观看高清 | 国产香蕉视频在线播放 | 中文久久| 一级高清 | 国产第二页 | 日韩久久久久 | 日本成人片在线观看 | 国产一区二区三区在线免费 | 一区二区三区视频在线观看 | 久久成人一区二区三区 | 久久久一二三区 | 成人在线视频网 | 拍拍无遮挡人做人爱视频免费观看 | 欧美精选一区二区 | 成人99| 日韩在线一区二区 | 亚洲精品在 | 不卡一区二区三区四区 | 99精品欧美一区二区三区综合在线 | 欧美一区二区在线 | 激情 一区 | 日韩欧美视频网站 | 日韩欧美国产精品一区二区 | 日韩毛片在线免费观看 | 一区二区成人 | 国产成人精品久久二区二区91 | 日韩精品久久一区二区三区 |