天天看點

30分鐘掌握ES6/ES2015核心内容(下)

這兩個家夥對應的就是es6自己的<code>module</code>功能。

我們之前寫的Javascript一直都沒有子產品化的體系,無法将一個龐大的js工程拆分成一個個功能相對獨立但互相依賴的小工程,再用一種簡單的方法把這些小工程連接配接在一起。

這有可能導緻兩個問題:

一方面js代碼變得很臃腫,難以維護

另一方面我們常常得很注意每個script标簽在html中的位置,因為它們通常有依賴關系,順序錯了可能就會出bug

在es6之前為解決上面提到的問題,我們得利用第三方提供的一些方案,主要有兩種CommonJS(伺服器端)和AMD(浏覽器端,如require.js)。

而現在我們有了es6的module功能,它實作非常簡單,可以成為伺服器和浏覽器通用的子產品解決方案。

ES6子產品的設計思想,是盡量的靜态化,使得編譯時就能确定子產品的依賴關系,以及輸入和輸出的變量。CommonJS和AMD子產品,都隻能在運作時确定這些東西。

上面的設計思想看不懂也沒關系,咱先學會怎麼用,等以後用多了、熟練了再去研究它背後的設計思想也不遲!好,那我們就上代碼...

首先我們回顧下require.js的寫法。假設我們有兩個js檔案: <code>index.js</code>和<code>content.js</code>,現在我們想要在<code>index.js</code>中使用<code>content.js</code>傳回的結果,我們要怎麼做呢?

首先定義:

然後require:

那CommonJS是怎麼寫的呢?

以上我把三者都列出來了,媽媽再也不用擔心我寫混淆了...

上面可以看出,export指令除了輸出變量,還可以輸出函數,甚至是類(react的子產品基本都是輸出類)

這裡輸入的時候要注意:大括号裡面的變量名,必須與被導入子產品(content.js)對外接口的名稱相同。

如果還希望輸入content.js中輸出的預設值(default), 可以寫在大括号外面。

此時我們不喜歡type這個變量名,因為它有可能重名,是以我們需要修改一下它的變量名。在es6中可以用<code>as</code>實作一鍵換名。

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

通常星号<code>*</code>結合<code>as</code>一起使用比較合适。

考慮下面的場景:上面的<code>content.js</code>一共輸出了三個變量(<code>default, say, type</code>),假如我們的實際項目當中隻需要用到<code>type</code>這一個變量,其餘兩個我們暫時不需要。我們可以隻輸入一個變量:

由于其他兩個變量沒有被使用,我們希望代碼打包的時候也忽略它們,抛棄它們,這樣在大項目中可以顯著減少檔案的體積。

ES6幫我們實作了!

不過,目前無論是webpack還是browserify都還不支援這一功能...

他們把這個功能叫做Tree-shaking,哈哈哈,意思就是打包前讓整個文檔樹抖一抖,把那些并未被依賴或使用的東西統統抖落下去。。。

看看他們官方的解釋吧:

Normally if you require a module, you import the whole thing. ES2015 lets you just import the bits you need, without mucking around with custom builds. It's a revolution in how we use libraries in JavaScript, and it's happening right now.

未完待續

本文轉自農夫山泉别墅部落格園部落格,原文連結:http://www.cnblogs.com/yaowen/p/7149045.html,如需轉載請自行聯系原作者

繼續閱讀