From 56937b7379b305af9a0327318a9828659d4c244f 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 +++ packages/docusaurus/src/webpack/server.ts | 3 ++- website/docs/api/docusaurus.config.js.md | 14 ++++++++++ 7 files changed, 60 insertions(+), 10 deletions(-) diff --git a/examples/classic/docusaurus.config.js b/examples/classic/docusaurus.config.js index cbea7b1b4b1b..f09493b20ad5 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 2cae26753d5b..074fd10e71b9 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 528a0a96e3a8..b402cf7f1148 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 c781b107ab0f..65efc3aa04c4 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 4027f84ca4d9..ae96238da76d 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/packages/docusaurus/src/webpack/server.ts b/packages/docusaurus/src/webpack/server.ts index 4942ed5c0c76..54f721e4297b 100644 --- a/packages/docusaurus/src/webpack/server.ts +++ b/packages/docusaurus/src/webpack/server.ts @@ -37,7 +37,7 @@ export default async function createServerConfig({ headTags, preBodyTags, postBodyTags, - siteConfig: {noIndex, trailingSlash, ssrTemplate}, + siteConfig: {buildConfig, noIndex, trailingSlash, ssrTemplate}, } = props; const config = await createBaseConfig(props, true); @@ -70,6 +70,7 @@ export default async function createServerConfig({ new StaticSiteGeneratorPlugin({ entry: 'main', locals: { + buildConfig: buildConfig ?? {}, baseUrl, generatedFilesDir, routesLocation, diff --git a/website/docs/api/docusaurus.config.js.md b/website/docs/api/docusaurus.config.js.md index 0b0a6ecf8832..bcc2fd73d1cc 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`