diff --git a/src/node/alias.ts b/src/node/alias.ts index 7b7aff21..f7ef31a6 100644 --- a/src/node/alias.ts +++ b/src/node/alias.ts @@ -14,13 +14,24 @@ export const DEFAULT_THEME_PATH = path.join(DIST_CLIENT_PATH, 'theme-default') export const SITE_DATA_ID = '@siteData' export const SITE_DATA_REQUEST_PATH = '/' + SITE_DATA_ID -export function resolveAliases(themeDir: string): AliasOptions { +const vueRuntimePath = 'vue/dist/vue.runtime.esm-bundler.js' + +export function resolveAliases(root: string, themeDir: string): AliasOptions { const paths: Record = { '/@theme': themeDir, '/@shared': SHARED_PATH, [SITE_DATA_ID]: SITE_DATA_REQUEST_PATH } + // prioritize vue installed in project root and fallback to + // vue that comes with vitepress itself. + let vuePath + try { + vuePath = require.resolve(vueRuntimePath, { paths: [root] }) + } catch (e) { + vuePath = require.resolve(vueRuntimePath) + } + const aliases: Alias[] = [ ...Object.keys(paths).map((p) => ({ find: p, @@ -40,7 +51,7 @@ export function resolveAliases(themeDir: string): AliasOptions { // vitepress itself { find: /^vue$/, - replacement: require.resolve('vue/dist/vue.runtime.esm-bundler.js') + replacement: vuePath } ] diff --git a/src/node/build/render.ts b/src/node/build/render.ts index 8bfe54d5..e5e226e3 100644 --- a/src/node/build/render.ts +++ b/src/node/build/render.ts @@ -21,8 +21,20 @@ export async function renderPage( const routePath = `/${page.replace(/\.md$/, '')}` const siteData = resolveSiteDataByRoute(config.site, routePath) router.go(routePath) + // lazy require server-renderer for production build - const content = await require('vue/server-renderer').renderToString(app) + // prioritize project root over vitepress' own dep + let rendererPath + try { + rendererPath = require.resolve('vue/server-renderer', { + paths: [config.root] + }) + } catch (e) { + rendererPath = require.resolve('vue/server-renderer') + } + + // render page + const content = await require(rendererPath).renderToString(app) const pageName = page.replace(/\//g, '_') // server build doesn't need hash diff --git a/src/node/config.ts b/src/node/config.ts index 7a01377b..7b337f54 100644 --- a/src/node/config.ts +++ b/src/node/config.ts @@ -139,7 +139,7 @@ export async function resolveConfig( outDir, tempDir: resolve(root, '.temp'), markdown: userConfig.markdown, - alias: resolveAliases(themeDir), + alias: resolveAliases(root, themeDir), vue: userConfig.vue, vite: userConfig.vite, shouldPreload: userConfig.shouldPreload,