Transformer

Transformer 外掛會轉換單一資源,以編譯它、找出相依性,或將它轉換成不同的格式。許多 transformer 是包裝在其他工具(例如編譯器和預處理器)周圍,並負責將它們整合到 Parcel 中。

轉換資源

#

有一個必要的函式必須傳遞給 Transformer 建構函式:transform。此函式會接收一個 MutableAsset 物件,它代表一個檔案。可以擷取資源的原始碼或內容,以及任何關聯的原始碼地圖(請見下方)。然後,transformer 可以用某種方式轉換此內容,並將編譯結果設定回資源。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
// Retrieve the asset's source code and source map.
let source = await asset.getCode();
let sourceMap = await asset.getMap();

// Run it through some compiler, and set the results
// on the asset.
let {code, map} = compile(source, sourceMap);
asset.setCode(code);
asset.setMap(map);

// Return the asset
return [asset];
}
});

載入設定

#

應該在 Transformer 外掛的 loadConfig 方法中載入使用者的專案設定。請參閱 載入設定,以取得如何執行此操作的詳細資訊。

注意:使用 Parcel 的設定載入機制非常重要,這樣才能適當地失效快取。避免直接從檔案系統載入檔案。

變更資源類型

#

變壓器可以將資產從一種格式轉換為另一種格式,例如從 TypeScript 轉換為 JavaScript。若要執行此操作,請將資產的 type 屬性設定為新的檔案類型 (例如 js)。然後,資產將由與新類型相符的管道處理。請參閱 Parcel 組態文件中的 變壓器 以取得詳細資訊。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
let code = await asset.getCode();

let result = compile(code);
asset.type = 'js';
asset.setCode(result);

return [asset];
}
});

環境

#

資產與 Environment 關聯,其中說明應如何編譯資產。相同的資產可以用不同的環境處理多次,例如,在為現代和舊有目標建置時。如果可能,變壓器外掛程式在編譯程式碼時應考慮環境,以確保結果在目標中運作並針對目標進行最佳化。請參閱 目標 以取得詳細資訊。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
let code = await asset.getCode();

let result = asset.env.isBrowser()
? compileForBrowser(code, asset.engines.browser)
: compileForNode(code, asset.engines.node);

asset.setCode(result);
return [asset];
}
});

請參閱 Environment API 文件以取得可用屬性的詳細資訊。

新增相依性

#

除了轉換資產的內容外,變壓器外掛程式還負責找出程式碼中的相依性,以便 Parcel 也能處理這些相依性。有些變壓器不需要擔心這一點,因為其他變壓器會在之後執行並執行此操作 (例如預設的 JavaScript 變壓器)。如果您要新增對 Parcel 支援的現有語言之一未編譯的新語言的支援,或以其他方式在編譯的程式碼之外引入相依性,您需要將它們新增到資產中。

可以使用 addDependency 方法將相依性新增到資產,傳遞 DependencyOptions 物件。有兩個必要的參數:specifier,它是描述相依性位置的字串,以及 specifierType,它描述應如何詮釋 specifier。請參閱 相依性解析 以取得詳細資訊。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
let code = await asset.getCode();
let deps = code.matchAll(/import "(.*?)"/g);

for (let dep of deps) {
asset.addDependency({
specifier: dep,
specifierType: 'esm'
});
}

return [asset];
}
});

影響組合

#

指定依賴項的方式會影響其打包方式。預設情況下,依賴項會打包在一起,成為同一個輸出檔案。依賴項的 priority 屬性可以指定是延遲載入,還是與依賴於它的資產並行載入。例如,JavaScript 中的動態 import() 會以 lazy 優先順序載入依賴項。請參閱 程式碼分割

bundleBehavior 屬性進一步控制依賴項的打包方式。例如,可以將依賴項分隔到新的套件中,但透過將 bundleBehavior 設為 inline,將其內嵌到父項中。請參閱 套件內嵌

請參閱 DependencyOptions,進一步了解每個可用選項的詳細資訊。

URL 依賴項

#

在某些語言中,依賴項會透過 URL 參照其他檔案。在編譯後的程式碼中,這些 URL 參照需要更新,才能指向最終的套件名稱。然而,當資產正在轉換時,套件名稱尚未得知。

addDependency 會傳回唯一的依賴項 ID。這可以作為最終套件 URL 的佔位符,置於已轉換的資產內容中,而當 URL 得知時,稍後會由 Packager 取代。

作為捷徑,addURLDependency 方法會建立一個依賴項,其中 specifierType 設為 url,而 priority 設為 lazy(以建立獨立的套件)。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
let code = await asset.getCode();
let result = code.replace(/import "(.*?)"/g, (m, dep) => {
// Replace the original specifier with a dependency id
// as a placeholder. This will be replaced later with
// the final bundle URL.
let depId = asset.addURLDependency(dep);
return `import "${depId}"`;
});

asset.setCode(result);
return [asset];
}
});

重複使用 AST

#

如果多個 Transformer 外掛程式在資產上依序執行,如果它們可以重複使用相同的已剖析 AST,那麼剖析、轉換和產生程式碼會很浪費。Parcel 透過將 transform 函式分割成多個部分,來促進 AST 共享

import {Transformer} from '@parcel/plugin';
import semver from 'semver';

export default new Transformer({
async canReuseAST({ast}) {
return ast.type === 'my-compiler'
&& semver.satisfies(ast.version, '^1.0.0');
},
async parse({asset}) {
return {
type: 'my-compiler',
version: '1.0.0',
program: parse(await asset.getCode())
};
},
async transform({asset}) {
let ast = await asset.getAST();

let compiledAST = compile(ast.program);
asset.setAST({
type: 'my-compiler',
version: '1.0.0',
program: compiledAST
});

return [asset];
},
async generate({ast}) {
let {content, map} = generate(ast.program);
return {
content,
map
};
}
});

原始碼對應表

#

原始碼對應表可協助開發人員在瀏覽器中偵錯已編譯和已套件化的程式碼,方法是將已編譯程式碼中的位置對應回原始程式碼。如果可能,Transformer 外掛程式應該在轉換其內容時將原始碼對應表新增到資產中。由於資產可能由多個 Transformer 處理,因此除了其內容之外,您還應該轉換資產中包含的現有原始碼對應表。

Parcel 使用 @parcel/source-map 函式庫來處理原始碼對應表。請參閱 原始碼對應表,以取得有關如何使用它的更多詳細資訊。您可能需要將傳遞給其他工具的原始碼對應表轉換成其他工具的格式。

import {Transformer} from '@parcel/plugin';
import SourceMap from '@parcel/source-map';

export default new Transformer({
async transform({asset, options}) {
let source = await asset.getCode();
let sourceMap = await asset.getMap();

// Convert the input source map to JSON.
let result = compile(source, sourceMap.toVLQ());
asset.setCode(result.code);

// Convert returned JSON source map to a Parcel SourceMap.
let map = new SourceMap(options.projectRoot);
map.addVLQMap(result.map);
asset.setMap(map);

return [asset];
}
});

二進位資料

#

除了文字原始碼之外,Transformer 也可以處理二進位內容。這可以使用 Buffer串流 來完成。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
let buffer = await asset.getBuffer();

let result = transform(buffer);
asset.setBuffer(result);

return [asset];
}
});

查詢參數

#

資產可能會被具有 查詢參數 的依賴項所參照。這些參數會指定轉換器在編譯或轉換資產時要使用的選項。例如,Parcel 影像轉換器 會使用查詢參數來讓使用者指定要將影像轉換成的寬度、高度和格式。相同的資產可能會使用不同的查詢參數編譯多次。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
let buffer = await asset.getBuffer();

let result = resize(
buffer,
asset.query.width,
asset.query.height
);

asset.setBuffer(result);
return [asset];
}
});

傳回多個資產

#

到目前為止,所有範例都顯示如何轉換單一資產。然而,有時一個檔案可能包含多個不同的資產。例如,在 HTML 中有內嵌的 <script><style> 元素,應該透過它們自己的獨立 Parcel 管線來處理。針對此情況,Parcel 允許從轉換器傳回多個資產。

若要建立新的資產,請傳回 TransformerResult 物件的陣列。這些物件必須有 typecontent,但也可以有自己的依賴項,以及許多與 Asset 物件相同的選項。

通常,原始資產應與它可能有的任何子資產一起傳回。父項可以透過指定 uniqueKey 屬性並將其參照為依賴項的 specifier 來建立對子項的依賴項。這允許建立實際上不存在於檔案系統中的「虛擬」資產,但可以像它們存在一樣被參照。

import {Transformer} from '@parcel/plugin';

export default new Transformer({
async transform({asset}) {
let code = await asset.getCode();

// Extract inline assets to return in addition to this asset.
let assets = [asset];

let uniqueKey = `${asset.id}-style`;
assets.push({
type: 'css',
content: '...',
uniqueKey,
bundleBehavior: 'inline'
});

// Add a dependency, using the uniqueKey as a specifier.
asset.addDependency({
specifier: uniqueKey,
specifierType: 'esm'
});

return assets;
}
});

相關 API

#

DependencyOptions parcel/packages/core/types/index.js:476

在建立 依賴項 時使用,請參閱該說明。

type DependencyOptions = {|
  +specifier: DependencySpecifier,

用於解析依賴項的指定項。

  +specifierType: SpecifierType,

指定項應如何被詮釋。

  • esm:ES 模組指定項。它會被解析為 URL,但裸指定項會被視為 node_modules。
  • commonjs:CommonJS 指定項。它不會被解析為 URL。
  • 網址:在瀏覽器中運作的網址。裸露的規格視為相對網址。
  • 自訂:自訂規格。必須由自訂解析器外掛程式處理。
  +priority?: DependencyPriority,

何時應載入相依性。

  • 同步:相依性應可同步解析。已解析的資產將放置在與父項相同的套件中,或已在頁面上的其他套件中。
  • 平行:相依性應放置在與目前套件平行載入的個別套件中。
  • 延遲:相依性應放置在稍後載入的個別套件中。

預設值:'sync'

  +bundleBehavior?: BundleBehavior,

控制已解析資產放置其中的套件行為。與 priority 結合使用,以決定何時載入套件。

  • 內嵌:已解析的資產將放置在新的內嵌套件中。內嵌套件不會寫入個別檔案,而是內嵌在父項套件中。
  • 孤立:已解析的資產將在個別套件中與其父項隔離。共用資產將會重複。
  +needsStableName?: boolean,

當相依性是套件項目(優先順序為「平行」或「延遲」)時,這會控制該套件的命名。needsStableName 表示名稱應隨著時間保持穩定,即使套件的內容有所變更。這對於使用者會手動輸入網址的項目很有用,以及服務工作人員或 RSS 饋送等項目,其中網址必須隨著時間保持一致。

  +isOptional?: boolean,

相依性是否為選用。如果無法解析相依性,這不會導致建置失敗。

  +loc?: SourceLocation,

找到相依性的原始檔中的位置。

  +env?: EnvironmentOptions,

相依性的環境。

  +packageConditions?: Array<string>,

解析 package.json「exports」和「imports」時要使用的自訂條件清單。這會與環境中的條件結合。不過,它會覆寫從 specifierType 推斷出的預設「import」和「require」條件。若要將這些條件納入自訂條件中,請明確將它們新增到此清單。

  +meta?: Meta,

依賴項的特定外掛元資料。

  +pipeline?: string,

.parcelrc 中定義的處理依賴項的管線。

  +resolveFrom?: FilePath,

應從中解析依賴項的檔案路徑。預設情況下,這是指定依賴項的原始檔路徑。

  +range?: SemverRange,

預期的依賴項 semver 版本範圍。

  +symbols?: $ReadOnlyMap<Symbol, {|
    local: Symbol,
    loc: ?SourceLocation,
    isWeak: boolean,
    meta?: Meta,
  |}>,

原始檔依賴的已解析模組中的符號。

|}
由下列項目參照
MutableAssetTransformerResult

Dependency parcel/packages/core/types/index.js:551

Dependency 表示兩個資產之間的連線(可能預期從被匯入者產生某些效果 - 無論是副作用或匯入值)。

interface Dependency {
  +id: string,

依賴項的 ID。

  +specifier: DependencySpecifier,

用於解析依賴項的指定項。

  +specifierType: SpecifierType,

指定項應如何被詮釋。

  • esm:ES 模組指定項。它會被解析為 URL,但裸指定項會被視為 node_modules。
  • commonjs:CommonJS 指定項。它不會被解析為 URL。
  • 網址:在瀏覽器中運作的網址。裸露的規格視為相對網址。
  • 自訂:自訂規格。必須由自訂解析器外掛程式處理。
  +priority: DependencyPriority,

何時應載入相依性。

  • 同步:相依性應可同步解析。已解析的資產將放置在與父項相同的套件中,或已在頁面上的其他套件中。
  • 平行:相依性應放置在與目前套件平行載入的個別套件中。
  • 延遲:相依性應放置在稍後載入的個別套件中。

預設值:'sync'

  +bundleBehavior: ?BundleBehavior,

控制已解析資產放置其中的套件行為。與 priority 結合使用,以決定何時載入套件。

  • 內嵌:已解析的資產將放置在新的內嵌套件中。內嵌套件不會寫入個別檔案,而是內嵌在父項套件中。
  • 孤立:已解析的資產將在個別套件中與其父項隔離。共用資產將會重複。
  +needsStableName: boolean,

當相依性是套件項目(優先順序為「平行」或「延遲」)時,這會控制該套件的命名。needsStableName 表示名稱應隨著時間保持穩定,即使套件的內容有所變更。這對於使用者會手動輸入網址的項目很有用,以及服務工作人員或 RSS 饋送等項目,其中網址必須隨著時間保持一致。

  +isOptional: boolean,

相依性是否為選用。如果無法解析相依性,這不會導致建置失敗。

  +isEntry: boolean,

依賴項是否為進入點。

  +loc: ?SourceLocation,

找到相依性的原始檔中的位置。

  +env: Environment,

相依性的環境。

  +packageConditions: ?Array<string>,

解析 package.json「exports」和「imports」時要使用的自訂條件清單。這會與環境中的條件結合。不過,它會覆寫從 specifierType 推斷出的預設「import」和「require」條件。若要將這些條件納入自訂條件中,請明確將它們新增到此清單。

  +meta: Meta,

依賴項的特定外掛元資料。

  +target: ?Target,

如果這是進入點,這是與該進入點關聯的目標。

  +sourceAssetId: ?string,

具有此依賴項的資產 ID。

  +sourcePath: ?FilePath,

具有此依賴項的資產檔案路徑。

  +sourceAssetType: ?string,

參照此依賴項的資產類型。

  +resolveFrom: ?FilePath,

應從中解析依賴項的檔案路徑。預設情況下,這是指定依賴項的原始檔路徑。

  +range: ?SemverRange,

預期的依賴項 semver 版本範圍。

  +pipeline: ?string,

.parcelrc 中定義的處理依賴項的管線。

  +symbols: MutableDependencySymbols,
}
由下列項目參照
BaseAssetBundleBundleGraphBundleGraphTraversableBundleTraversableDependencyOptionsDependencySpecifierMutableBundleGraphResolverResolvingProgressEventRuntimeAsset

ASTGenerator parcel/packages/core/types/index.js:639

type ASTGenerator = {|
  type: string,
  version: Semver,
|}
由下列項目參照
基本資產

BaseAsset parcel/packages/core/types/index.js:652

資產代表檔案或檔案的一部分。它可以代表任何資料類型,包括原始碼、二進位資料等等。資產可能存在於檔案系統中,也可能是虛擬的。

interface BaseAsset {
  +id: string,

資產的識別碼。

  +fs: FileSystem,

存放來源的檔案系統。

  +filePath: FilePath,

資產的檔案路徑。

  +type: string,

資產的類型。這最初對應於原始檔副檔名,但它可能會在轉換過程中變更。

  +query: URLSearchParams,

來自依賴查詢字串的資產轉換器選項。

  +env: Environment,

資產的環境。

  +isSource: boolean,

此資產是否是專案的一部分,而不是外部依賴項(例如在 node_modules 中)。這表示應套用使用專案組態的轉換。

  +meta: Meta,

資產的特定於外掛程式的元資料。

  +bundleBehavior: ?BundleBehavior,

控制資產被放入哪個捆綁包。

  • 內嵌:資產將被放入新的內嵌捆綁包中。內嵌捆綁包不會寫入到個別檔案中,而是嵌入到父捆綁包中。
  • 孤立:資產將在個別捆綁包中與其父項隔離。共用資產將會被複製。
  +isBundleSplittable: boolean,

如果資產用作捆綁包入口,這將控制該捆綁包是否可以分割成多個,或者是否必須將所有依賴項都放入單一捆綁包中。

  +sideEffects: boolean,

如果沒有使用資產的任何匯出,是否可以省略此資產。這最初由解析器設定,但可以由轉換器覆寫。

  +uniqueKey: ?string,

當轉換器傳回多個資產時,它可以給予它們唯一的金鑰來識別它們。這可以用於在封裝期間尋找資產,或透過使用唯一金鑰作為依賴項規格,來建立轉換器傳回的多個資產之間的依賴項。

  +astGenerator: ?ASTGenerator,

AST 的類型。

  +pipeline: ?string,

在 .parcelrc 中定義的處理資產的管線。

  +symbols: AssetSymbols,

資產匯出的符號。

  getAST(): Promise<?AST>,

傳回目前的 AST

  getCode(): Promise<string>,

傳回資產內容作為字串。

  getBuffer(): Promise<Buffer>,

傳回資產內容作為緩衝區。

  getStream(): Readable,

傳回資產內容作為串流。

  getMap(): Promise<?SourceMap>,

傳回資產的來源對應,如果可用。

  getMapBuffer(): Promise<?Buffer>,

傳回來源對應的緩衝區表示,如果可用。

  getDependencies(): $ReadOnlyArray<Dependency>,

傳回資產的相依性清單。

}
由下列項目參照
AssetMutableAssetResolveResult

MutableAsset parcel/packages/core/types/index.js:725

在轉換期間可用的可變動 Asset

interface MutableAsset extends BaseAsset {
  type: string,

資產的類型。這最初對應於原始檔副檔名,但它可能會在轉換過程中變更。

  bundleBehavior: ?BundleBehavior,

控制資產被放入哪個捆綁包。

  • 內嵌:資產將被放入新的內嵌捆綁包中。內嵌捆綁包不會寫入到個別檔案中,而是嵌入到父捆綁包中。
  • 孤立:資產將在個別捆綁包中與其父項隔離。共用資產將會被複製。
  isBundleSplittable: boolean,

如果資產用作捆綁包入口,這將控制該捆綁包是否可以分割成多個,或者是否必須將所有依賴項都放入單一捆綁包中。

預設值:

  sideEffects: boolean,

如果沒有使用資產的任何匯出,是否可以省略此資產。這最初由解析器設定,但可以由轉換器覆寫。

  +symbols: MutableAssetSymbols,

資產匯出的符號。

  addDependency(DependencyOptions): string,

新增相依性至資產。

  addURLDependency(url: string, opts: $Shape<DependencyOptions>): string,

新增網址相依性至資產。這是 addDependency 的捷徑,將 specifierType 設為「網址」,優先順序設為「延遲」。

  invalidateOnFileChange(FilePath): void,

當給定的檔案被修改或刪除時,使轉換失效。

  invalidateOnFileCreate(FileCreateInvalidation): void,

當符合的檔案被建立時,使轉換失效。

  invalidateOnEnvChange(string): void,

當給定的環境變數變更時,使轉換失效。

  setCode(string): void,

將資產內容設為字串。

  setBuffer(Buffer): void,

將資產內容設為緩衝區。

  setStream(Readable): void,

將資產內容設為串流。

  setAST(AST): void,

將資產的 AST 設為指定值。

  isASTDirty(): boolean,

傳回 AST 是否已被修改。

  setMap(?SourceMap): void,

將資產的來源對應設為指定值。

  setEnvironment(opts: EnvironmentOptions): void,
}
由下列項目參照
Transformer

Config parcel/packages/core/types/index.js:809

interface Config {
  +isSource: boolean,

此設定檔是否為專案的一部分,而非外部依賴項(例如在 node_modules 中)。這表示應套用使用專案設定檔的轉換。

  +searchPath: FilePath,

開始從中搜尋設定檔的檔案路徑。

  +env: Environment,

環境

  invalidateOnFileChange(FilePath): void,

當指定的檔案被修改或刪除時,使設定檔失效。

  invalidateOnFileCreate(FileCreateInvalidation): void,

當建立符合的檔案時,使設定檔失效。

  invalidateOnEnvChange(string): void,

當指定的環境變數變更時,使設定檔失效。

  invalidateOnStartup(): void,

僅在 Parcel 重新啟動時使設定檔失效。

  invalidateOnBuild(): void,

在每次建置時使設定檔失效。

  addDevDependency(DevDepOptions): void,

將開發依賴項新增至設定檔。如果開發依賴項或其任何依賴項變更,設定檔將失效。

  setCacheKey(string): void,

設定快取金鑰以供組態使用。預設情況下,這會計算傳遞至 invalidateOnFileChange 或由 getConfig 載入的檔案雜湊。如果沒有,則會使用從 loadConfig 傳回的結果雜湊。此方法可用於覆寫此行為並明確控制快取金鑰。這在僅使用檔案部分以避免不必要的無效化,或結果不可雜湊(即包含非序列化屬性,例如函式)時會很有用。

  getConfig<T>(filePaths: Array<FilePath>, options?: {|
    packageKey?: string,
    parse?: boolean,
    exclude?: boolean,
  |}): Promise<?ConfigResultWithFilePath<T>>,

在組態的 searchPath 的所有父目錄中搜尋具有給定名稱的組態檔案。

  getConfigFrom<T>(searchPath: FilePath, filePaths: Array<FilePath>, options?: {|
    packageKey?: string,
    parse?: boolean,
    exclude?: boolean,
  |}): Promise<?ConfigResultWithFilePath<T>>,

在傳遞的 searchPath 的所有父目錄中搜尋具有給定名稱的組態檔案。

  getPackage(): Promise<?PackageJSON>,

從組態的 searchPath 中找出最接近的 package.json。

}
由下列項目參照
BundlerNamerOptimizerPackagerResolverRuntimeTransformer

GenerateOutput parcel/packages/core/types/index.js:882

type GenerateOutput = {|
  +content: Blob,
  +map?: ?SourceMap,
|}
由下列項目參照
Transformer

TransformerResult parcel/packages/core/types/index.js:896

Transformer 可以傳回多個結果物件以建立新的資產。例如,一個檔案可能包含多個不同類型的部分,這些部分應由各自的轉換管線處理。

type TransformerResult = {|
  +type: string,

資產的類型。

  +content?: ?Blob,

資產的內容。需要內容或 AST

  +ast?: ?AST,

資產的 AST。需要內容或 AST

  +map?: ?SourceMap,

資產的原始碼對應。

  +dependencies?: $ReadOnlyArray<DependencyOptions>,

資產的相依性。

  +env?: EnvironmentOptions | Environment,

資產的環境。選項與輸入資產的環境合併。

  +bundleBehavior?: ?BundleBehavior,

控制資產被放入哪個捆綁包。

  • 內嵌:資產將被放入新的內嵌捆綁包中。內嵌捆綁包不會寫入到個別檔案中,而是嵌入到父捆綁包中。
  • 孤立:資產將在個別捆綁包中與其父項隔離。共用資產將會被複製。
  +isBundleSplittable?: boolean,

如果資產用作捆綁包入口,這將控制該捆綁包是否可以分割成多個,或者是否必須將所有依賴項都放入單一捆綁包中。

  +meta?: Meta,

資產的特定於外掛程式的元資料。

  +pipeline?: ?string,

在 .parcelrc 中定義的處理資產的管線。

  +sideEffects?: boolean,

如果沒有使用資產的任何匯出,是否可以省略此資產。這最初由解析器設定,但可以由轉換器覆寫。

  +symbols?: $ReadOnlyMap<Symbol, {|
    local: Symbol,
    loc: ?SourceLocation,
  |}>,

資產匯出的符號。

  +uniqueKey?: ?string,

當轉換器傳回多個資產時,它可以給予它們唯一的金鑰來識別它們。這可以用於在封裝期間尋找資產,或透過使用唯一金鑰作為依賴項規格,來建立轉換器傳回的多個資產之間的依賴項。

|}
由下列項目參照
Transformer

ResolveOptions parcel/packages/core/types/index.js:976

type ResolveOptions = {|
  +specifierType?: SpecifierType,

指定項應如何被詮釋。

  • esm:ES 模組指定項。它會被解析為 URL,但裸指定項會被視為 node_modules。
  • commonjs:CommonJS 指定項。它不會被解析為 URL。
  • 網址:在瀏覽器中運作的網址。裸露的規格視為相對網址。
  • 自訂:自訂規格。必須由自訂解析器外掛程式處理。
  +packageConditions?: Array<string>,

解析 package.json 的「exports」和「imports」時要使用的自訂條件清單。

|}
由下列項目參照
ResolveFn

ResolveFn parcel/packages/core/types/index.js:992

類型
type ResolveFn = (from: FilePath, to: string, options?: ResolveOptions) => Promise<FilePath>;
由下列項目參照
Transformer

Transformer parcel/packages/core/types/index.js:1063

轉換器外掛的方法。

type Transformer<ConfigType> = {|
  loadConfig?: ({|
    config: Config,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Promise<ConfigType> | ConfigType,
  canReuseAST?: ({|
    ast: AST,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => boolean,

是否可以重複使用來自先前轉換器的 AST(以防止重複解析)

  parse?: ({|
    asset: Asset,
    config: ConfigType,
    resolve: ResolveFn,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Async<?AST>,

將內容解析成 ast

  transform({|
    asset: MutableAsset,
    config: ConfigType,
    resolve: ResolveFn,
    options: PluginOptions,
    logger: PluginLogger,
  |}): Async<Array<TransformerResult | MutableAsset>>,

轉換資產和/或新增資產

  postProcess?: ({|
    assets: Array<MutableAsset>,
    config: ConfigType,
    resolve: ResolveFn,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Async<Array<TransformerResult>>,
標示為實驗性質

在轉換後進行一些處理

  generate?: ({|
    asset: Asset,
    ast: AST,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Async<GenerateOutput>,

AST 字串化

|}