fix: prioritize vue installed in user project root

pull/489/head
Evan You 3 years ago
parent 1cb8a382f3
commit 9b3243b757

@ -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_ID = '@siteData'
export const SITE_DATA_REQUEST_PATH = '/' + SITE_DATA_ID 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<string, string> = { const paths: Record<string, string> = {
'/@theme': themeDir, '/@theme': themeDir,
'/@shared': SHARED_PATH, '/@shared': SHARED_PATH,
[SITE_DATA_ID]: SITE_DATA_REQUEST_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[] = [ const aliases: Alias[] = [
...Object.keys(paths).map((p) => ({ ...Object.keys(paths).map((p) => ({
find: p, find: p,
@ -40,7 +51,7 @@ export function resolveAliases(themeDir: string): AliasOptions {
// vitepress itself // vitepress itself
{ {
find: /^vue$/, find: /^vue$/,
replacement: require.resolve('vue/dist/vue.runtime.esm-bundler.js') replacement: vuePath
} }
] ]

@ -21,8 +21,20 @@ export async function renderPage(
const routePath = `/${page.replace(/\.md$/, '')}` const routePath = `/${page.replace(/\.md$/, '')}`
const siteData = resolveSiteDataByRoute(config.site, routePath) const siteData = resolveSiteDataByRoute(config.site, routePath)
router.go(routePath) router.go(routePath)
// lazy require server-renderer for production build // 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, '_') const pageName = page.replace(/\//g, '_')
// server build doesn't need hash // server build doesn't need hash

@ -139,7 +139,7 @@ export async function resolveConfig(
outDir, outDir,
tempDir: resolve(root, '.temp'), tempDir: resolve(root, '.temp'),
markdown: userConfig.markdown, markdown: userConfig.markdown,
alias: resolveAliases(themeDir), alias: resolveAliases(root, themeDir),
vue: userConfig.vue, vue: userConfig.vue,
vite: userConfig.vite, vite: userConfig.vite,
shouldPreload: userConfig.shouldPreload, shouldPreload: userConfig.shouldPreload,

Loading…
Cancel
Save