全新打包工具-Parcel介紹

zhongzhong05發表於2017-12-08

Parcel的特性

  • 快速打包 - 多核編譯,以及檔案系統快取,即使在重新啟動之後也能快速重新構建。
  • 支援JS,CSS,HTML,檔案資源等- 不需要安裝任何外掛。
  • 在需要的時候自動使用Babel,PostCSS和PostHTML自動轉換模組 - 甚至是node_modules。
  • 零配置程式碼拆分,使用動態import語句分割。
  • 內建支援模組熱替換
  • 友好的錯誤記錄體驗,語法突出顯示的程式碼幀有助於查明問題。

比較

基於一個合理大小的應用程式,包含1726個模組,未壓縮有6.5M 。構建在2016年的MAcBook Pro,4核物理CPU。

打包工具 時間
browserify 22.98s
webpack 20.71s
parcel 9.98s
parcel - 開啟快取 2.64s

為什麼需要Parcel?

目前已經有很多的打包工具了,包括webpack和browserify。那麼為什麼我們還需要另外一個呢?主要原因是因為開發者的經驗。

許多的打包工具都是圍繞著配置和外掛構建的,而且為了讓應用正常的工作,超過500行的配置並不罕見。這些配置不僅繁瑣而且耗時。通常情況下,這可能導致次優化的應用傳送到生產環境。parcel被設計成零配置的:只需要將它指向應用程式的入口點,它就能正常工作。

目前現存的打包工具都非常慢。擁有大量檔案和依賴的大型應用可能需要花費幾分鐘的時間來構建,這在開發過程中隨著時間的變化而變得尤為痛苦。監聽檔案變更能夠幫助重新構建,但初始的啟動仍然非常慢。parcel利用工作執行緒編譯你的程式碼,利用現代的多核處理器能力。這導致了初始構建的速度大大提升。它還具有一個檔案系統快取,可以儲存每一個檔案的編譯結果,以便後續能夠更快的啟動。

最後,現有的打包工具都是圍繞字串載入/轉換構建的,其中轉換需要一個字串,解析它,進行一些轉換,然後再次生成程式碼。通常這樣會導致許多的解析和程式碼生成在單個檔案上執行,這是非常低效的。相反,parcel的轉換工作在AST上,因此每個檔案只有一個解析,多個轉換以及一個程式碼生成。

Parcel如何工作的?

parcel將資源樹轉換為bundle樹。許多其它的打包工具基本上都是基於js資源,其它格式都是貼上的-例如,預設情況下以字串的形式內嵌到js中。parcel是檔案型別無關的-它可以按照你期望的方式與任何型別的資源一起工作,無需配置。

parcel將一個入口點作為輸入,可以是任何型別的:JS檔案,HTML,CSS,圖片等。在parcel中定義了各種資源型別,它們知道如何處理特定的資源型別。資原始檔被解析,它的依賴關係被提取,並轉換成最終的編譯形式。這建立了一個資源樹。

一旦資源樹被構建,資源就被放入一個bundle樹中。為入口資源建立一個bundle,併為動態匯入的資源建立子bundle,這回導致程式碼拆分的發生。當匯入不同型別的資源的時候就會建立子bundle,例如如果你在js中匯入css檔案,它就會打包成對應js的兄弟bundle。如果一個資源需要多個bundle,它會被打包到最近的共同祖先,因此它不會被包含多次。

在構建bundle樹之後,每一個包都有特定的檔案型別的包裝器寫入檔案。

原文地址:https://github.com/parcel-bundler/parcel

相關文章