成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

[譯]ES6 模塊化入門

shmily / 2312人閱讀

摘要:當(dāng)我們學(xué)習(xí)的模塊化,就會發(fā)現(xiàn)它的發(fā)展深受的影響。嚴(yán)格模式在模塊系統(tǒng)中,嚴(yán)格模式是默認(rèn)開啟的。同樣的,模塊內(nèi)部的聲明只在模塊內(nèi)部有效。在中,我們使用導(dǎo)入內(nèi)容在模塊中,我們只需要為導(dǎo)入的綁定起一個(gè)名字我們也可以導(dǎo)入具名導(dǎo)出的內(nèi)容。

ES6 模塊系統(tǒng)

在 ES6 之前,我們已經(jīng)知道了 RequireJS,AngularJS 的依賴注入,以及 CommonJS,具體可以看筆者的上一篇文章《JS模塊化歷史簡介》。當(dāng)我們學(xué)習(xí) ES6 的模塊化,就會發(fā)現(xiàn)它的發(fā)展深受 CommonJS 的影響。通過這篇文章,我們將看到 exportimport 語句,以及 ES6 模塊是怎么與 CommonJS 模塊兼容的。

嚴(yán)格模式

在 ES6 模塊系統(tǒng)中,嚴(yán)格模式是默認(rèn)開啟的。嚴(yán)格模式是語言從語法層面限制你使用一些不好的寫法,所以它更嚴(yán)格(==)。它也讓編譯器更好地處理代碼。下面是 MDN上關(guān)于嚴(yán)格模式的解釋:嚴(yán)格模式

變量必須顯式聲明

函數(shù)的形參必須有唯一的名稱(否則會報(bào)語法錯(cuò)誤)

不能使用with

給只讀的屬性賦值會報(bào)錯(cuò)

00840 這樣的八進(jìn)制數(shù)字會報(bào)語法錯(cuò)誤

試圖 delete 無法刪除的屬性會報(bào)錯(cuò)

delete prop 會報(bào)語法錯(cuò)誤,可以使用 delete global[prop]

eval 不會在所在的詞法作用域引入新的變量

evalarguments 不能被改變或賦值

arguments 不會跟蹤方法的參數(shù)變化

arguments.callee 不再支持,會報(bào) TypeError

arguments.caller 不再支持,會報(bào) TypeError

傳入方法內(nèi)部的 this 不再被強(qiáng)制轉(zhuǎn)換成 Object

fn.callerfn.arguments 不再支持

保留關(guān)鍵字 protected,static ,interface 不能被綁定

即使在 ES6 中嚴(yán)格默認(rèn)是默認(rèn)開啟的,也推薦在每個(gè)模塊中都使用 use strict 關(guān)鍵字。

讓我們先來看下 export 關(guān)鍵字吧~

export

在 CommonJS 中,導(dǎo)出模塊可以用 module.exports 。從下面的代碼可以看出,你可以導(dǎo)出任何值:

module.exports = 1
module.export = NaN
module.exports = "foo" 
module.exports = { foo: "bar" } 
module.exports = ["foo", "bar"] 
module.exports = function foo () {}

像 CommonJS 模塊一樣,ES6 模塊也是暴露 API 的文件。同樣的,ES6 模塊內(nèi)部的聲明只在模塊內(nèi)部有效。這就意味著,某個(gè)模塊中的變量,如果沒有被導(dǎo)出,在其他模塊中就無法使用。

Exporting a Default Binding

上面的 CommonJS 代碼如果用 ES6 語法寫起來也很相似,主要就是將 module.exports 替換為 export default

export default 1 
export default NaN 
export default "foo" 
export default { foo: "bar" } 
export default ["foo", "bar"] 
export default function foo () {}

而與 CommonJS 不同的是,export 語句只能放在 ES6 模塊代碼的頂層,就算放在一個(gè)立即執(zhí)行的函數(shù)中也不行。可想而知,這種限制讓編譯器更容易解析 ES6 模塊,同時(shí)也讓避免了在方法中動(dòng)態(tài)導(dǎo)出這種不是很實(shí)用的騷操作。

function foo () { 
    export default "bar" // SyntaxError 
} 
foo()

導(dǎo)出語法不是只有 export default,你也可以使用具名導(dǎo)出。

Named Exports

在 CommonJS 中導(dǎo)出時(shí)也不是必須將 module.exports 賦值為一個(gè)對象,你可以直接改變它的屬性。

module.exports.foo = "bar"
module.exports.baz = "ponyfoo"

好了,下面用 ES6 的寫法也很簡單(原文說了一堆不太重要就沒翻~):

export var foo = "bar"
export var baz = "ponyfoo"

有一句話要始終牢記,我們導(dǎo)出的是綁定而不是值。

Bindings, Not Values

在 ES6 模塊中重要的一個(gè)點(diǎn)是:導(dǎo)出的是綁定,而不是值或者引用。這就意味著你導(dǎo)出的變量foo 被綁定在了模塊上,它的值改變了,外部也能收到變化。盡管通常情況下不推薦在模塊加載后改變導(dǎo)出的值。

如果你有一個(gè) ./a 模塊,導(dǎo)出的 foo 將在 500ms 后從 bar 變?yōu)?baz

export var foo = "bar"
setTimeout(() => foo = "baz", 500)

除了默認(rèn)綁定和具名綁定,我們還可以導(dǎo)出一個(gè)列表的綁定。

Exporting Lists

下面的代碼可以看到,ES6 模塊允許我們導(dǎo)出一個(gè)包含頂級成員的列表:

var foo = "ponyfoo"
var bar = "baz"
export { foo, bar }

如果你想改變其中變量的名字,可以用以下語法:

export { foo as ponyfoo }

同時(shí)也可以指定其中的某個(gè)為默認(rèn)導(dǎo)出:

export { foo as default, bar }

而通常的最佳實(shí)踐是只使用 export default,并且將其放在模塊的底部。

Best Practices and export

如果同時(shí)使用命名導(dǎo)出,導(dǎo)出列表和默認(rèn)導(dǎo)出,很容易造成困擾,所以大部分情況下作者建議只使用 export default,并且將語句放在模塊文件的底部。你可以將要導(dǎo)出的對象叫作 api

var api = {
    foo: "bar",
    baz: "ponyfoo"
}
export default api

這樣做有幾個(gè)好處:(原文比較啰嗦,下面提煉兩點(diǎn))

將導(dǎo)出的內(nèi)容包裹在一個(gè)對象中,在模塊內(nèi)部可以很容易找到導(dǎo)出的內(nèi)容。

只使用 export default 具有一致性,不會因?yàn)檫^多導(dǎo)出方式造成混淆,在使用的時(shí)候也更加方便。

我們已經(jīng)熟悉了 export 的 API 和注意事項(xiàng),下面來看 import 語句。

import

作為與 export 相對的語句,import 可以讓我們導(dǎo)入另一個(gè)模塊中的內(nèi)容。模塊的加載方式,在瀏覽器端主要依靠 Babel 實(shí)現(xiàn)。而在內(nèi)部 import 語句的實(shí)現(xiàn)也幾乎是和 CommonJS 的 require 語句一樣。

讓我們用 lodash 來說明。下面的語句簡單地加載了 Lodash 模塊到我們自己的模塊,它沒有創(chuàng)建任何變量,但它將會執(zhí)行 lodash 模塊頂層代碼的內(nèi)容。

import "lodash"

在講導(dǎo)入綁定之前,我們需要先明確的是,跟 export 語句類似,import 語句也只能在模塊的頂層代碼使用。這能讓編譯器更好地處理解析工作,也能幫助其他靜態(tài)分析工具解析我們的代碼。

Importing Default Exports

在 CommonJS 中,我們使用 require 導(dǎo)入內(nèi)容:

var _ = require("lodash")

在 ES6 模塊中,我們只需要為導(dǎo)入的綁定起一個(gè)名字:

import _ from "lodash"

我們也可以導(dǎo)入具名導(dǎo)出的內(nèi)容。

Importing Named Exports

這個(gè)語法跟 ES6 的解構(gòu)賦值很相似,但是也不太一樣:

import { map, reduce } from "lodash"

跟解構(gòu)賦值不同的其中一點(diǎn)是,你可以為導(dǎo)入的綁定創(chuàng)建別名,可以同時(shí)使用有別名和沒有別名的導(dǎo)入。

import { cloneDeep as clone, map } from "lodash"

也可以同時(shí)使用具名和默認(rèn)的導(dǎo)入,如果要在花括號內(nèi)使用默認(rèn)導(dǎo)入,需要使用 default 關(guān)鍵字,當(dāng)然也可以給它起個(gè)別名,或者像第三行那樣:

import { default, map } from "lodash"
import { default as _, map } from "lodash"
import _, { map } from "lodash"
import All The Things

我們也可以導(dǎo)入一個(gè)模塊中的整個(gè)命名空間。import * 這個(gè)語法后面必須跟一個(gè)別名,這個(gè)別名中就存放了導(dǎo)入模塊的所有綁定。如果里面包含一個(gè)默認(rèn)導(dǎo)出,那么它放被放在了 alias.default

import * as _ from "lodash"
Conclusions

我們今天可以直接使用 ES6 模塊,得益于 Babel 編譯器借助了 CommonJS 模塊的實(shí)現(xiàn)。這其中的一個(gè)好處就是 CommonJS 和 ES6 模塊之間是兼容的,即我們可以在 ES6 模塊中直接寫 CommonJS 的語法。

ES6 模塊系統(tǒng)看起來很棒,而它也是 JavaScript 中的一個(gè)最重要的功能。希望在不久的將來,模塊加載 API 可以最終敲定并直接在瀏覽器端實(shí)現(xiàn)。

原文鏈接

歡迎關(guān)注我的公眾號:碼力全開(codingonfire)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/105660.html

相關(guān)文章

  • 庫,組件,框架 - 收藏集 - 掘金

    摘要:哈哈,我理解,架構(gòu)就是骨架,如下圖所示譯年月個(gè)有趣的和庫前端掘金我們創(chuàng)辦的使命是讓你及時(shí)的了解開發(fā)中最新最酷的趨勢。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開發(fā)工程師) 本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結(jié)構(gòu) - ...

    tommego 評論0 收藏0
  • 即將立秋的《課多周刊》(第2期)

    摘要:即將立秋的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動(dòng)力。課多周刊機(jī)器人運(yùn)營中心是如何玩轉(zhuǎn)起來的分享課多周刊是如何運(yùn)營并堅(jiān)持下來的。 即將立秋的《課多周刊》(第2期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大...

    ruicbAndroid 評論0 收藏0
  • 即將立秋的《課多周刊》(第2期)

    摘要:即將立秋的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動(dòng)力。課多周刊機(jī)器人運(yùn)營中心是如何玩轉(zhuǎn)起來的分享課多周刊是如何運(yùn)營并堅(jiān)持下來的。 即將立秋的《課多周刊》(第2期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大...

    MRZYD 評論0 收藏0
  • 2017-10-01 前端日報(bào)

    2017-10-01 前端日報(bào) 精選 網(wǎng)頁保存為圖片及高清截圖的優(yōu)化方法前端最佳實(shí)踐(一)——DOM操作Vue 2.0學(xué)習(xí)筆記:v-bindReact Router v4 之代碼分割:從放棄到入門js實(shí)用的十個(gè)小技巧Netflix/falcor: A JavaScript library for efficient data fetchinglllyasviel/style2paints: ske...

    silencezwm 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<