快取

在編寫 Rspack 外掛時,您可以使用 compiler.getCache(name: string)compilation.getCache(name: string) 來取得快取物件,該物件可以在建置過程中共享資料。快取資料儲存在 Compiler 上,因此可以在監看模式中的多個 Compilation 中使用。

注意
  • 僅在 cache: true 時可用,預設在 mode="development" 中啟用。
  • 僅用於 JavaScript 外掛,無法存取 Rust 快取。
  • 僅提供記憶體快取,目前尚不支援持久性快取。

範例

以下程式碼找出 processAssets 中新加入的資源

compiler.hooks.compilation.tap('MyPlugin', compilation => {
  compilation.hooks.processAssets.tapPromise('MyPlugin', async () => {
    const cache = compilation.getCache('MyPlugin');
    const currentAssets = compilation.getAssets().map(i => i.name);
    const lastAssets = await cache.getPromise('assets', null);
    if (lastAssets) {
      for (const asset of currentAssets) {
        if (!lastAssets.includes(asset)) {
          console.log(`New asset: ${asset}`);
        }
      }
    }
    await cache.storePromise('assets', null, currentAssets);
  });
});

方法

快取

get/getPromise

非同步取得快取資料,透過函式或 Promise 回呼。

  • 類型
    • get: <T>(identifier: string, etag: Etag | null, callback: (err: Error, result: T) => void): void
    • getPromise: <T>(identifier: string, etag: Etag | null): Promise<T>;
  • 參數
    • identifier:資料項目的 ID
    • etag:資料項目的 Etag,可以使用 getLazyHashedEtag 產生

store/storePromise

非同步儲存快取資料,透過函式或 Promise 回呼。

  • 類型
    • store: <T>(identifier: string, etag: Etag | null, data: T, callback: (err: Error) => void): void;
    • storePromise: <T>(identifier: string, etag: Etag | null): Promise<T>;
  • 參數
    • identifier:資料項目的 ID
    • etag:資料項目的 Etag,可以使用 getLazyHashedEtag 產生

provide/providePromise

嘗試非同步取得快取資料,如果不存在則呼叫計算函式產生,透過函式或 Promise 回呼。

  • 類型
    • provide:
      provide<T>(
        identifier: string,
        etag: Etag | null,
        computer: (fn: (err: Error, result: T) => void) => void,
        callback: () => T | Promise<T>,
      ): void;
    • providePromise
      providePromise<T>(
        identifier: string,
        etag: Etag | null,
        computer: () => T | Promise<T>,
      ): Promise<T>;
  • 參數
    • identifier:資料項目的 ID
    • etag:資料項目的 Etag,可以使用 getLazyHashedEtag 產生
    • computer:當快取不存在時,呼叫的產生函式
MyPlugin.js
const createAssetsData = async () => {
  console.log('only called once');
  return compilation.getAssets().map(i => i.name);
};

compilation.hooks.processAssets.tapPromise('MyPlugin', async () => {
  const cache = compilation.getCache('MyPlugin');
  console.log(await cache.getPromise('assets', null)); // undefined
  await cache.providePromise('assets', null, createAssetsData); // call createAssetsData
  console.log(await cache.getPromise('assets', null)); // ["main.js"]
  await cache.providePromise('assets', null, createAssetsData); // not call
});
輸出
undefined
only called once
[ 'main.js' ]

getLazyHashedEtag/mergeEtags

透過使用 getLazyHashedEtagmergeEtags 方法,可以建立一個 etag 作為資料項目的唯一識別符。它不會在建立時立即計算,而是會延遲到使用時才計算,並且還可以快取。當複雜的資料物件用作唯一識別符時,可以使用此方法來提高效能。

  • getLazyHashedEtag(obj: HashableObject): Etag,計算物件的雜湊值以產生 etag 作為資料識別符,物件需要實作 updateHash(hash: Hash)
  • mergeEtags(a: Etag, b: Etag): Etag,將兩個 etag 合併為一個。
MyPlugin.js
const cache = compilation.getCache('MyPlugin');
const dataEtag = cache.getLazyHashedEtag({
  content: 'a'.repeat(10000),
  updateHash(hash) {
    console.log("only called once");
    hash.update(this.content);
  }
});
const mergedEtag = cache.mergeEtags(dataEtag, "other etag");
await cache.storePromise("assets", mergedEtag, "cached value");
console.log(await cache.getPromise("assets", mergedEtag));
輸出
only called once
cached value

getItemCache

透過使用 getItemCache 方法,可以建立單個資料項目的快取物件。此快取物件提供簡化的資料存取方法,不再需要識別符和 etag 作為引數。

  • 類型: (identifier, etag): ItemCacheFacade
type ItemCacheFacade = {
  get<T>(callback: (err: Error, result: T) => void): void; // async data getter, callback by function
  getPromise<T>(): Promise<T>; // async data getter, callback by promise
  store<T>(data: T, callback: (err: Error, result: T) => void): void; // async data setter, callback by function
  storePromise<T>(data: T): Promise<void>; // async data setter, callback by promise
  provide<T>( // try to get the data, use function to compute if not exists, callback by function
    computer: (fn: (err: Error, result: T) => void) => void,
    callback: (err: Error, result: T) => void,
  ): void;
  providePromise<T>( // try to get the data, use function to compute if not exists, callback by promise
    computer: (fn: (err: Error, result: T) => void) => void,
  ): Promise<T>;
};
MyPlugin.js
const cache = compilation.getCache('MyPlugin');
const itemCache = cache.getItemCache('item');
await itemCache.storePromise('cached value');
console.log(await itemCache.getPromise());
輸出
cached value

getChildCache

透過使用 getChildCache 方法,可以產生一個子快取物件,其介面完全一致,並且可以在需要分組儲存多個快取時使用。

  • 類型: (name: string): CacheFacade