請注意: 此頁為 Parcel 1 的說明,Parcel 2 版本的說明頁面尚未完成。

📝 資源類型

如同 資源 一章所述,Parcel 視每個輸入的檔案為一個 資源 (Asset)。 資源類型代表著從 資源 類別繼承而來的類別,其實作了必要的介面以分析相依套件、轉換及產生程式碼。

Parcel 利用多核心並行處理資源,因此僅能進行同一時間處理單一檔案的資源類型轉換。若需轉換多種檔案則需自訂一個 Packager。

資源介面

const { Asset } = require('parcel-bundler')

class MyAsset extends Asset {
  type = 'foo' // 設定主要輸出類別

  async parse(code) {
    // 將程式碼解析為抽象語法樹 (AST)
    return ast
  }

  async pretransform() {
    // 非必要。在收集相依套件之前進行轉換
  }

  collectDependencies() {
    // 分析相依套件
    this.addDependency('my-dep')
  }

  async transform() {
    // 非必要。在收集相依套件後進行轉換
  }

  async generate() {
    // 產生程式碼。必要時可回傳多個轉換結果。
    // 結果將會傳給適當的 Packager 進行最終打包。
    return [
      {
        type: 'foo',
        value: 'my stuff here' // 主要輸出
      },
      {
        type: 'js',
        value: 'some javascript', // 若有需要可將此轉換結果一同打包
        sourceMap
      }
    ]
  }

  async postProcess(generated) {
    // 在產生程式碼後進行處理,可用來組合多種類型的資源
  }
}

module.exports = MyAsset

註冊資源類型

你可以使用 addAssetType 方法在打包工具中註冊你的資源類型,其接受欲註冊的副檔名及你的資源類型模型路徑。 為了將模型傳遞至 worker 中執行,這裡僅需傳入路徑而非實際的物件。

const Bundler = require('parcel-bundler')

let bundler = new Bundler('input.js')
bundler.addAssetType('.ext', require.resolve('./MyAsset'))

協助我們讓本文件更加完善

若有什麼內容遺漏了或是敘述不清楚的地方,請在本站的 repository 中開啟一個 issue 或者編輯此頁面。