キャッシュ

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

`getLazyHashedEtag` と `mergeEtags` メソッドを使用することで、データ項目の一意の識別子として etag を作成できます。作成時にすぐに計算されるのではなく、使用されるまで遅延され、キャッシュすることもできます。 これは、複雑なデータオブジェクトが一意の識別子として使用される場合にパフォーマンスを向上させるために使用できます。

  • `getLazyHashedEtag`: `(obj: HashableObject): Etag`、オブジェクトのハッシュを計算してetagをデータ識別子として生成します。オブジェクトは `updateHash(hash: Hash)` を実装する必要があります。
  • `mergeEtags`: `(a: Etag, b: Etag): Etag`、2 つの etag を 1 つにマージします。
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`