Skip to content

Commit 2cb9174

Browse files
committed
refactor: remove temp page files and load page component via bundler
- feat: support importing module via relative paths in page files - feat: support importing markdown as vue component
1 parent 0fe831f commit 2cb9174

27 files changed

+234
-97
lines changed

e2e/docs/.vuepress/components/ComponentForMarkdownImport.vue

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<template>
2+
<div class="component-for-markdown-import-bar">
3+
<p>component for markdown import bar</p>
4+
</div>
5+
</template>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<template>
2+
<div class="component-for-markdown-import-foo">
3+
<p>component for markdown import foo</p>
4+
</div>
5+
</template>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<div class="dangling-markdown-file">
2+
3+
dangling markdown file
4+
5+
</div>

e2e/docs/markdown/vue-components.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
<ComponentForMarkdownGlobal />
22

3-
<ComponentForMarkdownImport />
3+
<ComponentForMarkdownImportFoo />
4+
5+
<ComponentForMarkdownImportBar />
46

57
<script setup>
6-
// TODO: relative path import?
7-
import ComponentForMarkdownImport from '@source/.vuepress/components/ComponentForMarkdownImport.vue';
8+
// import via alias
9+
import ComponentForMarkdownImportFoo from '@source/.vuepress/components/ComponentForMarkdownImportFoo.vue';
10+
11+
// import via relative path
12+
import ComponentForMarkdownImportBar from '../.vuepress/components/ComponentForMarkdownImportBar.vue';
813
</script>

e2e/tests/markdown/vue-components.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ test('should render vue components correctly', async ({ page }) => {
66
await expect(page.locator('.component-for-markdown-global p')).toHaveText(
77
'component for markdown global',
88
)
9-
await expect(page.locator('.component-for-markdown-import p')).toHaveText(
10-
'component for markdown import',
9+
await expect(page.locator('.component-for-markdown-import-foo p')).toHaveText(
10+
'component for markdown import foo',
11+
)
12+
await expect(page.locator('.component-for-markdown-import-foo p')).toHaveText(
13+
'component for markdown import bar',
1114
)
1215
})

packages/bundler-vite/src/plugins/vuepressMainPlugin.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { App } from '@vuepress/core'
2-
import { fs, sanitizeFileName } from '@vuepress/utils'
2+
import { parsePageContent, renderPageSfcBlocksToVue } from '@vuepress/core'
3+
import { fs, path, sanitizeFileName } from '@vuepress/utils'
34
import autoprefixer from 'autoprefixer'
45
import history from 'connect-history-api-fallback'
56
import type { AcceptedPlugin } from 'postcss'
@@ -189,6 +190,25 @@ export const vuepressMainPlugin = ({
189190
}
190191
},
191192

193+
transform(code, id) {
194+
if (!id.endsWith('.md')) return undefined
195+
196+
// if this is a page source file, render its sfc blocks to vue component directly
197+
if (app.pagesMap[id]) {
198+
return renderPageSfcBlocksToVue(app.pagesMap[id].sfcBlocks)
199+
}
200+
201+
// if this is a dangling markdown file, parse its content to sfc blocks and render to vue component
202+
const { sfcBlocks } = parsePageContent({
203+
app,
204+
content: code,
205+
filePath: id,
206+
filePathRelative: path.relative(app.dir.source(), id),
207+
options: {},
208+
})
209+
return renderPageSfcBlocksToVue(sfcBlocks)
210+
},
211+
192212
generateBundle(_, bundle) {
193213
// delete all asset outputs in server build
194214
if (isServer) {

packages/bundler-vite/src/plugins/vuepressVuePlugin.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ import type { ViteBundlerOptions } from '../types.js'
77
*/
88
export const vuepressVuePlugin = (options: ViteBundlerOptions): Plugin =>
99
vuePlugin({
10+
include: [/\.vue$/, /\.md$/],
1011
...options.vuePluginOptions,
1112
})

packages/bundler-webpack/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"author": "meteorlxy",
2121
"type": "module",
2222
"imports": {
23+
"#vuepress-markdown-loader": "./dist/vuepress-markdown-loader.cjs",
2324
"#vuepress-ssr-loader": "./dist/vuepress-ssr-loader.cjs"
2425
},
2526
"exports": {

packages/bundler-webpack/src/build/createClientConfig.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { createRequire } from 'node:module'
21
import type { App } from '@vuepress/core'
32
import { fs } from '@vuepress/utils'
43
import CopyWebpackPlugin from 'copy-webpack-plugin'
@@ -10,8 +9,6 @@ import { createClientBaseConfig } from '../config/index.js'
109
import type { WebpackBundlerOptions } from '../types.js'
1110
import { createClientPlugin } from './createClientPlugin.js'
1211

13-
const require = createRequire(import.meta.url)
14-
1512
/**
1613
* Filename of the client manifest file that generated by client plugin
1714
*/
@@ -27,15 +24,6 @@ export const createClientConfig = async (
2724
isBuild: true,
2825
})
2926

30-
// use internal vuepress-ssr-loader to handle SSR dependencies
31-
config.module
32-
.rule('vue')
33-
.test(/\.vue$/)
34-
.use('vuepress-ssr-loader')
35-
.before('vue-loader')
36-
.loader(require.resolve('#vuepress-ssr-loader'))
37-
.end()
38-
3927
// vuepress client plugin, handle client assets info for ssr
4028
config
4129
.plugin('vuepress-client')

0 commit comments

Comments
 (0)