aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-21 12:35:52 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-21 12:35:52 +0100
commit7efa67af84b60b14724517e634673460bfcef8a1 (patch)
tree84fc64508658eb3130d1a9c9057049cdb8faf83e
parentMore even heading letter-spacing (diff)
downloadblog-7efa67af84b60b14724517e634673460bfcef8a1.tar.gz
blog-7efa67af84b60b14724517e634673460bfcef8a1.tar.zst
blog-7efa67af84b60b14724517e634673460bfcef8a1.zip
Also compress Docusaurus-generated files
Run the compression manually for files that are not generated by Webpack. We must take over the @docusaurus/plugin-sitemap plugin to make sure we run after it has generated sitemap.xml. Docusaurus runs all plugin post-build actions in parallel with Promise.all, so the only way to do this is to invoke the post-build action in our own one.
-rw-r--r--docusaurus.config.ts1
-rw-r--r--package.json1
-rw-r--r--src/plugins/compressionPlugin.ts53
-rw-r--r--yarn.lock3
4 files changed, 44 insertions, 14 deletions
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index f19513a..9468812 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -23,7 +23,6 @@ export default {
23 remarkPlugins: [[smartypants, { dashes: 'oldschool' }]], 23 remarkPlugins: [[smartypants, { dashes: 'oldschool' }]],
24 }, 24 },
25 ], 25 ],
26 '@docusaurus/plugin-sitemap',
27 './src/plugins/compressionPlugin.ts', 26 './src/plugins/compressionPlugin.ts',
28 './src/plugins/responsiveLoaderPlugin.ts', 27 './src/plugins/responsiveLoaderPlugin.ts',
29 './src/plugins/swcMinifyPlugin.ts', 28 './src/plugins/swcMinifyPlugin.ts',
diff --git a/package.json b/package.json
index 74600da..57e8f60 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
32 "@docusaurus/plugin-sitemap": "^3.1.1", 32 "@docusaurus/plugin-sitemap": "^3.1.1",
33 "@docusaurus/theme-classic": "^3.1.1", 33 "@docusaurus/theme-classic": "^3.1.1",
34 "@docusaurus/theme-common": "^3.1.1", 34 "@docusaurus/theme-common": "^3.1.1",
35 "@docusaurus/utils": "^3.1.1",
35 "@mdx-js/react": "^3.0.1", 36 "@mdx-js/react": "^3.0.1",
36 "@phosphor-icons/react": "2.1.3", 37 "@phosphor-icons/react": "2.1.3",
37 "@swc/core": "^1.4.8", 38 "@swc/core": "^1.4.8",
diff --git a/src/plugins/compressionPlugin.ts b/src/plugins/compressionPlugin.ts
index b1cff6a..8b347cf 100644
--- a/src/plugins/compressionPlugin.ts
+++ b/src/plugins/compressionPlugin.ts
@@ -4,14 +4,35 @@
4 * SPDX-License-Identifier: MIT 4 * SPDX-License-Identifier: MIT
5 */ 5 */
6 6
7import zlib, { type BrotliOptions } from 'node:zlib'; 7import { readFile, writeFile } from 'node:fs/promises';
8import path from 'node:path';
9import { promisify } from 'node:util';
10import zlib, { type BrotliOptions, type ZlibOptions } from 'node:zlib';
8 11
9import type { Plugin } from '@docusaurus/types'; 12import pluginSitemap, { type PluginOptions } from '@docusaurus/plugin-sitemap';
13import type { LoadContext, Plugin } from '@docusaurus/types';
14import { Globby } from '@docusaurus/utils';
10import CompressionPlugin from 'compression-webpack-plugin'; 15import CompressionPlugin from 'compression-webpack-plugin';
11 16
12const test = /\.(js|css|html|svg|txt)$/; 17const gzipOptions = {
18 level: 9,
19} satisfies ZlibOptions;
20const brotliOptions = {
21 params: {
22 [zlib.constants.BROTLI_PARAM_QUALITY]: 11,
23 },
24};
25const test = /\.(js|css|svg|txt)$/;
26const paths = ['**/*.html', 'robots.txt', 'sitemap.xml'];
13 27
14export default function compressionPlugin(): Plugin { 28const gzip = promisify(zlib.gzip);
29const brotliCompress = promisify(zlib.brotliCompress);
30
31export default function compressionPlugin(
32 context: LoadContext,
33 options: PluginOptions,
34): Plugin<void> {
35 const sitemap = pluginSitemap(context, options);
15 return { 36 return {
16 name: 'marussy-compression-plugin', 37 name: 'marussy-compression-plugin',
17 configureWebpack: (_config, isServer) => 38 configureWebpack: (_config, isServer) =>
@@ -22,21 +43,29 @@ export default function compressionPlugin(): Plugin {
22 new CompressionPlugin({ 43 new CompressionPlugin({
23 test, 44 test,
24 filename: '[path][base].gz', 45 filename: '[path][base].gz',
25 compressionOptions: { 46 compressionOptions: gzipOptions,
26 level: 9,
27 },
28 }), 47 }),
29 new CompressionPlugin<BrotliOptions>({ 48 new CompressionPlugin<BrotliOptions>({
30 test, 49 test,
31 filename: '[path][base].br', 50 filename: '[path][base].br',
32 algorithm: 'brotliCompress', 51 algorithm: 'brotliCompress',
33 compressionOptions: { 52 compressionOptions: brotliOptions,
34 params: {
35 [zlib.constants.BROTLI_PARAM_QUALITY]: 11,
36 },
37 },
38 }), 53 }),
39 ], 54 ],
40 }, 55 },
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 },
41 }; 68 };
42} 69}
70
71export { validateOptions } from '@docusaurus/plugin-sitemap';
diff --git a/yarn.lock b/yarn.lock
index c876b9c..b957685 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1865,7 +1865,7 @@ __metadata:
1865 languageName: node 1865 languageName: node
1866 linkType: hard 1866 linkType: hard
1867 1867
1868"@docusaurus/utils@npm:3.1.1": 1868"@docusaurus/utils@npm:3.1.1, @docusaurus/utils@npm:^3.1.1":
1869 version: 3.1.1 1869 version: 3.1.1
1870 resolution: "@docusaurus/utils@npm:3.1.1" 1870 resolution: "@docusaurus/utils@npm:3.1.1"
1871 dependencies: 1871 dependencies:
@@ -7505,6 +7505,7 @@ __metadata:
7505 "@docusaurus/theme-common": "npm:^3.1.1" 7505 "@docusaurus/theme-common": "npm:^3.1.1"
7506 "@docusaurus/tsconfig": "npm:^3.1.1" 7506 "@docusaurus/tsconfig": "npm:^3.1.1"
7507 "@docusaurus/types": "npm:^3.1.1" 7507 "@docusaurus/types": "npm:^3.1.1"
7508 "@docusaurus/utils": "npm:^3.1.1"
7508 "@mdx-js/react": "npm:^3.0.1" 7509 "@mdx-js/react": "npm:^3.0.1"
7509 "@phosphor-icons/react": "npm:2.1.3" 7510 "@phosphor-icons/react": "npm:2.1.3"
7510 "@swc/core": "npm:^1.4.8" 7511 "@swc/core": "npm:^1.4.8"