From e681fb3f5a73e93c72fb62961eabe3044e3f0f58 Mon Sep 17 00:00:00 2001 From: meteorlxy Date: Wed, 11 Sep 2024 12:33:15 +0800 Subject: [PATCH] refactor: updates --- eslint.config.ts | 1 + .../src/plugins/vuepressMarkdownPlugin.ts | 25 +++--- .../src/loaders/vuepressMarkdownLoader.ts | 14 ++-- .../cli/src/commands/dev/handlePageAdd.ts | 11 +-- .../cli/src/commands/dev/handlePageChange.ts | 9 +-- .../cli/src/commands/dev/handlePageUnlink.ts | 1 + packages/client/src/components/Content.ts | 2 +- packages/client/src/setupGlobalComputed.ts | 11 ++- packages/client/src/types/routes.ts | 4 +- packages/core/src/app/appPrepare.ts | 7 +- packages/core/src/app/prepare/index.ts | 1 - .../core/src/app/prepare/preparePageChunk.ts | 32 +------- .../src/app/prepare/preparePageComponent.ts | 17 ---- packages/core/src/page/createPage.ts | 15 +--- packages/core/src/page/index.ts | 5 +- .../core/src/page/renderPageSfcBlocksToVue.ts | 17 ---- packages/core/src/page/renderPageToVue.ts | 79 +++++++++++++++++++ .../core/src/page/resolvePageChunkInfo.ts | 24 +++++- .../core/src/page/resolvePageComponentInfo.ts | 39 --------- ...geFileContent.ts => resolvePageContent.ts} | 18 +++-- packages/core/src/types/page.ts | 17 +--- ...ent.spec.ts => resolvePageContent.spec.ts} | 30 +++++-- 22 files changed, 181 insertions(+), 198 deletions(-) delete mode 100644 packages/core/src/app/prepare/preparePageComponent.ts delete mode 100644 packages/core/src/page/renderPageSfcBlocksToVue.ts create mode 100644 packages/core/src/page/renderPageToVue.ts delete mode 100644 packages/core/src/page/resolvePageComponentInfo.ts rename packages/core/src/page/{resolvePageFileContent.ts => resolvePageContent.ts} (51%) rename packages/core/tests/page/{resolvePageFileContent.spec.ts => resolvePageContent.spec.ts} (51%) diff --git a/eslint.config.ts b/eslint.config.ts index fa0eed31d7..1cb1edfb7b 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -19,6 +19,7 @@ export default vuepress( allow: [ '__dirname', '_context', + '_pageData', '_pageChunk', '_registeredComponents', ], diff --git a/packages/bundler-vite/src/plugins/vuepressMarkdownPlugin.ts b/packages/bundler-vite/src/plugins/vuepressMarkdownPlugin.ts index eb072f840c..94da9828c8 100644 --- a/packages/bundler-vite/src/plugins/vuepressMarkdownPlugin.ts +++ b/packages/bundler-vite/src/plugins/vuepressMarkdownPlugin.ts @@ -1,6 +1,5 @@ import type { App } from '@vuepress/core' -import { parsePageContent, renderPageSfcBlocksToVue } from '@vuepress/core' -import { path } from '@vuepress/utils' +import { createPage, renderPageToVue } from '@vuepress/core' import type { Plugin } from 'vite' /** @@ -11,7 +10,7 @@ export const vuepressMarkdownPlugin = ({ app }: { app: App }): Plugin => ({ enforce: 'pre', - transform(code, id) { + async transform(code, id) { if (!id.endsWith('.md')) return // get the matched page by file path (id) @@ -19,18 +18,15 @@ export const vuepressMarkdownPlugin = ({ app }: { app: App }): Plugin => ({ // if the page content is not changed, render it to vue component directly if (page?.content === code) { - return renderPageSfcBlocksToVue(page.sfcBlocks) + return renderPageToVue(page) } - // parse the markdown content to sfc blocks and render it to vue component - const { sfcBlocks } = parsePageContent({ - app, + // create a new page with the new content + const newPage = await createPage(app, { content: code, filePath: id, - filePathRelative: path.relative(app.dir.source(), id), - options: {}, }) - return renderPageSfcBlocksToVue(sfcBlocks) + return renderPageToVue(newPage) }, async handleHotUpdate(ctx) { @@ -39,15 +35,12 @@ export const vuepressMarkdownPlugin = ({ app }: { app: App }): Plugin => ({ // read the source code const code = await ctx.read() - // parse the content to sfc blocks - const { sfcBlocks } = parsePageContent({ - app, + // create a new page with the new content + const newPage = await createPage(app, { content: code, filePath: ctx.file, - filePathRelative: path.relative(app.dir.source(), ctx.file), - options: {}, }) - ctx.read = () => renderPageSfcBlocksToVue(sfcBlocks) + ctx.read = () => renderPageToVue(newPage) }, }) diff --git a/packages/bundler-webpack/src/loaders/vuepressMarkdownLoader.ts b/packages/bundler-webpack/src/loaders/vuepressMarkdownLoader.ts index d9ca435d14..819dc29f66 100644 --- a/packages/bundler-webpack/src/loaders/vuepressMarkdownLoader.ts +++ b/packages/bundler-webpack/src/loaders/vuepressMarkdownLoader.ts @@ -11,8 +11,7 @@ export interface VuepressMarkdownLoaderOptions { export const vuepressMarkdownLoader: LoaderDefinitionFunction = async function vuepressMarkdownLoader(source) { // import esm dependencies - const [{ parsePageContent, renderPageSfcBlocksToVue }, { path }] = - await Promise.all([import('@vuepress/core'), import('@vuepress/utils')]) + const { createPage, renderPageToVue } = await import('@vuepress/core') // get app instance from loader options const { app } = this.getOptions() @@ -22,16 +21,13 @@ export const vuepressMarkdownLoader: LoaderDefinitionFunction - route.loader().then(({ comp }) => comp), + route.loader().then((m) => m.default), ) }) diff --git a/packages/client/src/setupGlobalComputed.ts b/packages/client/src/setupGlobalComputed.ts index e258cb7673..79c8fe459a 100644 --- a/packages/client/src/setupGlobalComputed.ts +++ b/packages/client/src/setupGlobalComputed.ts @@ -47,12 +47,15 @@ export const setupGlobalComputed = ( if (__VUEPRESS_DEV__ && (import.meta.webpackHot || import.meta.hot)) { __VUE_HMR_RUNTIME__.updatePageData = async (newPageData: PageData) => { const oldPageChunk = await routes.value[newPageData.path].loader() - const newPageChunk = { comp: oldPageChunk.comp, data: newPageData } + const newPageChunk: PageChunk = { + default: oldPageChunk.default, + _pageData: newPageData, + } routes.value[newPageData.path].loader = async () => Promise.resolve(newPageChunk) if ( newPageData.path === - router.currentRoute.value.meta._pageChunk?.data.path + router.currentRoute.value.meta._pageChunk?._pageData.path ) { pageChunk.value = newPageChunk } @@ -67,8 +70,8 @@ export const setupGlobalComputed = ( const siteLocaleData = computed(() => resolvers.resolveSiteLocaleData(siteData.value, routeLocale.value), ) - const pageComponent = computed(() => pageChunk.value.comp) - const pageData = computed(() => pageChunk.value.data) + const pageComponent = computed(() => pageChunk.value.default) + const pageData = computed(() => pageChunk.value._pageData) const pageFrontmatter = computed(() => pageData.value.frontmatter) const pageHeadTitle = computed(() => resolvers.resolvePageHeadTitle(pageData.value, siteLocaleData.value), diff --git a/packages/client/src/types/routes.ts b/packages/client/src/types/routes.ts index 6aa5d10871..c102dee700 100644 --- a/packages/client/src/types/routes.ts +++ b/packages/client/src/types/routes.ts @@ -2,8 +2,8 @@ import type { Component } from 'vue' import type { PageData } from '../types/index.js' export interface PageChunk { - comp: Component - data: PageData + default: Component + _pageData: PageData } export type RouteMeta = Record diff --git a/packages/core/src/app/appPrepare.ts b/packages/core/src/app/appPrepare.ts index f8d2585f50..a41f8d72be 100644 --- a/packages/core/src/app/appPrepare.ts +++ b/packages/core/src/app/appPrepare.ts @@ -3,7 +3,6 @@ import type { App } from '../types/index.js' import { prepareClientConfigs, preparePageChunk, - preparePageComponent, prepareRoutes, prepareSiteData, } from './prepare/index.js' @@ -13,7 +12,6 @@ const log = debug('vuepress:core/app') /** * Prepare files for development or build * - * - page components * - page chunks * - routes * - site data @@ -23,10 +21,7 @@ export const appPrepare = async (app: App): Promise => { log('prepare start') await Promise.all([ - ...app.pages.flatMap((page) => [ - preparePageComponent(app, page), - preparePageChunk(app, page), - ]), + ...app.pages.map(async (page) => preparePageChunk(app, page)), prepareRoutes(app), prepareSiteData(app), prepareClientConfigs(app), diff --git a/packages/core/src/app/prepare/index.ts b/packages/core/src/app/prepare/index.ts index ea49aa7600..460f3b497f 100644 --- a/packages/core/src/app/prepare/index.ts +++ b/packages/core/src/app/prepare/index.ts @@ -1,5 +1,4 @@ export * from './prepareClientConfigs.js' export * from './preparePageChunk.js' -export * from './preparePageComponent.js' export * from './prepareRoutes.js' export * from './prepareSiteData.js' diff --git a/packages/core/src/app/prepare/preparePageChunk.ts b/packages/core/src/app/prepare/preparePageChunk.ts index 353a98eee1..2ade465418 100644 --- a/packages/core/src/app/prepare/preparePageChunk.ts +++ b/packages/core/src/app/prepare/preparePageChunk.ts @@ -1,35 +1,11 @@ +import { renderPageToVue } from '../../page/index.js' import type { App, Page } from '../../types/index.js' -const HMR_CODE = ` -if (import.meta.webpackHot) { - import.meta.webpackHot.accept() - if (__VUE_HMR_RUNTIME__.updatePageData) { - __VUE_HMR_RUNTIME__.updatePageData(data) - } -} - -if (import.meta.hot) { - import.meta.hot.accept(({ data }) => { - __VUE_HMR_RUNTIME__.updatePageData(data) - }) -} -` - /** - * Generate page chunk temp file of a single page + * Generate temp file the page does not have a source file */ export const preparePageChunk = async (app: App, page: Page): Promise => { - // page chunk file content - let content = `\ -import comp from ${JSON.stringify(page.componentFilePath)} -const data = JSON.parse(${JSON.stringify(JSON.stringify(page.data))}) -export { comp, data } -` - - // inject HMR code - if (app.env.isDev) { - content += HMR_CODE + if (page.filePath === null) { + await app.writeTemp(page.chunkFilePathRelative, renderPageToVue(page)) } - - await app.writeTemp(page.chunkFilePathRelative, content) } diff --git a/packages/core/src/app/prepare/preparePageComponent.ts b/packages/core/src/app/prepare/preparePageComponent.ts deleted file mode 100644 index e88d6123d5..0000000000 --- a/packages/core/src/app/prepare/preparePageComponent.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { renderPageSfcBlocksToVue } from '../../page/index.js' -import type { App, Page } from '../../types/index.js' - -/** - * Generate page component temp file if the page does not have a source file - */ -export const preparePageComponent = async ( - app: App, - page: Page, -): Promise => { - if (page.filePath === null) { - await app.writeTemp( - page.componentFilePathRelative, - renderPageSfcBlocksToVue(page.sfcBlocks), - ) - } -} diff --git a/packages/core/src/page/createPage.ts b/packages/core/src/page/createPage.ts index 0c48399162..9965abf4a4 100644 --- a/packages/core/src/page/createPage.ts +++ b/packages/core/src/page/createPage.ts @@ -2,9 +2,8 @@ import type { App, Page, PageOptions } from '../types/index.js' import { inferPagePath } from './inferPagePath.js' import { parsePageContent } from './parsePageContent.js' import { resolvePageChunkInfo } from './resolvePageChunkInfo.js' -import { resolvePageComponentInfo } from './resolvePageComponentInfo.js' +import { resolvePageContent } from './resolvePageContent.js' import { resolvePageDate } from './resolvePageDate.js' -import { resolvePageFileContent } from './resolvePageFileContent.js' import { resolvePageFilePath } from './resolvePageFilePath.js' import { resolvePageHtmlInfo } from './resolvePageHtmlInfo.js' import { resolvePageLang } from './resolvePageLang.js' @@ -27,7 +26,7 @@ export const createPage = async ( }) // read the raw file content according to the absolute file path - const content = await resolvePageFileContent({ filePath, options }) + const content = await resolvePageContent({ filePath, options }) // render page content and extract information const { @@ -81,18 +80,14 @@ export const createPage = async ( path, }) - // resolve page component and extract headers & links - const { componentFilePath, componentFilePathRelative } = - resolvePageComponentInfo({ + const { chunkFilePath, chunkFilePathRelative, chunkName } = + resolvePageChunkInfo({ app, filePath, filePathRelative, htmlFilePathRelative, }) - const { chunkFilePath, chunkFilePathRelative, chunkName } = - resolvePageChunkInfo({ app, htmlFilePathRelative }) - const page: Page = { // page data data: { @@ -127,8 +122,6 @@ export const createPage = async ( // file info filePath, filePathRelative, - componentFilePath, - componentFilePathRelative, chunkFilePath, chunkFilePathRelative, chunkName, diff --git a/packages/core/src/page/index.ts b/packages/core/src/page/index.ts index 6e1bc3d592..e6bc9edd07 100644 --- a/packages/core/src/page/index.ts +++ b/packages/core/src/page/index.ts @@ -1,11 +1,10 @@ export * from './createPage.js' export * from './inferPagePath.js' export * from './parsePageContent.js' -export * from './renderPageSfcBlocksToVue.js' +export * from './renderPageToVue.js' export * from './resolvePageChunkInfo.js' -export * from './resolvePageComponentInfo.js' export * from './resolvePageDate.js' -export * from './resolvePageFileContent.js' +export * from './resolvePageContent.js' export * from './resolvePageFilePath.js' export * from './resolvePageHtmlInfo.js' export * from './resolvePageLang.js' diff --git a/packages/core/src/page/renderPageSfcBlocksToVue.ts b/packages/core/src/page/renderPageSfcBlocksToVue.ts deleted file mode 100644 index 7428643823..0000000000 --- a/packages/core/src/page/renderPageSfcBlocksToVue.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { MarkdownSfcBlocks } from '@vuepress/markdown' - -/** - * Render page sfc blocks to vue component - */ -export const renderPageSfcBlocksToVue = ( - sfcBlocks: MarkdownSfcBlocks, -): string => - [ - // #688: wrap the content of `