From cad97041b39570e78b38352e60b4dae6870be3c2 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 21 Mar 2024 20:59:50 +0100 Subject: 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. --- src/plugins/compressionPlugin.ts | 49 +++++++++------------------------------- 1 file changed, 11 insertions(+), 38 deletions(-) (limited to 'src') 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 @@ * SPDX-License-Identifier: MIT */ -import { readFile, writeFile } from 'node:fs/promises'; -import path from 'node:path'; -import { promisify } from 'node:util'; -import zlib, { type BrotliOptions, type ZlibOptions } from 'node:zlib'; +import type { BrotliOptions } from 'node:zlib'; -import pluginSitemap, { type PluginOptions } from '@docusaurus/plugin-sitemap'; -import type { LoadContext, Plugin } from '@docusaurus/types'; -import { Globby } from '@docusaurus/utils'; +import type { Plugin } from '@docusaurus/types'; import CompressionPlugin from 'compression-webpack-plugin'; -const gzipOptions = { - level: 9, -} satisfies ZlibOptions; -const brotliOptions = { - params: { - [zlib.constants.BROTLI_PARAM_QUALITY]: 11, - }, -}; -const test = /\.(js|css|svg|txt)$/; -const paths = ['**/*.html', 'robots.txt', 'sitemap.xml']; +import { + brotliOptions, + gzipOptions, + minRatio, +} from '../../scripts/compressionOptions.mjs'; -const gzip = promisify(zlib.gzip); -const brotliCompress = promisify(zlib.brotliCompress); +const test = /\.(js|css|svg|txt)$/; -export default function compressionPlugin( - context: LoadContext, - options: PluginOptions, -): Plugin { - const sitemap = pluginSitemap(context, options); +export default function compressionPlugin(): Plugin { return { name: 'marussy-compression-plugin', configureWebpack: (_config, isServer) => @@ -44,28 +29,16 @@ export default function compressionPlugin( test, filename: '[path][base].gz', compressionOptions: gzipOptions, + minRatio, }), new CompressionPlugin({ test, filename: '[path][base].br', algorithm: 'brotliCompress', compressionOptions: brotliOptions, + minRatio, }), ], }, - async postBuild(props) { - await sitemap?.postBuild(props); - const files = await Globby(paths.map((s) => path.join(props.outDir, s))); - for (const file of files) { - console.log(file); - const contents = await readFile(file); - const gzipContents = await gzip(contents, gzipOptions); - await writeFile(`${file}.gz`, gzipContents); - const brotliContents = await brotliCompress(contents, brotliOptions); - await writeFile(`${file}.br`, brotliContents); - } - }, }; } - -export { validateOptions } from '@docusaurus/plugin-sitemap'; -- cgit v1.2.3-70-g09d2