1. 程式人生 > >JavaScript ES6 module 模組

JavaScript ES6 module 模組

在使用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);

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. 擴充套件閱讀

相關推薦

JavaScript ES6 module 模組

在使用JavaScript開發大型專案時,模組開發概念是一個必須考慮的問題。其目的就是通過名稱空間對各類業務物件進行一定的封裝,防止命名衝突。 本篇著重介紹ES6 module中的export和import概念。 1. ES5的模組支援方案 在ES6之前,JavaScript本身沒有模組支援,但社群

20181128——阮一峰ES6 Module模組

歷史上,JavaScript 一直沒有模組(module)體系,無法將一個大程式拆分成互相依賴的小檔案,再用簡單的方法拼裝起來。其他語言都有這項功能,比如 Ruby 的require、Python 的import,甚至就連 CSS 都有@import,但是 JavaScript 任何這方面的

ECMA Script 6_模組載入方案 ES6 Module 模組語法_import_export

1. 模組載入方案 commonJS 背景: 歷史上,JavaScript 一直沒有模組(module)體系, 無法將一個大程式拆分成互相依賴的小檔案,再用簡單的方法拼裝起來。 其他語言都有這項功能:  Ruby 的require Python 的import 甚至就連 CSS 都有

在瀏覽器中高效使用JavaScript module(模組)

在瀏覽器中也可以使用JavaScript modules(模組功能)了。目前支援這一特性的瀏覽器包括: Safari 10.1. 谷歌瀏覽器(Canary 60) – 需要在chrome:flags裡開啟”實驗性網路平臺功能(Experimental Web Platform)” Fire

ES6 Class Module模組化 案例

前言 這篇通過簡單說明ES6 Class和Module這個兩個成員。並且用這兩個成員製造模組化。 Class說明 Class(類)作用物件模組,也就是一個方法集合,像以前的prototype父類一樣,也一樣可以通過new來例項,用法基本一樣。所以只是換

前端模組化IIFE,commonjs,AMD,UMD,ES6 Module規範超詳細講解

[TOC] ## 為什麼前端需要模組化 在沒有模組化的時候,多個指令碼引入頁面,會造成諸多問題,比如: - 多人協同開發的時候,系統中可能會引入很多js指令碼,這些js會定義諸多全域性變數,這時候很容易出現變數名覆蓋的問題 ```html

JavaScript ES6中export及export default的區別

.net dem pre 知識庫 cit export article 知識 targe 本文原創地址鏈接:http://blog.csdn.net/zhou_xiao_cheng/article/details/52759632,未經博主允許不得轉載。 相信很多人都使用

JavaScript es6 class類的理解。

實例 leo super 提升 fin .info asc style function 在本篇文章我將會把我對JavaScript es6新特性class類的理解。本著互聯網的分享精神,我就將我自己的理解分享給大家。 使用es寫一個類(構造函數) 在es5中大家一般都這

JavaScript ES6 promiss的理解。

res 是我 服務器 同步 重寫 清晰 ajax 並不會 ret 本著互聯網的分享精神,我將我對promise的理解分享給大家。 JavaScript ES6的promise方法主要應用在處理異步函數返回的結果,註意他不是將異步函數轉換為同步函數,而是等異步函數有結果時在

javascript-es6中Set的用法

tle utf -c script ctype 用法 demo type htm <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <t

JavaScript ES6箭頭函數指南

ken dom元素 cat val 靈活 coffee stat elf rgs 前言 胖箭頭函數(Fat arrow functions),又稱箭頭函數,是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞說,箭頭函數的語法=>,是受到了Coff

JavaScript ES6 的let和const

str ava gre 而已 sting 全局 tom turn 賦值 1 作用域和提升 1.1 作用域(Scope) 某個變量名或者函數名,在某個程序片段中是否可見或者可訪問,如果是,那麽這個程序片段就是這個變量名或者函數名的作用域。比如: 1 var

es6+require混合開發,兼容es6 module,import,export之 加載css及公用date-main

plugins symbol 默認參數 安裝插件 alt 路徑 目的 編譯參數 row 大家好!上篇文章已經介紹了搭建文件夾,以及加載js文件。現在講一下加載css ,以及對baseUrl的理解 1.對項目結構的認知 一個項目的結構是根據項目的架構來決定的,當然也可以做到更

[Javascript] Delegate JavaScript (ES6) generator iteration control

style creat post for robot inside del word const We can execute generators from generators, and delegate the iteration control with t

JavaScript ES6 數組屬性、方法及其擴展

tin 方法 使用 拷貝 == 組元 truct 空數組 .... 1. 創建數組: 第一種是使用 Array 構造函數: var arr1 = new Array(); //創建一個空數組 var arr2 = new Array(20); // 創建一個包含20項

JavaScript --- ES6 Set 集合結構詳解

順序輸出 ole 指向 然而 htm FN sar syntax prop Set 對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。 1 const set1 = new Set([1, 2, 3, 4, 5]); 2 3 console.lo

JavaScript --- ES6 Map集合結構詳解

AS javascrip 屬性 手動 col 鍵值對 IV 基本 計算 Map 對象保存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。 語法 new Map([iterable]) 參數 iterableIterable 可以是一個數組或者其他 ite

ECMAScript 6知識點總結 --- Module模組

export命令 export var year = 2008; var year = 2008; export {year}; var year = 2008; export {year as time}; export語句不能放在函式中 import命令 import {

javascript es6新語法

es6 一些新的語法與用法 1: let新的方式定義變數 相比於之前的var宣告變數 有兩個好處 1.1 : 之前用var 定義變數 只有函式才會起到作用域的左右 在{ } 物件這樣的作用域裡面不起左右 而用let則會在{ } 裡面也會開啟一個作用域 1.2 : 沒有變數的提升 2:

JavaScript ES6部分語法

ES6是JavaScript語言的新版本,它也可以叫做ES2015,之前學習的JavaScript屬於ES5,ES6在它的基礎上增加了一些語法,ES6是未來JavaScript的趨勢,而且vue元件開發中會使用很多的ES6的語法,所以掌握這些常用的ES6語法是必須的。 變數宣告let和const