Rendezvous-Tokyo

vuepress-plugin-sitemapのexcludeがwildcard(*)に対応してなかったので対応させた

対象プラグイン

現時点でver 2.3.1

実現したかったこと

除外URLを * で一括指定したかった。

    [
      "sitemap",
      {
        hostname: "https://hoge.com",
        exclude: [
          "*/page/*",  // これ
          "/tag/*",    // これ
          "/404.html",
        ],
        ...
      },
    ],

できるようにする

  1. まず patch-package をインストール
yarn add patch-package postinstall-postinstall
  1. npm scriptsの追加
    yarn install時にパッチが自動で適用されるようにする。
"scripts": {
  ...
  "postinstall": "patch-package"
}
  1. vuepress-plugin-sitemapの修正

node_modules/vuepress-plugin-sitemap/index.jsを修正する

module.exports = (options, context) => {
  const {
  (省略)
  } = options;

  // ★追加コード
  const excludePatterns = exclude.map(pattern => {
    if (pattern === '*') {
      return /./;
    }
    return new RegExp('^' + pattern.replace(/[*]/g, '.*') + '$');
  });

  return {
    generated() {

    (省略)

      pages.forEach(page => {
        const fmOpts = page.frontmatter.sitemap || {};
        const metaRobots = (page.frontmatter.meta || []).find(meta => meta.name === 'robots');
        const excludePage = metaRobots
          ? (metaRobots.content || '').split(/,/).map(x => x.trim()).includes('noindex')
          : fmOpts.exclude === true;

        // ★追加
        const pathMatchesExclude = excludePatterns.some(pattern => pattern.test(page.path));
        if (excludePage || pathMatchesExclude) {
          exclude.push(page.path);
        }
        // 元のコード
        // if (excludePage) {
        //   exclude.push(page.path)
        // }

    (省略)
  1. パッチファイルの作成
npx patch-package vuepress-plugin-sitemap

/pathces/vuepress-plugin-sitemap+<VERSION>.patchファイルが生成される。

  1. 適用
rm -rf node_modules
yarn install

感想

これで期待通り */page/*/tag/* が sitemap.xmlから除外されてスッキリした。
このプラグイン4年以上更新されてないのか...

以上