Module理解及使用

来源:https://www.cnblogs.com/wang-fan-w/archive/2023/02/19/17134976.html
-Advertisement-
Play Games

ES6的模塊化設計思想是靜態化,也就是說,在編譯的時候確定模塊的依賴關係,以及輸出輸出入的變數。而CommonJS和AMD模塊都是在運行時確定的。ES6的模塊不是對象,而是通過export顯示指定輸出的代碼,再通過import命令輸入。 // 模塊輸入 import { start,address ...


ES6的模塊化設計思想是靜態化,也就是說,在編譯的時候確定模塊的依賴關係,以及輸出輸出入的變數。而CommonJSAMD模塊都是在運行時確定的。ES6的模塊不是對象,而是通過export顯示指定輸出的代碼,再通過import命令輸入。

// 模塊輸入
import { start,address } from 'util'

上面的模塊輸入載入了兩個方法,即使util模塊內有其它方法也不會載入,只會載入上面引入的兩個方法,這種載入稱為“編譯時載入”或靜態載入

需要註意的是,ES6的模塊自動採取嚴格模式,不管頭部有沒有加上"use strict"都會開啟嚴格模式。嚴格模式的限制如下:

1、變數必須先聲明再使用
2、函數參數不能有同名屬性,否則報錯
3、不能使用with語句
4、不能對只讀屬性賦值,否則報錯
5、不能使用首碼0表示八進位數,否則報錯
6、不能刪除不可刪除的屬性,否則報錯
7、不能刪除變數delete prop,會報錯,只能刪除屬性delete global[prop]
8、eval不會在它的外層作用域引入變數
9、evalarguments不能被重新賦值
10、arguments不會自動反映函數參數的變化
11、不能使用arguments.callee
12、不能使用arguments.caller
13、禁止this指向全局對象
14、不能使用fn.callerfn.arguments獲取函數調用的堆棧
15、增加了保留字(比如protectedstaticinterface


export和import命令

模塊主要有exportimport構成,export規定模塊對外的介面,import用於輸入模塊提供的功能。
模塊導出

// util模塊
// 類型
function type(a){
    return typeof a
}
// 計算
function sum(a,b) {
    return a * b 
}
// 判斷是否為數組
function isArray(a) {
    return a instanceof Array
}
export { type,sum }  // 按需導出

模塊導入

import {  type,sum } from './util'
let num = sum(10,5)
console.log(num) // 50

上面兩種方式是可選的方式導出的,也就是說,import導入模塊的時候,只會載入export導出的方法,其它的方法不會被import載入,並且import引入util模塊可以按需引入,引入自己需要的模塊即可,其它未引入的模塊也不會載入,這也就是靜態載入的好處。

除了export { xxx,xxx }的按需導出外,ES6還提供了export default的預設導出,預設導出的方法,在import導入的時候,不需要跟導出名一直,可以自定義名稱接收導出的方法。

// util模塊
// 計算
function sum(a,b) {
    return a * b 
}
// 判斷是否為數組
function isArray(a) {
    return a instanceof Array
}

export default sum // 預設導出
import aaa from './util'  // 導入時名字可以自定義
let num = aaa(10,5)
console.log(num) // 50

其實這個default就是一個叫做default的變數,這個變數可以被任意命名,在import導入的時候,取任何名稱都可以匹配上default導出的方法。

按需和預設導出
export { xxx,xxx }export default預設導出可以同時使用

// util模塊
function type(a){
    return typeof a
}

function sum(a,b) {
    return a * b 
}

function isArray(a) {
    return a instanceof Array
}

export { type,sum }
export default isArray
// 導入
import { type,sum }from './util'  
import aaa from './util'  

模塊的整體載入

上面的導出方法都是載入模塊內對應的方法,模塊的整體載入要使用*,也就是載入全部,語法如下

import * as util from './util';
// 在頁面中使用
let num = util.sum(10,5)
console.log(num)  // 50

這種寫法是將模塊整體載入,用*指定一個對象,所有輸出的值都載入在這個對象上面。通過該對象.方法名來獲取對應方法。
需要註意的是,ES6的模塊是靜態分析的,不允許對模塊進行改變,所以下麵寫法是不允許的:

util.sum = 'hello' // 報錯
util.sum = function () {} // 報錯

模塊繼承

模塊之間也是可以繼承的,假設A模塊繼承了B模塊

// A模塊
function sum(a,b) {
    return a * b 
}

function isArray(a) {
    return a instanceof Array
}

export * from 'B'  // 輸出B模塊的所有屬性和方法,忽略模塊內的default方法
export { sum } 
export default isArray

export * 命令會忽略B模塊的default方法,因為A模塊內部有自己的default方法。


模塊的重命名

// util模塊
export { sum as s }
// 頁面
import { s } from './util'  // 引入命名後的方法

模塊按需引入import()

正常情況下import是需要在頁面頂層引入的,並且import的引入執行的優先順序是最高的,例如:

let s = sum(10,5)
import { sum } from './util' 

上面這種寫法是允許的,程式會執行import的引入,然後再執行let s = sum(10,5),但這種寫法會預設導入模塊,並且是在頂層導入。
es6提供了動態導入功能:import(),當程式執行到該語句的時候才會導入,並且是同步執行,import()返回的是一個Promise,所以可以使用then方法和async-await
Promise寫法

import('./util.js')
.then(el=>{
   console.log(el.t(100));  // number
   console.log(el.sum(10,5));  // 50
})

async-await寫法

async function getImport(){
      let { sum } = await import('./util.js')
      console.log(sum(2,8));
}
getImport()  // 16

也可以通過解構的方式獲取

import('../module/import.js')
.then(({sum})=>{
     console.log(sum(20,5));  // 100
})

如果模塊是default預設導出,其實default就是一個鍵名

import('../module/import.js')
.then((e)=>{
   console.log(e.default([1,2,3]));  // true
})

default也可以通過具名的形式導入(取別名)

import('../module/import.js')
.then(({default : isA})=>{
     console.log(isA([1,2,3]));  // true
})

import.meta

在使用一個模塊時,有時候需要知道該模塊本身的信息(比如模塊的路徑),import命令新增了一個元屬性import.meta,可以返回當前模塊的信息。
註意import.meta只能在模塊內使用,在模塊外使用會報錯

// util模塊
function sum(a,b) {
    return a * b 
}

function getMeta(){
    return import.meta  // 獲取當前模塊的元信息
}

export { sum,getMeta }
// console.log(import.meta);  // import.meta只能在模塊內使用,在模塊外部使用會報錯
import('./util.js')
.then(el=>{
      console.log(el.getMeta());  // {url: 'http://127.0.0.1:5500/module/import.js', resolve: ƒ}
})

在這裡插入圖片描述


案例源碼:https://gitee.com/wang_fan_w/es6-science-institute

如果覺得這篇文章對你有幫助,歡迎點亮一下star喲


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.說說在Linux系統部署ASP.NET Core項目的步驟。 2.說說熱重載是什麼。 3.如何理解鑒權和授權兩個詞 4.說說.NET7包含了幾大方向的開發? 5.如何理解雲原生? 6.ASP.NET Core應用程式部署IIS,需要準備什麼? 7.如何理解MVC5的管道和ASP.NET Core ...
  • 一、部署gitlab 這裡使用的是Centos8,安裝Docker環境 ,這裡不說了,參考:https://www.cnblogs.com/wei325/p/15139701.html gitlab有ce版和ee版,ce版為免費版本;ee版為企業版本,需要收費;企業使用ce版足夠了,這裡用ce版。 ...
  • 打算整理彙編語言與介面微機這方面的學習記錄。本部分介紹8086的匯流排。 參考資料 西電《微機原理與系統設計》周佳社 西交《微機原理與介面技術》 課本《彙編語言與介面技術》王讓定 小甲魚《彙編語言》 1. 匯流排定義與分類 講道理這部分學校老師不強調這個,尤其是引腳(說我們記不住),而視頻里老師講得很多 ...
  • 為什麼要提升<報警有效性> 過多的報警會讓負責人麻木 過多的報警會增加簡訊和電話的成本 提升根因定位效率 如何定義<報警有效性> 不漏報 不誤報 不重報 不延報 如何量化 MTTF (Mean Time To Failure,平均無故障時間):平均正常運行時間 MTTR (Mean Time To ...
  • 大家好,我是良許,新年快樂呀~ 在我女室友堅持不懈的努力之下,2022年的最後一天我終於被她傳染了,陽了~ 此時的我,正頂著37多度的低燒寫下這篇年終總結。 2022年,對於大多數人而言,封控是主旋律——不停地核酸,不停地居家。特別是對於做實體行業的小伙伴,真的是損失慘重。 我在廣州租住的地方有個步 ...
  • 效果圖 隨著輸入的文本自動增加高度,鍵盤上方自定義菜單佈局,隨鍵盤彈起 點擊編輯框,自動滾動到焦點處輸入 佈局層次 <ConstraintLayout> <ScrollView> <LinearLayout> <Edittext/> <自定義佈局/> </LinearLayout> </Scroll ...
  • require.js是一個js腳本載入器(模塊化載入),它遵循AMD(Asynchronous Module Definition)規範,實現js腳本的非同步載入,不阻塞頁面的渲染和其後的腳本的執行,並提供了在載入完成之後的執行相應回調函數的功能。官網下載地址:https://requirejs.or ...
  • 項目背景 最近在準備開發工作流引擎相關模塊,完成表結構設計後開始著手流程設計器的技術選型,調研了眾多開源項目後決定基於jsplumb.js開源庫進行自研開發,保證定製化的便捷性,相關效果圖及項目地址如下 項目地址:https://gitee.com/code2roc/fast-flow-desgio ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...