正如 資源文檔 里描述的,Parcel 將輸入的文件看作 資源(Asset)。資源類型被看作繼承自基準(zhǔn) Asset類的子類,并實現(xiàn)了必須的接口,去解析、分析依賴、轉(zhuǎn)換及生成代碼。
因為 Parcel 在多處理器內(nèi)核中并行處理資源,因此資源類型所能夠?qū)嵤┑霓D(zhuǎn)換行為,會被限制為那些可以 在單一時間內(nèi)操作單一文件的轉(zhuǎn)換行為。而那些需要操作多個文件的轉(zhuǎn)換行為,則需要一個自定義的Packager。
const { Asset } = require('parcel-bundler')
class MyAsset extends Asset {
type = 'foo' // 設(shè)置主要輸出類型
async parse(code) {
// 將代碼解析為 AST 樹
return ast
}
async pretransform() {
// 可選。在收集依賴之前轉(zhuǎn)換。
}
collectDependencies() {
// 分析依賴
this.addDependency('my-dep')
}
async transform() {
// 可選。在收集依賴之后轉(zhuǎn)換。
}
async generate() {
// 生成代碼。如有需要,可返回多個轉(zhuǎn)換(renditions)。
// 結(jié)果會傳到合適的 packagers 去生成最終的 bundles
return [
{
type: 'foo',
value: 'my stuff here' // 主輸出
},
{
type: 'js',
value: 'some javascript', // 如若需要,此轉(zhuǎn)換內(nèi)容可被放到 JS 的 bundle 中
sourceMap
}
]
}
async postProcess(generated) {
// 所有代碼生成后的過程
// 可用于組合多種類型資源
}
}
你可以用 addAssetType 方法在打包工具中去注冊你的資源類型。它接受一個文件擴(kuò)展名,以及資源類型模塊的路徑。它是一個路徑,而非實際的對象,這樣可以使它被傳至 worker 進(jìn)程中。
const Bundler = require('parcel-bundler')
let bundler = new Bundler('input.js')
bundler.addAssetType('.ext', require.resolve('./MyAsset'))
更多建議: