5

我正在尝试设置一个插件来更改开发服务器和生产版本上的 VuePress 降价文件的内容。根据文档,我应该能够使用_contentand_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期间进行这种内容交换devbuild

4

3 回答 3

4

这些页面对象中的信息在 Markdown 编译后和 Vue 组件渲染期间使用。内容更多供参考,修改不会有你想要的效果。

这也让我绊倒了。

所有 markdown 文件都经过处理以获取信息,但随后通过 webpack 进行实际编译。一般流程是:

.md-> markdown-loader-> vue-loader-> ...

我的建议和我所做的是创建一个自定义的 webpack 加载器,以便在内容通过 VuePress 降价加载器之前对其进行修改。我使用这种方法通过 Nunjucks 运行我的 markdown 文件,以模板化 pre-markdown 编译。找出正确的方法后,这样做非常容易:) 这是一种可行的方法:

配置.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
}
于 2019-08-12T01:58:43.930 回答
0

我认为您应该使用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';
    };
  },
});
于 2019-07-19T12:41:58.693 回答
0

你可以修改你的.vuepress/config.js。例如,如果您想将 '---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()

  },
};
于 2020-05-30T13:10:48.163 回答