From 343392595ed1f2942c1649056e8375eb86b41333 Mon Sep 17 00:00:00 2001 From: Alexander Nestorov Date: Tue, 7 Jun 2022 21:21:55 +0200 Subject: [PATCH] Implement BuildConfig opt --- examples/classic/docusaurus.config.js | 6 +++++ packages/docusaurus-types/src/index.d.ts | 16 ++++++++++++ .../docusaurus/src/client/serverEntry.tsx | 26 ++++++++++++------- packages/docusaurus/src/deps.d.ts | 2 ++ .../docusaurus/src/server/configValidation.ts | 3 +++ website/docs/api/docusaurus.config.js.md | 14 ++++++++++ 6 files changed, 58 insertions(+), 9 deletions(-) diff --git a/examples/classic/docusaurus.config.js b/examples/classic/docusaurus.config.js index cbea7b1b4b1ba..f09493b20ad55 100644 --- a/examples/classic/docusaurus.config.js +++ b/examples/classic/docusaurus.config.js @@ -53,6 +53,12 @@ const config = { ], ], + buildConfig: + /** @type {import('@docusaurus/types').BuildConfig} */ + ({ + minify: {}, + }), + themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ diff --git a/packages/docusaurus-types/src/index.d.ts b/packages/docusaurus-types/src/index.d.ts index 2cae26753d5b9..81c8f2dab7993 100644 --- a/packages/docusaurus-types/src/index.d.ts +++ b/packages/docusaurus-types/src/index.d.ts @@ -17,6 +17,7 @@ import type { DeepPartial, } from 'utility-types'; import type {Location} from 'history'; +import type {Options} from 'html-minifier-terser'; // === Configuration === @@ -38,6 +39,13 @@ export type PresetConfig = | false | null; +export type BuildConfig = { + /** + * Options for [html-minifier-terser](https://github.com/terser/html-minifier-terser) + */ + minify: Options; +}; + export type ThemeConfig = { [key: string]: unknown; }; @@ -210,6 +218,14 @@ export type DocusaurusConfig = { * @see https://docusaurus.io/docs/api/docusaurus-config#githubPort */ githubPort?: string; + /** + * Customize the build options. Currently this object can accept the parameter + * "minify", which must be an object containing the options to be passed to + * the [minifier](https://github.com/DanielRuf/html-minifier-terser). + * + * @see https://docusaurus.io/docs/api/docusaurus-config#buildConfig + */ + buildConfig?: BuildConfig; /** * The [theme configuration](https://docusaurus.io/docs/api/themes/configuration) * object to customize your site UI like navbar and footer. diff --git a/packages/docusaurus/src/client/serverEntry.tsx b/packages/docusaurus/src/client/serverEntry.tsx index 528a0a96e3a89..b402cf7f11486 100644 --- a/packages/docusaurus/src/client/serverEntry.tsx +++ b/packages/docusaurus/src/client/serverEntry.tsx @@ -66,6 +66,7 @@ It might also require to wrap your client code in ${chalk.cyan('`useEffect`')} h // Renderer for static-site-generator-webpack-plugin (async rendering). async function doRender(locals: Locals & {path: string}) { const { + buildConfig, routesLocation, headTags, preBodyTags, @@ -143,15 +144,22 @@ async function doRender(locals: Locals & {path: string}) { try { // Minify html with https://github.com/DanielRuf/html-minifier-terser - return await minify(renderedHtml, { - removeComments: false, - removeRedundantAttributes: true, - removeEmptyAttributes: true, - removeScriptTypeAttributes: true, - removeStyleLinkTypeAttributes: true, - useShortDoctype: true, - minifyJS: true, - }); + return await minify( + renderedHtml, + _.merge( + {}, + { + removeComments: false, + removeRedundantAttributes: true, + removeEmptyAttributes: true, + removeScriptTypeAttributes: true, + removeStyleLinkTypeAttributes: true, + useShortDoctype: true, + minifyJS: true, + }, + buildConfig?.minify, + ), + ); } catch (err) { // prettier-ignore console.error(chalk.red(`${chalk.bold('[ERROR]')} Minification of page ${chalk.cyan.underline(locals.path)} failed.`)); diff --git a/packages/docusaurus/src/deps.d.ts b/packages/docusaurus/src/deps.d.ts index c781b107ab0f7..65efc3aa04c4c 100644 --- a/packages/docusaurus/src/deps.d.ts +++ b/packages/docusaurus/src/deps.d.ts @@ -35,8 +35,10 @@ declare module 'react-loadable-ssr-addon-v5-slorber' { declare module '@slorber/static-site-generator-webpack-plugin' { import type {WebpackPluginInstance, Compiler} from 'webpack'; import type {HelmetServerState} from 'react-helmet-async'; + import type {BuildConfig} from '@docusaurus/types'; export type Locals = { + buildConfig: BuildConfig; routesLocation: {[filePath: string]: string}; generatedFilesDir: string; headTags: string; diff --git a/packages/docusaurus/src/server/configValidation.ts b/packages/docusaurus/src/server/configValidation.ts index 4027f84ca4d97..ae96238da76de 100644 --- a/packages/docusaurus/src/server/configValidation.ts +++ b/packages/docusaurus/src/server/configValidation.ts @@ -193,6 +193,9 @@ export const ConfigSchema = Joi.object({ plugins: Joi.array().items(PluginSchema).default(DEFAULT_CONFIG.plugins), themes: Joi.array().items(ThemeSchema).default(DEFAULT_CONFIG.themes), presets: Joi.array().items(PresetSchema).default(DEFAULT_CONFIG.presets), + buildConfig: Joi.object({ + minify: Joi.object().optional(), + }).optional(), themeConfig: Joi.object().unknown().default(DEFAULT_CONFIG.themeConfig), scripts: Joi.array() .items( diff --git a/website/docs/api/docusaurus.config.js.md b/website/docs/api/docusaurus.config.js.md index 0b0a6ecf88327..bcc2fd73d1cca 100644 --- a/website/docs/api/docusaurus.config.js.md +++ b/website/docs/api/docusaurus.config.js.md @@ -274,6 +274,20 @@ module.exports = { }; ``` +### `buildConfig` {#buildConfig} + +- Type: `Object` + +Customize the build options. Currently this object can accept the parameter "minify", which must be an object containing the options to be passed to the [minifier](https://github.com/DanielRuf/html-minifier-terser). + +```js title="docusaurus.config.js" +module.exports = { + minify: { + removeComments: false, + }, +}; +``` + ### `themeConfig` {#themeConfig} - Type: `Object`