From e04c8f140f554df711a53d518283f5401ac1925d Mon Sep 17 00:00:00 2001 From: Endi Date: Fri, 8 Nov 2019 16:14:14 +0700 Subject: [PATCH] perf/fix(v2): more efficient hot reload & consistent filegen (#1950) * perf(v2): efficient hot reload, consistent generated file * changelog * more --- CHANGELOG-2.x.md | 2 ++ .../src/__tests__/index.test.ts | 3 -- .../src/index.ts | 13 +++++-- .../src/__tests__/index.test.ts | 36 +++++++++++++++++++ packages/docusaurus-utils/src/index.ts | 9 +++++ packages/docusaurus/src/server/index.ts | 1 + packages/docusaurus/src/webpack/utils.ts | 2 ++ 7 files changed, 60 insertions(+), 6 deletions(-) diff --git a/CHANGELOG-2.x.md b/CHANGELOG-2.x.md index e8bac58141..455b684cba 100644 --- a/CHANGELOG-2.x.md +++ b/CHANGELOG-2.x.md @@ -1,6 +1,8 @@ # Docusaurus 2 Changelog ## Unreleased +- More efficient hot reload & consistent generated file. +- Set babel `compact` options to `true` which removes "superfluous whitespace characters and line terminators. ## 2.0.0-alpha.33 diff --git a/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts b/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts index 11bb217a45..dd4b533d45 100644 --- a/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts @@ -18,9 +18,6 @@ import {posixPath} from '@docusaurus/utils'; const createFakeActions = (routeConfigs: RouteConfig[], contentDir) => { return { addRoute: (config: RouteConfig) => { - config.routes.sort((a, b) => - a.path > b.path ? 1 : b.path > a.path ? -1 : 0, - ); routeConfigs.push(config); }, createData: async (name, _content) => { diff --git a/packages/docusaurus-plugin-content-docs/src/index.ts b/packages/docusaurus-plugin-content-docs/src/index.ts index 7aac3ebb3b..8fef69ef1f 100644 --- a/packages/docusaurus-plugin-content-docs/src/index.ts +++ b/packages/docusaurus-plugin-content-docs/src/index.ts @@ -8,7 +8,12 @@ import globby from 'globby'; import fs from 'fs-extra'; import path from 'path'; -import {idx, normalizeUrl, docuHash} from '@docusaurus/utils'; +import { + idx, + normalizeUrl, + docuHash, + objectWithKeySorted, +} from '@docusaurus/utils'; import {LoadContext, Plugin} from '@docusaurus/types'; import createOrder from './order'; @@ -202,7 +207,7 @@ export default function pluginContentDocs( docsDir, docsSidebars, sourceToPermalink, - permalinkToSidebar, + permalinkToSidebar: objectWithKeySorted(permalinkToSidebar), }; }, @@ -252,7 +257,9 @@ export default function pluginContentDocs( addRoute({ path: docsBaseRoute, component: docLayoutComponent, - routes, + routes: routes.sort((a, b) => + a.path > b.path ? 1 : b.path > a.path ? -1 : 0, + ), modules: { docsMetadata: aliasedSource(docsBaseMetadataPath), }, diff --git a/packages/docusaurus-utils/src/__tests__/index.test.ts b/packages/docusaurus-utils/src/__tests__/index.test.ts index 64246be8f4..ed7fae44ea 100644 --- a/packages/docusaurus-utils/src/__tests__/index.test.ts +++ b/packages/docusaurus-utils/src/__tests__/index.test.ts @@ -15,6 +15,7 @@ import { getSubFolder, normalizeUrl, posixPath, + objectWithKeySorted, } from '../index'; describe('load utils', () => { @@ -82,6 +83,41 @@ describe('load utils', () => { }); }); + test('objectWithKeySorted', () => { + const obj = { + '/docs/adding-blog': '4', + '/docs/versioning': '5', + '/': '1', + '/blog/2018': '3', + '/youtube': '7', + '/users/en/': '6', + '/blog': '2', + }; + expect(objectWithKeySorted(obj)).toMatchInlineSnapshot(` + Object { + "/": "1", + "/blog": "2", + "/blog/2018": "3", + "/docs/adding-blog": "4", + "/docs/versioning": "5", + "/users/en/": "6", + "/youtube": "7", + } + `); + const obj2 = { + b: 'foo', + c: 'bar', + a: 'baz', + }; + expect(objectWithKeySorted(obj2)).toMatchInlineSnapshot(` + Object { + "a": "baz", + "b": "foo", + "c": "bar", + } + `); + }); + test('genChunkName', () => { const firstAssert = { '/docs/adding-blog': 'docs-adding-blog-062', diff --git a/packages/docusaurus-utils/src/index.ts b/packages/docusaurus-utils/src/index.ts index 01c73cdd36..94cc439f5a 100644 --- a/packages/docusaurus-utils/src/index.ts +++ b/packages/docusaurus-utils/src/index.ts @@ -31,6 +31,15 @@ export async function generate( } } +export function objectWithKeySorted(obj: Object) { + // https://github.com/lodash/lodash/issues/1459#issuecomment-253969771 + return _(obj) + .toPairs() + .sortBy(0) + .fromPairs() + .value(); +} + const indexRE = /(^|.*\/)index\.(md|js)$/i; const extRE = /\.(md|js)$/; diff --git a/packages/docusaurus/src/server/index.ts b/packages/docusaurus/src/server/index.ts index f97654b9a3..cdd591f3fb 100644 --- a/packages/docusaurus/src/server/index.ts +++ b/packages/docusaurus/src/server/index.ts @@ -116,6 +116,7 @@ export async function load(siteDir: string): Promise { 'registry.js', `export default { ${Object.keys(registry) + .sort() .map( key => ` '${key}': [${registry[key].loader}, ${JSON.stringify( diff --git a/packages/docusaurus/src/webpack/utils.ts b/packages/docusaurus/src/webpack/utils.ts index c475b32158..a392ec800d 100644 --- a/packages/docusaurus/src/webpack/utils.ts +++ b/packages/docusaurus/src/webpack/utils.ts @@ -89,6 +89,8 @@ export function getBabelLoader(isServer: boolean, babelOptions?: {}): Loader { { babelrc: false, configFile: false, + // All optional newlines and whitespace will be omitted when generating code in compact mode + compact: true, presets: [ isServer ? [