如何通过插件更改 VuePress 页面的内容
How to change content of VuePress page via Plugin
我正在尝试设置一个插件来更改开发服务器和生产版本上 VuePress markdown 文件的内容。根据文档,我应该可以使用 _content
和 _strippedContent
extendPageData
下面的代码是我在插件中设置的。
module.exports = (options = {}, context) => ({
extendPageData($page) {
const {
_filePath, // file's absolute path
_computed, // access the client global computed mixins at build time, e.g _computed.$localePath.
_content, // file's raw content string
_strippedContent, // file's content string without frontmatter
key, // page's unique hash key
frontmatter, // page's frontmatter object
regularPath, // current page's default link (follow the file hierarchy)
path, // current page's real link (use regularPath when permalink does not exist)
} = $page
$page._content = "replaced"
$page._strippedContent = "replaced"
}
})
我能说的最好的是这段代码在更新 $page._content
时应该可以工作,但是它没有显示 testing
而是显示原始内容。
我知道我正在进入这段代码,因为我可以从文件中 console.log
并且它显示在控制台中。
我担心 $page._content
是不可变的,想知道是否有办法在 dev
或 build
期间进行这种内容交换
我认为您应该使用 extendMarkdown
https://v1.vuepress.vuejs.org/config/#markdown-extendmarkdown。
这样试试
// index.js
module.exports = () => ({
name: 'vuepress-plugin-foo-bar',
extendMarkdown: md => {
const render = md.render;
md.render = (...args) => {
// original content
const html = render.call(md, ...args);
return 'new content';
};
},
});
这些页面对象中的信息在markdown 编译之后和Vue 组件渲染期间使用。内容比较多,仅供参考,修改不会达到你想要的效果
这也把我绊倒了。
所有 markdown 文件都经过处理以获取信息,但实际编译是通过 webpack 进行的。大体流程是:
.md
-> markdown-loader
-> vue-loader
-> ...
我的建议和我所做的是创建一个自定义的 webpack 加载器来修改内容,然后再通过 VuePress markdown 加载器。我通过 Nunjucks 使用这种方法对 运行 我的降价文件进行模板预降价编译。在找到正确的方法后,这样做非常容易 :) 这是一个可行的方法:
config.js:
chainWebpack: config => {
config.module
.rule('md')
.test(/\.md$/)
.use(path.resolve(__dirname, './nunjucks'))
.loader(path.resolve(__dirname, './nunjucks'))
.end()
},
然后一个简单的加载程序可以如下所示(删节):
module.exports = function(source) {
const rendered = nunjucks.renderString(source, config)
return rendered
}
您可以修改您的.vuepress/config.js。例如,如果你想在你所有的文件 markdown 中用 'MY TEXT
'(例如大写)替换 '---my text---',你必须将下一个代码添加到 .vuepress/config.js,进入我使用正则表达式的 chainWebpack 部分:
// File: .vuepress/config.js
module.exports = {
...,
chainWebpack: config => {
// Each loader in the chain applies transformations to the processed resource:
config.module
.rule('md')
.test(/\.md$/)
.use("string-replace-loader")
.loader("string-replace-loader")
.options({
multiple: [{
search: '---(.*?)---',
replace: (match, p1, offset, string, groups) => `<div><p class="myclass">${p1.toUpperCase()}</p></div>`,
flags: 'ig'
},
{
search: ' ... ',
replace: (match, p1, p2, ..., pn, offset, string) => ` ... `,
flags: 'ig'
}
],
}, )
.end()
},
};
我正在尝试设置一个插件来更改开发服务器和生产版本上 VuePress markdown 文件的内容。根据文档,我应该可以使用 _content
和 _strippedContent
extendPageData
下面的代码是我在插件中设置的。
module.exports = (options = {}, context) => ({
extendPageData($page) {
const {
_filePath, // file's absolute path
_computed, // access the client global computed mixins at build time, e.g _computed.$localePath.
_content, // file's raw content string
_strippedContent, // file's content string without frontmatter
key, // page's unique hash key
frontmatter, // page's frontmatter object
regularPath, // current page's default link (follow the file hierarchy)
path, // current page's real link (use regularPath when permalink does not exist)
} = $page
$page._content = "replaced"
$page._strippedContent = "replaced"
}
})
我能说的最好的是这段代码在更新 $page._content
时应该可以工作,但是它没有显示 testing
而是显示原始内容。
我知道我正在进入这段代码,因为我可以从文件中 console.log
并且它显示在控制台中。
我担心 $page._content
是不可变的,想知道是否有办法在 dev
或 build
我认为您应该使用 extendMarkdown
https://v1.vuepress.vuejs.org/config/#markdown-extendmarkdown。
这样试试
// index.js
module.exports = () => ({
name: 'vuepress-plugin-foo-bar',
extendMarkdown: md => {
const render = md.render;
md.render = (...args) => {
// original content
const html = render.call(md, ...args);
return 'new content';
};
},
});
这些页面对象中的信息在markdown 编译之后和Vue 组件渲染期间使用。内容比较多,仅供参考,修改不会达到你想要的效果
这也把我绊倒了。
所有 markdown 文件都经过处理以获取信息,但实际编译是通过 webpack 进行的。大体流程是:
.md
-> markdown-loader
-> vue-loader
-> ...
我的建议和我所做的是创建一个自定义的 webpack 加载器来修改内容,然后再通过 VuePress markdown 加载器。我通过 Nunjucks 使用这种方法对 运行 我的降价文件进行模板预降价编译。在找到正确的方法后,这样做非常容易 :) 这是一个可行的方法:
config.js:
chainWebpack: config => {
config.module
.rule('md')
.test(/\.md$/)
.use(path.resolve(__dirname, './nunjucks'))
.loader(path.resolve(__dirname, './nunjucks'))
.end()
},
然后一个简单的加载程序可以如下所示(删节):
module.exports = function(source) {
const rendered = nunjucks.renderString(source, config)
return rendered
}
您可以修改您的.vuepress/config.js。例如,如果你想在你所有的文件 markdown 中用 'MY TEXT
'(例如大写)替换 '---my text---',你必须将下一个代码添加到 .vuepress/config.js,进入我使用正则表达式的 chainWebpack 部分:// File: .vuepress/config.js
module.exports = {
...,
chainWebpack: config => {
// Each loader in the chain applies transformations to the processed resource:
config.module
.rule('md')
.test(/\.md$/)
.use("string-replace-loader")
.loader("string-replace-loader")
.options({
multiple: [{
search: '---(.*?)---',
replace: (match, p1, offset, string, groups) => `<div><p class="myclass">${p1.toUpperCase()}</p></div>`,
flags: 'ig'
},
{
search: ' ... ',
replace: (match, p1, p2, ..., pn, offset, string) => ` ... `,
flags: 'ig'
}
],
}, )
.end()
},
};