キャッシュ
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());
getChildCache
`getChildCache` メソッドを使用することで、子キャッシュオブジェクトを生成できます。そのインターフェースは完全に一貫しており、多数のキャッシュをグループ化して保存する必要がある場合に利用できます。
- 型: `(name: string): CacheFacade`