diff options
Diffstat (limited to 'src/plugins/compressionPlugin.ts')
-rw-r--r-- | src/plugins/compressionPlugin.ts | 49 |
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 | ||
7 | import { readFile, writeFile } from 'node:fs/promises'; | 7 | import type { BrotliOptions } from 'node:zlib'; |
8 | import path from 'node:path'; | ||
9 | import { promisify } from 'node:util'; | ||
10 | import zlib, { type BrotliOptions, type ZlibOptions } from 'node:zlib'; | ||
11 | 8 | ||
12 | import pluginSitemap, { type PluginOptions } from '@docusaurus/plugin-sitemap'; | 9 | import type { Plugin } from '@docusaurus/types'; |
13 | import type { LoadContext, Plugin } from '@docusaurus/types'; | ||
14 | import { Globby } from '@docusaurus/utils'; | ||
15 | import CompressionPlugin from 'compression-webpack-plugin'; | 10 | import CompressionPlugin from 'compression-webpack-plugin'; |
16 | 11 | ||
17 | const gzipOptions = { | 12 | import { |
18 | level: 9, | 13 | brotliOptions, |
19 | } satisfies ZlibOptions; | 14 | gzipOptions, |
20 | const brotliOptions = { | 15 | minRatio, |
21 | params: { | 16 | } from '../../scripts/compressionOptions.mjs'; |
22 | [zlib.constants.BROTLI_PARAM_QUALITY]: 11, | ||
23 | }, | ||
24 | }; | ||
25 | const test = /\.(js|css|svg|txt)$/; | ||
26 | const paths = ['**/*.html', 'robots.txt', 'sitemap.xml']; | ||
27 | 17 | ||
28 | const gzip = promisify(zlib.gzip); | 18 | const test = /\.(js|css|svg|txt)$/; |
29 | const brotliCompress = promisify(zlib.brotliCompress); | ||
30 | 19 | ||
31 | export default function compressionPlugin( | 20 | export 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 | |||
71 | export { validateOptions } from '@docusaurus/plugin-sitemap'; | ||