【讀書筆記】【深入理解ES6】#13-用模塊封裝代碼

来源:http://www.cnblogs.com/Ryukaka/archive/2017/12/01/7944249.html
-Advertisement-
Play Games

詳述JavaScript的官方模塊風格。加入這一定義旨在代替過去幾年中出現過的許多非正式的模塊定義風格。 ...


什麼是模塊

模塊是自動運行在嚴格模式下並且沒有辦法退出運行的 JavaScript 代碼。
在模塊頂部創建的變數不會自動被添加到全局變數作用域,這個變數僅在模塊的頂級作用域中存在,而且模塊必須導出一些外部代碼可以訪問的元素。
模塊也可以從其他模塊導入綁定。

在模塊的頂部,this 的值是 undefined。
模塊不支持 HTML 風格的代碼註釋。

導出的基本語法

用 export 關鍵字將一部分已發佈的代碼暴露給其它模塊。

// 導出數據
export var color = "red";
export let name = "JiaJia";
export const magicNumber = 7

// 導出函數
export function sum(num1, num2) {
    return num1 + num2;
}

// 導出類
export class Rectangle {
    constructor(length, width) {
        this.length = length;
        this.width = width;
    }
}

// this is private function
function subtract(num1, num2) {
    return num1 - num2;
}

// define a function
function multiply(num1, num2) {
    return num1 * num2;
}

// export it
export multiply;

導入的基本語法

通過 import 關鍵字導入在另一個模塊中導出的功能。

import { identifier1, identifier2 } from "./example.js"

import 後面的大括弧表示從給定模塊導入的綁定(binding),關鍵字 from 表示從哪個模塊導入給定的綁定。
當從模塊中導入一個綁定時,它就好像使用 const 定義的一樣。結果是你無法定義另一個同名變數(包括導入另一個同名綁定),也無法在 import 語句前使用標識符或改變綁定的值。

導入單個綁定

import { sum } from "./example.js";

console.log(sum(1, 2)); // 3

// 拋出錯誤
sum = 1;

導入多個綁定

import { sum, multiply, magicNumber } from "./example.js"

console.log(sum(1, magicNumber)); // 8
console.log(multiply(1, 2)); // 2

導入整個模塊

// 命名空間導入
import * as example from "./example.js";

console.log(example.sum(1, example.magicNumber)); // 8
console.log(example.multiply(1, 2)); // 2

不管在 import 語句中把一個模塊導入了多少次,該模塊只執行一次。
如果同一個應用程式中的其他模塊也從 example.js 導入綁定,那麼這些模塊與此代碼將使用相同的模塊實例。

導入綁定的一個微妙怪異之處

export var name = "JiaJia";
export function setName(newName) {
    name = newName;
}
import { name, setName } from "./example.js";

console.log(name); // "JiaJia"
setName("L");
console.log(name); // "L"

name = "JiaJia"; // 拋出錯誤

導出和導入時重命名

function sum(num1, num2) {
    return num1 + num2;
}

export {
    sum as add
};
import { add as sum } from "./example.js";

模塊的預設值

模塊的預設值指的是通過 default 關鍵字指定的單個變數、函數或類,只能為每個模塊設置一個預設的導出值。

export default function (num1, num2) {
    return num1 + num2;
}

等同於

function sum (num1, num2) {
    return num1 +  num2;
}

export default sum;

等同於

function sum (num1, num2) {
    return num1 +  num2;
}

export { sum as default };

導入預設值

import sum from "./example.js";

console.log(sum(1, 2)); // 3

導入預設值和以外的值:

import sum, { color } from "./example.js";

或者

import { default as sum, color } from "./example.js";

重新導出一個綁定

import { sum } from "./example.js";
export { sum }

或者簡寫成如下形式:

export { sum } from "./example.js";

導出時也可以定義別名

export { sum as add } from "./example.js";

導出一切:

export * from "./example.js";

無綁定導入

// 沒有 export 或 import 的模塊代碼
Array.prototype.pushAll = function(items) {
    if (!Array.isArray(items)) {
        throw new TypeError("參數必須是一個數組");
    }

    return this.push(...items);
}
import "./example.js"

載入模塊

在Web瀏覽器中使用模塊

  • <script>元素中通過src屬性指定一個載入代碼的地址來載入 JavaScript 代碼文件
  • 將 JavaScript 代碼內嵌到沒有 src 屬性的<script>元素中
  • 通過 Web Worker 或 Service Worker 的方法載入並執行 JavaScript 代碼文件

<Script>中使用模塊

<!-- 載入一個 JavaScript 模塊文件 -->
<script type="model" src="module.js"></script>

<!-- 內聯引入一個模塊 -->
<script type="model">
import { sum } from "./example.js";
let result = sum(1, 2);
</script>

Web瀏覽器中的模塊載入順序

模塊按照它們出現在 HTML 文件中的順序執行,也就是說,無論模塊中包含的是內聯代碼還是指定 src 屬性,第一個 <script type="module"> 總是在第二個之前執行。

Web瀏覽器中的非同步模塊載入

當應用 async 屬性時,腳本文件將在文件完全下載並解析後執行。
腳本在文檔中的順序不會影響腳本執行的順序。

<!-- 無法保證這兩個哪個先執行 -->
<script type="module" async src="module1.js"></script>
<script type="module" async src="module2.js"></script>

將模塊作為 Worker 載入

Worker,例如 Web Worker 和 Service Worker,可以在網頁上下文之外執行 JavaScript 代碼。

// 預設按照腳本的方式載入 script.js
let worker = new Worker("script.js");
// 預設按照模塊的方式載入 script.js
let worker = new Worker("script.js", { type: "module" });

瀏覽器模塊說明符解析

瀏覽器要求模塊說明符具有以下幾種格式之一:

  • 以/開頭的解析為從根目錄開始
  • 以./開頭的解析為從當前目錄開始
  • 以../開頭的解析為從父目錄開始
  • 以URL格式
// 從 https://www.example.com/modules/example1.js 導入
import { first } from "./example1.js";

// 從 https://www.example.com/example2.js 導入
import { second } from "../example2.js";

// 從 https://www.example.com/example3.js 導入
import { third } from "./example3.js";

// 從 https://www.example.com/example4.js 導入
import { fourth } from "https://www.example.com/example4.js";

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

-Advertisement-
Play Games
更多相關文章
  • 磁碟整理是對磁碟長期使用過程中產生的不連續的文件碎片進行拼接、移動、整合,將不在一處的同一文件移動到一起,釋放出被浪費掉的可用磁碟空間,也便於系統快速準確地找到所需的數據。 由於磁碟的磁頭在讀寫文件時是連續讀取的,如果文件不連續,那麼磁頭就需要反反覆復來回掃描那些不連續的文件,再從緩存中將這些不連續 ...
  • 《Linux設備驅動》 -- 也就是我們所說的LDD3了; 適合一定基礎的人閱讀,深入學習Linux不可或缺的知識; 《UNIX環境高級編程》 這本書並不是面對linux內核的書,但是我是從最基礎看這本書逐步入門的; 《Linux內核完全剖析》 本書對早期Linux內核(v0.12)全部代碼文件進行 ...
  • 基礎知識: 1、Redis的數據類型: 字元串、列表(lists)、集合(sets)、有序集合(sorts sets)、哈希表(hashs)2、Redis和memcache相比的獨特之處: (1)redis可以用來做存儲(storge)、而memcache是來做緩存(cache)。這個特點主要是因為 ...
  • 1.1 負載均衡介紹 1.1.1 負載均衡的妙用 負載均衡(Load Balance)集群提供了一種廉價、有效、透明的方法,來擴展網路設備和伺服器的負載、帶寬、增加吞吐量、加強網路數據處理能力、提高網路的靈活性和可用性。 ü 單台電腦無法承受大規模的併發訪問或數據流量了,此時需要搭建負載均衡集群把 ...
  • 1、下載軟體包 wget http://pecl.php.net/get/redis-2.2.5.tgz 2、解壓 tar zxvf redis-2.2.5.tgz 3、進入安裝目錄 cd redis-2.2.5 4、用phpize生成configure配置文件 /usr/local/php/bin ...
  • 描述 前面我們已經對領域內的名詞進行了抽取,並且已經確定了業務流程中參與的核心對象。 但是對象只是靜態的描述,系統中往往會有很多的業務操作,偏演算法的,之前我們說過 領域內的對象往往是比較穩定不怎麼變化的,但是,業務的流程以及業務操作這些是往往 千變萬化,防不勝防,那麼我們如何去及時發現這些系統內變化 ...
  • 同步首發:http://www.yuanrengu.com/index.php/20171130.html 項目開發接近尾聲,開始著手在生產環境部署項目,開發階段部署項目都沒用nginx。項目是採用SOA架構,多系統開發,主要包括服務系統、中台系統、後臺系統、金融系統、介面系統、調度系統、報表系統等 ...
  • 1、一行超出文字隱藏 2、div顯示兩行文字,超出兩行部分省略號顯示 3、white-space屬性可設置不換行 4、word-break屬性設置自動換行的處理方法 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...