JavaScript ES6 module 模塊

来源:https://www.cnblogs.com/polk6/archive/2018/01/31/js-ES6-module.html
-Advertisement-
Play Games

在使用JavaScript開發大型項目時,模塊開發概念是一個必須考慮的問題。其目的就是通過命名空間對各類業務對象進行一定的封裝,防止命名衝突。 本篇著重介紹ES6 module中的export和import概念。 ...


在使用JavaScript開發大型項目時,模塊開發概念是一個必須考慮的問題。其目的就是通過命名空間對各類業務對象進行一定的封裝,防止命名衝突。

本篇著重介紹ES6 module中的export和import概念。

 

1. ES5的模塊支持方案

在ES6之前,JavaScript本身沒有模塊支持,但社區創造了令人印象深刻的解決方案。兩個最重要的(也是不相容的)標準是:AMD 和 CommonJS

1.1 AMD

說明:AMD,全稱為Asynchronous Module Definition,即非同步模塊定義。

特點:其模塊和依賴都可以進行非同步載入。

// 定義AMD模塊
define('User/UserGrid', // 模塊ID
    ['UserM'], // 依賴文件
    function(userM) { // 初始化函數,依賴文件以參數形式加入
    }
);

// 使用AMD模塊
require(['User/UserGrid'],
    function(userGrid) {
    }
);

 

1.2 CommonJS

說明:CommonJS模塊規範初衷是用於node.js伺服器端,以提供額外的功能,如:IO、文件系統等功能。

特點

①同步載入;只有載入完成,才能執行後面的操作。

②緩存載入;第一次載入時會把內容存入緩存,以後的載入都是從緩存獲取。

示例

// math.js(定義模塊)
exports.add = function(a, b) {
    return a + b;
};

// app.js(使用模塊)
var math = require('./math');

var rs = math.add(1, 2);
console.log(rs);

瞭解更多AMD 與 CommonJS 知識可參考此文章:Writing Modular JavaScript With AMD, CommonJS & ES Harmony

 

2. ES6 module

ES6 module 結合了CommonJS和AMD的優點:類似CommonJS,具有簡潔的語法,對迴圈依賴的支持;類似AMD,支持非同步載入和有條件的模塊載入。

ES6 module 使用 export 導出模塊的內容,並使用 import 導入模塊的內容。

2.1 瀏覽器原聲支持

使用之前,先看下各瀏覽器對原生ES6 module的支持情況:Chrome61及61+、Edge16及16+版本都已支持

使用方式:

以Chrome為例,在引入ES6 module 的JS文件時,使用屬性 type="module" 即可:

<script type="module" src="js/math.js"></script>
<script type="module" src="js/app.js"></script>

 

2.2 export 導出(定義模塊)

創建ES6模塊時,可使用export關鍵字導出(對外提供)模塊的內容,如函數、對象以及原始變數等等。

export 導出方案有2種:Named exports(命名導出;每個模塊可有多個)和 Default exports(預設導出;每個模塊只能一個)。

1) Named exports 命名導出

說明:使用 export + 名稱 的形式導出模塊的內容。

註意:在 import 導入過程中,需指定這些名稱。

語法

// 1)聲明時導出
export var myVar1 = 'a';
export let myVar2 = 'b';
export const MY_CONST = 'c';
export function myFunc() {}

// 2)聲明後導出
var myVar3 = 'a';
export { myVar3 };

// 3)別名導出
var myVar4 = 'a';
export { myVar4 as myVar };

示例

// math.js
export function add(a, b) {
    return a + b;
}

// app.js:導入含有命名導出的模塊時,需要指定成員名稱
import { add } from './math.js';
console.log(add(1, 2)); // => 3

// demo.html
<script type="module" src="js/math.js"></script>
<script type="module" src="js/app.js"></script>

 

2) Default exports 預設導出

說明:使用 export default 導出模塊預設的內容,每個模塊只能有一個 export default。

語法

// 1)聲明時導出
export default expression;
export default function () {}

// 2)別名設置為default導出
export default function name1() {}
export { name1 as default };

示例:預設導出聲明的是一個表達式,通常沒有名字,導入時需指定模塊名稱。

// math.js
export function add(a, b) {
    return a + b;
}
export default function cube(x) {
    return x * x * x;
}

// app.js:導入預設導出的模塊時,需要指定模塊名稱
import cube from './math.js';
console.log(cube(3)); // => 27
// 若想同時導入含有預設導出、命名導出的模塊,只需要導入時用','隔開
// import cube, { add } from './math.js';

// demo.html
<script type="module" src="js/math.js"></script>
<script type="module" src="js/app.js"></script>

 

2.3 import 導入模塊

使用 import 可導入創建的模塊。

語法

// 1)導入模塊的預設導出內容
import defaultExport from 'module-name';

// 2)導入模塊的命名導出內容
import { export1, export2 } from 'module-name';
import { export as alias } from 'module-name'; // 修改別名
import * as name from 'module-name'; // 導入模塊內的所有命名導出內容

// 3)導入模塊的預設導出、命名導出
import defaultExport, { export1, export2 } from 'module-name';
import defaultExport, * as name from 'module-name';

 

1) 導入預設導出

說明:導入預設導出的模塊時,需要指定模塊名稱

示例

// math.js
export default function cube(x) {
    return x * x * x;
}

// app.js:導入預設導出的模塊時,需要指定模塊名稱
import cube from './math.js';
console.log(cube(3)); // => 27

 

2) 導入命名導出

說明:導入模塊時可使用大括弧包含指定命名成員;也可以用  * as moduleName 的形式把此模塊的所有命名導出作為某個對象的成員。

示例

// math.js
export function add(a, b) {
    return a + b;
}

// app.js:指定使用math模塊的add命名導出
import { add } from './math.js';
console.log(add(1, 2)); // => 3

// 導入所有的命名導出作為math對象的成員
import * as math from './math.js'; 
console.log(math.add(1, 2)); // => 3

 

3) 僅導入模塊

說明:僅導入模塊時,只會執行模塊的全局函數,不會導入任何成員。

示例

// math.js
export function add(a, b) {
    return a + b;
}
(function() {
    console.log('hello math.js');
})();

// app.js
import { add } from './math.js'; // => hello math.js

 

4. 擴展閱讀

ECMAScript 6 modules: the final syntax :http://2ality.com/2014/09/es6-modules-final.html 

MDN export :https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export

MDN import:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

 

End Web開發之路系列文章 菜單載入中...
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概述 關於Mycat的原理網上有很多,這裡不再詳述,對於我來說Mycat的功能主要有如下幾種: 1.Mysql主從的讀寫分離 2.Mysql大表分片 3.其他資料庫例如Oracle,MSSQL,DB2等的讀寫分離和分片。 之所以第3點單獨列出來只是因為它不常用,而且使用的JDBC,連接Mysql ...
  • 一,iOS硬體/設備的類型。 iPad的問世,就是在這一方向上邁出的第一步。第一代iPad使用了ARM Cortex-A8架構的CUP,它的速度大約是第一代iPhone所使用CPU速度的兩倍。 iPad2和iPhone4S則是另一個巨大的跨越。它們都使用了ARM Cortex-A9架構的雙核處理器, ...
  • 2018-01-3116:58:12 今天這一天可把我累壞了,累到崩潰!本來計劃在vs2010上面安裝opencv的,可照著教程裝了半天,總會出現和教程不一樣的界面,所以,再加上,最近想學安卓的opencv,於是乎便轉戰eclipse安裝opencv opencv在vs2010上面的配置教程http ...
  • 1.框架 我使用Realm來作為資料庫的框架,還有SDAutoLayout做適配。不會用的,也沒關係,這兩個框架簡單的很。 2.邏輯設置 日記記錄的時候就記錄三個數據,標題,內容,寫日記的時間。這個時間精確到秒,相當於資料庫的主鍵。我們點擊以前寫的日記項,也可以對其進行修改,這個時間也會修改。 3. ...
  • github項目代碼地址,歡迎start https://github.com/979451341/EventLine 接著上一篇繼續寫,這次我們要在接收函數上使用元註解來區別接收函數需要在哪個線程執行 然後在EventLine裡面添加兩個常量 使用元註解 實現我們需要得到activity的rece ...
  • 引言,有一天我在調試一個界面,xml佈局裡面包含Scroll View,裡面嵌套了recyclerView的時候,界面一進去,就自動滾動到了recyclerView的那部分,百思不得其解,上網查了好多資料,大部分只是提到瞭解決的辦法,但是對於為什麼會這樣,都沒有一個很好的解釋,本著對技術的負責的態度 ...
  • 在移動端開打過程中,經常會用到通知和推送,例如有簡訊來了需要通知提示,手機橫屏了需要通知提示,插上耳機了需要通知提示等等,我們可以根據這些通知採取對應的動作。iOS系統自身定義了很對通知,但是在開發過程中我們也可以進行自定義一些通知,然後利用NSNotificationCenter在需要的時候進行發 ...
  • 我新建了一個web前端的新手交流群,包括基礎知識和剛入職的技術分享,人還不多,期待著每一個人的加入,希望可以得到你的認同哦~你的加入是我組織交流群的一大動力哦!~ 歡迎大佬進駐,有很多萌新等待大佬的幫助哦! web前端交流QQ群:314439765 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...