怎么在ES6中使用Module模塊-創(chuàng)新互聯(lián)

本篇文章為大家展示了怎么在ES6中使用Module模塊,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

從事樂山服務(wù)器托管,服務(wù)器租用,云主機,雅安服務(wù)器托管,域名注冊,CDN,網(wǎng)絡(luò)代維等服務(wù)。

一、Module簡介

ES6的Class只是面向?qū)ο缶幊痰恼Z法糖,升級了ES5的構(gòu)造函數(shù)的原型鏈繼承的寫法,并沒有解決模塊化問題。Module功能就是為了解決這個問題而提出的。

歷史上,JavaScript一直沒有模塊(module)體系,無法將一個大程序拆分成互相依賴的小文件,再用簡單的方法拼裝起來。其他語言都有這項功能。

在ES6之前,社區(qū)制定了一些模塊加載方案,最主要的有CommonJS和AMD兩種。前者用于服務(wù)器,后者用于瀏覽器。ES6在語言規(guī)格的層面上,實現(xiàn)了模塊功能,而且實現(xiàn)得相當簡單,完全可以取代現(xiàn)有的CommonJS和AMD規(guī)范,成為瀏覽器和服務(wù)器通用的模塊解決方案。

ES6模塊的設(shè)計思想,是盡量的靜態(tài)化,使得編譯時就能確定模塊的依賴關(guān)系(這種加載稱為“編譯時加載”),以及輸入和輸出的變量。CommonJS和AMD模塊,都只能在運行時確定這些東西。

瀏覽器使用ES6模塊的語法如下。

<script type="module" src="fs.js"></script>

上面代碼在網(wǎng)頁中插入一個模塊fs.js,由于type屬性設(shè)為module,所以瀏覽器知道這是一個ES6模塊。

// ES6加載模塊
import { stat, exists, readFile } from 'fs';

上面代碼通過import去加載一個Module,加載其中的一些方法。

二、import 和 export

模塊功能主要由兩個命令構(gòu)成:export和import。export命令用于規(guī)定模塊的對外接口,import命令用于輸入其他模塊提供的功能。

一個模塊就是一個獨立的文件。該文件內(nèi)部的所有變量,外部無法獲取。如果你希望外部能夠讀取模塊內(nèi)部的某個變量,就必須使用export關(guān)鍵字輸出該變量。下面是一個JS文件,里面使用export命令輸出變量。

// profile.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;

export的寫法,除了像上面這樣,還有另外一種。(推薦這種,因為這樣就可以在腳本尾部,一眼看清楚輸出了哪些變量。)

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;
export {firstName, lastName, year};

export命令除了輸出變量,還可以輸出函數(shù)或類(class)。通常情況下,export輸出的變量就是本來的名字,但是可以使用as關(guān)鍵字重命名。

function v1() { ... }
function v2() { ... }
export {
  v1 as streamV1,
  v2 as streamV2,
  v2 as streamLatestVersion
};

使用export命令定義了模塊的對外接口以后,其他JS文件就可以通過import命令加載這個模塊(文件)。

// main.js
import {firstName, lastName, year} from './profile';
function setName(element) {
  element.textContent = firstName + ' ' + lastName;
}

上面代碼的import命令,就用于加載profile.js文件,并從中輸入變量。import命令接受一個對象(用大括號表示),里面指定要從其他模塊導(dǎo)入的變量名。大括號里面的變量名,必須與被導(dǎo)入模塊(profile.js)對外接口的名稱相同。

如果想為輸入的變量重新取一個名字,import命令要使用as關(guān)鍵字,將輸入的變量重命名。

import { lastName as surname } from './profile';

import命令具有提升效果,會提升到整個模塊的頭部,首先執(zhí)行。

foo();
import { foo } from 'my_module';

三、模塊的整體加載

除了指定加載某個輸出值,還可以使用整體加載,即用星號(*)指定一個對象,所有輸出值都加載在這個對象上面。

有一個circle.js文件,它輸出兩個方法area和circumference。

現(xiàn)在,加載這個模塊。

// main.js
import { area, circumference } from './circle';
console.log('圓面積:' + area(4));
console.log('圓周長:' + circumference(14));

上面寫法是逐一指定要加載的方法,整體加載的寫法如下。

import * as circle from './circle';
console.log('圓面積:' + circle.area(4));
console.log('圓周長:' + circle.circumference(14));

四、export default

為了給用戶提供方便,讓他們不用閱讀文檔就能加載模塊,就要用到export default命令,為模塊指定默認輸出。

// export-default.js
export default function () {
  console.log('foo');
}

上面代碼是一個模塊文件export-default.js,它的默認輸出是一個函數(shù)。

其他模塊加載該模塊時,import命令可以為該匿名函數(shù)指定任意名字。

// import-default.js
import customName from './export-default';
customName(); // 'foo'

需要注意的是,這時import命令后面,不使用大括號。

本質(zhì)上,export default就是輸出一個叫做default的變量或方法,然后系統(tǒng)允許你為它取任意名字。它后面不能跟變量聲明語句。

// 正確
var a = 1;
export default a;
// 錯誤
export default var a = 1;

五、ES6模塊加載的實質(zhì)

ES6模塊加載的機制,與CommonJS模塊完全不同。CommonJS模塊輸出的是一個值的拷貝,而ES6模塊輸出的是值的引用。

CommonJS模塊輸出的是被輸出值的拷貝,也就是說,一旦輸出一個值,模塊內(nèi)部的變化就影響不到這個值。請看下面這個模塊文件lib.js的例子。

// lib.js
var counter = 3;
function incCounter() {
 counter++;
}
module.exports = {
 counter: counter,
 incCounter: incCounter,
};

上面代碼輸出內(nèi)部變量counter和改寫這個變量的內(nèi)部方法incCounter。然后,在main.js里面加載這個模塊。

// main.js
var mod = require('./lib');
console.log(mod.counter); // 3
mod.incCounter();
console.log(mod.counter); // 3

上面代碼說明,lib.js模塊加載以后,它的內(nèi)部變化就影響不到輸出的mod.counter了。這是因為mod.counter是一個原始類型的值,會被緩存。除非寫成一個函數(shù),才能得到內(nèi)部變動后的值。

// lib.js
var counter = 3;
function incCounter() {
 counter++;
}
module.exports = {
 get counter() {
  return counter
 },
 incCounter: incCounter,
};

上面代碼中,輸出的counter屬性實際上是一個取值器函數(shù)?,F(xiàn)在再執(zhí)行main.js,就可以正確讀取內(nèi)部變量counter的變動了。

ES6模塊的運行機制與CommonJS不一樣,它遇到模塊加載命令import時,不會去執(zhí)行模塊,而是只生成一個動態(tài)的只讀引用。等到真的需要用到時,再到模塊里面去取值,換句話說,ES6的輸入有點像Unix系統(tǒng)的“符號連接”,原始值變了,import輸入的值也會跟著變。因此,ES6模塊是動態(tài)引用,并且不會緩存值,模塊里面的變量綁定其所在的模塊。

還是舉上面的例子。

// lib.js
export let counter = 3;
export function incCounter() {
 counter++;
}
// main.js
import { counter, incCounter } from './lib';
console.log(counter); // 3
incCounter();
console.log(counter); // 4

上面代碼說明,ES6模塊輸入的變量counter是活的,完全反應(yīng)其所在模塊lib.js內(nèi)部的變化。

由于ES6輸入的模塊變量,只是一個“符號連接”,所以這個變量是只讀的,對它進行重新賦值會報錯。

// lib.js
export let obj = {};
// main.js
import { obj } from './lib';
obj.prop = 123; // OK
obj = {}; // TypeError

上面代碼中,main.js從lib.js輸入變量obj,可以對obj添加屬性,但是重新賦值就會報錯。因為變量obj指向的地址是只讀的,不能重新賦值,這就好比main.js創(chuàng)造了一個名為obj的const變量。

最后,export通過接口,輸出的是同一個值。不同的腳本加載這個接口,得到的都是同樣的實例。

// mod.js
function C() {
 this.sum = 0;
 this.add = function () {
  this.sum += 1;
 };
 this.show = function () {
  console.log(this.sum);
 };
}
export let c = new C();

上面的腳本mod.js,輸出的是一個C的實例。不同的腳本加載這個模塊,得到的都是同一個實例。

// x.js
import {c} from './mod';
c.add();
// y.js
import {c} from './mod';
c.show();
// main.js
import './x';
import './y';

現(xiàn)在執(zhí)行main.js,輸出的是1。這就證明了x.js和y.js加載的都是C的同一個實例。

上述內(nèi)容就是怎么在ES6中使用Module模塊,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文名稱:怎么在ES6中使用Module模塊-創(chuàng)新互聯(lián)
當前URL:http://muchs.cn/article24/dpspce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、電子商務(wù)App設(shè)計、定制開發(fā)、小程序開發(fā)、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管