aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-21 20:59:50 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-21 20:59:50 +0100
commitcad97041b39570e78b38352e60b4dae6870be3c2 (patch)
treea122f5c1155d85c6931ad0ec7e75706d8cf17066 /src
parentAlso compress Docusaurus-generated files (diff)
downloadblog-cad97041b39570e78b38352e60b4dae6870be3c2.tar.gz
blog-cad97041b39570e78b38352e60b4dae6870be3c2.tar.zst
blog-cad97041b39570e78b38352e60b4dae6870be3c2.zip
Simplify compression
Compress Docusaurus-generated files in a separate script instead of a post-build hook to avoid post-build hook ordering and concurrency issues.
Diffstat (limited to 'src')
-rw-r--r--src/plugins/compressionPlugin.ts49
1 files changed, 11 insertions, 38 deletions
diff --git a/src/plugins/compressionPlugin.ts b/src/plugins/compressionPlugin.ts
index 8b347cf..7b9feeb 100644
--- a/src/plugins/compressionPlugin.ts
+++ b/src/plugins/compressionPlugin.ts
@@ -4,35 +4,20 @@
4 * SPDX-License-Identifier: MIT 4 * SPDX-License-Identifier: MIT
5 */ 5 */
6 6
7import { readFile, writeFile } from 'node:fs/promises'; 7import type { BrotliOptions } from 'node:zlib';
8import path from 'node:path';
9import { promisify } from 'node:util';
10import zlib, { type BrotliOptions, type ZlibOptions } from 'node:zlib';
11 8
12import pluginSitemap, { type PluginOptions } from '@docusaurus/plugin-sitemap'; 9import type { Plugin } from '@docusaurus/types';
13import type { LoadContext, Plugin } from '@docusaurus/types';
14import { Globby } from '@docusaurus/utils';
15import CompressionPlugin from 'compression-webpack-plugin'; 10import CompressionPlugin from 'compression-webpack-plugin';
16 11
17const gzipOptions = { 12import {
18 level: 9, 13 brotliOptions,
19} satisfies ZlibOptions; 14 gzipOptions,
20const brotliOptions = { 15 minRatio,
21 params: { 16} from '../../scripts/compressionOptions.mjs';
22 [zlib.constants.BROTLI_PARAM_QUALITY]: 11,
23 },
24};
25const test = /\.(js|css|svg|txt)$/;
26const paths = ['**/*.html', 'robots.txt', 'sitemap.xml'];
27 17
28const gzip = promisify(zlib.gzip); 18const test = /\.(js|css|svg|txt)$/;
29const brotliCompress = promisify(zlib.brotliCompress);
30 19
31export default function compressionPlugin( 20export default function compressionPlugin(): Plugin<void> {
32 context: LoadContext,
33 options: PluginOptions,
34): Plugin<void> {
35 const sitemap = pluginSitemap(context, options);
36 return { 21 return {
37 name: 'marussy-compression-plugin', 22 name: 'marussy-compression-plugin',
38 configureWebpack: (_config, isServer) => 23 configureWebpack: (_config, isServer) =>
@@ -44,28 +29,16 @@ export default function compressionPlugin(
44 test, 29 test,
45 filename: '[path][base].gz', 30 filename: '[path][base].gz',
46 compressionOptions: gzipOptions, 31 compressionOptions: gzipOptions,
32 minRatio,
47 }), 33 }),
48 new CompressionPlugin<BrotliOptions>({ 34 new CompressionPlugin<BrotliOptions>({
49 test, 35 test,
50 filename: '[path][base].br', 36 filename: '[path][base].br',
51 algorithm: 'brotliCompress', 37 algorithm: 'brotliCompress',
52 compressionOptions: brotliOptions, 38 compressionOptions: brotliOptions,
39 minRatio,
53 }), 40 }),
54 ], 41 ],
55 }, 42 },
56 async postBuild(props) {
57 await sitemap?.postBuild(props);
58 const files = await Globby(paths.map((s) => path.join(props.outDir, s)));
59 for (const file of files) {
60 console.log(file);
61 const contents = await readFile(file);
62 const gzipContents = await gzip(contents, gzipOptions);
63 await writeFile(`${file}.gz`, gzipContents);
64 const brotliContents = await brotliCompress(contents, brotliOptions);
65 await writeFile(`${file}.br`, brotliContents);
66 }
67 },
68 }; 43 };
69} 44}
70
71export { validateOptions } from '@docusaurus/plugin-sitemap';