Parcel API
Parcel API 可用於以程式化方式執行建置或監控專案變更。它與 Parcel CLI 使用的 API 相同。當您需要更多彈性,或需要將 Parcel 整合到其他建置系統時,請使用 API。
Parcel
建構函式
#Parcel API 可透過 @parcel/core
套件使用。您還需要一個預設設定檔,例如 @parcel/config-default
。
yarn add @parcel/core @parcel/config-default
接著,將此套件匯入您的程式並呼叫 Parcel
建構函式。它接受 InitialParcelOptions
物件,其中包含 Parcel CLI 使用的所有選項,以及更多選項。
有兩個必填參數
entries
– 字串或字串陣列,描述要建置的進入點。請參閱 進入點。config
或defaultConfig
– Parcel 設定檔的檔案路徑或套件規格。如果設定config
,則始終使用提供的設定檔,並忽略專案.parcelrc
。如果設定defaultConfig
,則專案的.parcelrc
優先,而defaultConfig
則作為備用。如果給定相對路徑或套件規格,則會相對於專案根目錄解析。
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default'
});
目標
#預設情況下,Parcel 會執行開發建置,但這可以透過將 mode
選項設定為 production
來變更,這會啟用範圍提升、縮小化等。請參閱 生產。
您也可以使用 defaultTargetOptions
來設定 目標 的值,如果它們未在專案中設定。例如,若要覆寫預設的瀏覽器目標,請使用 engines
選項。
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default',
mode: 'production',
defaultTargetOptions: {
engines: {
browsers: ['last 1 Chrome version']
}
}
});
當設定為陣列時,targets
選項可用於指定專案的哪些目標(如 package.json
中所述)要建置。例如,若要只建置專案的 modern
目標
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default',
targets: ['modern']
});
或者,targets
可以設定為物件,它將會覆寫專案中定義的任何目標。請參閱 目標 以取得有關可用選項的更多詳細資訊。
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default',
mode: 'production',
targets: {
modern: {
engines: {
browsers: ['last 1 Chrome version']
}
},
legacy: {
engines: {
browsers: ['IE 11']
}
}
}
});
環境變數
#環境變數,例如 NODE_ENV
,可以使用 env
選項設定。這允許設定變數,而不會覆寫 process.env
上的值。
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default',
mode: 'production',
env: {
NODE_ENV: 'production'
}
});
報告器
#預設情況下,當您使用 API 時,Parcel 不會將任何輸出寫入 CLI。這表示它不會報告狀態資訊,也不會為診斷提供漂亮的格式。可以使用 additionalReporters
選項來啟用這些功能,它會在 .parcelrc
中指定的任何報告器之外執行。@parcel/reporter-cli
外掛程式提供 CLI 使用的預設報告器,但您也可以使用任何其他報告器外掛程式。
import {Parcel} from '@parcel/core';
import {fileURLToPath} from 'url';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default',
additionalReporters: [
{
packageName: '@parcel/reporter-cli',
resolveFrom: fileURLToPath(import.meta.url)
}
]
});
建置
#建立 Parcel
執行個體後,您可以使用它來建置專案或監控變更。若要建置一次,請使用 run
API。這會傳回一個 Promise,如果建置成功,它將使用包含 BundleGraph
和一些其他資訊的 BuildSuccessEvent
來解析,或者如果建置失敗,則會拒絕錯誤。建置錯誤會有一個或多個 Diagnostic
物件附加在它們上,其中包含錯誤的詳細資訊。
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default'
});
try {
let {bundleGraph, buildTime} = await bundler.run();
let bundles = bundleGraph.getBundles();
console.log(`✨ Built ${bundles.length} bundles in ${buildTime}ms!`);
} catch (err) {
console.log(err.diagnostics);
}
觀看
#若要觀看專案變更並收到每個重新建置的通知,請使用 watch
API。傳遞一個回呼,以便在建置成功或失敗時呼叫。回呼會收到一個錯誤參數和一個事件物件。錯誤參數僅用於觀看期間的致命錯誤。正常的建置失敗會由 BuildFailureEvent
表示,其中包含 Diagnostic
物件的清單。
watch
也會傳回一個訂閱物件,當您要停止觀看時,您應該呼叫 unsubscribe
方法。
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default'
});
let subscription = await bundler.watch((err, event) => {
if (err) {
// fatal error
throw err;
}
if (event.type === 'buildSuccess') {
let bundles = event.bundleGraph.getBundles();
console.log(`✨ Built ${bundles.length} bundles in ${event.buildTime}ms!`);
} else if (event.type === 'buildFailure') {
console.log(event.diagnostics);
}
});
// some time later...
await subscription.unsubscribe();
開發伺服器
#開發伺服器包含在預設的 Parcel 組態中。它可以透過傳遞 serveOptions
給 Parcel
建構函式並在觀看模式中執行 Parcel 來啟用。熱重載可以透過設定 hmrOptions
來啟用。port
是唯一需要的選項,但其他選項(例如 HTTPS 選項)也可以設定。
import {Parcel} from '@parcel/core';
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default',
serveOptions: {
port: 3000
},
hmrOptions: {
port: 3000
}
});
await bundler.watch();
檔案系統
#Parcel 在核心和大多數外掛程式中使用抽象的檔案系統。預設情況下,它依賴於 Node.js fs
API,但 Parcel 也有 MemoryFS
實作。您可以使用 inputFS
選項來覆寫 Parcel 從中讀取來源檔案的檔案系統,並使用 outputFS
選項來覆寫 Parcel 將輸出(包括快取)寫入的檔案系統。
MemoryFS
位於 @parcel/fs
套件中。建構它需要傳遞一個 WorkerFarm
執行個體,以便檔案系統可以從多個執行緒讀取和寫入。您需要使用從 @parcel/core
匯出的 createWorkerFarm
函數建立一個工作農場,並將其傳遞給 MemoryFS
和 Parcel
建構函數。完成後,請務必對工作農場呼叫 end
以允許程序退出。
此範例將其輸出寫入記憶體檔案系統,並記錄每個建置套件的內容。
import {Parcel, createWorkerFarm} from '@parcel/core';
import {MemoryFS} from '@parcel/fs';
let workerFarm = createWorkerFarm();
let outputFS = new MemoryFS(workerFarm);
let bundler = new Parcel({
entries: 'a.js',
defaultConfig: '@parcel/config-default',
workerFarm,
outputFS
});
try {
let {bundleGraph} = await bundler.run();
for (let bundle of bundleGraph.getBundles()) {
console.log(bundle.filePath);
console.log(await outputFS.readFile(bundle.filePath, 'utf8'));
}
} finally {
await workerFarm.end();
}