Docusaurus 中支持自定义代码块语法
 · 阅读需 3 分钟
Docusaurus 中支持自定义代码块语法(如 ```code),可以通过扩展 Markdown 解析器的处理逻辑来实现这个功能.
步骤概述
- 自定义 Markdown 解析器:创建一个 Remark 插件来解析自定义的代码块语法。
- 在 Docusaurus 中注册该插件:将插件注册到 docusaurus.config.js 中。
- 自定义代码高亮或渲染方式:根据需要进一步处理和渲染代码块。
创建 Remark 插件
创建一个新的文件 myRemarkPlugin.js
const visit = require('unist-util-visit')
export default function customCodeBlock() {
  return (tree) => {
    visit(tree, 'code', (node) => {
      if (node.lang !== 'code') {
        return
      }
      const data: any = node.data || (node.data = {})
      const attributes = node.attributes || {}
      const tagName = 'Monaco'
      const code = node.value
      data.hName = tagName
      data.hProperties = {
        ...h(tagName, attributes).properties,
        code,
      }
      return SKIP
    })
  }
}
注册自定义 Remark 插件
在 docusaurus.config.js 中注册这个自定义插件
module.exports = {
  // 其他配置
  markdown: {
    remarkPlugins: [require('./myRemarkPlugin')],
  },
}
自定义代码高亮或渲染
在 src/theme/MDXComponents.js 中自定义代码块的渲染方式:
import React from 'react'
// Import the original mapper
import MDXComponents from '@theme-original/MDXComponents'
import Highlight from '@site/src/components/Highlight'
export default {
  // Re-use the default mapping
  ...MDXComponents,
  // Map the "<Highlight>" tag to our Highlight component
  // `Highlight` will receive all props that were passed to `<Highlight>` in MDX
  Highlight,
}
问题汇总
- Error: Unexpected usage at EditorSimpleWorker.loadForeignModule
通常是因为 Monaco Editor 的 Web Worker 未正确配置导致的。Monaco 依赖 Web Workers 来处理语法检查和代码提示等功能,所以必须正确配置 Web Worker 路径。
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin')
module.exports = {
  // 其他配置
  webpack: {
    configure: (webpackConfig) => {
      webpackConfig.plugins.push(
        new MonacoWebpackPlugin({
          languages: ['javascript', 'typescript', 'json'], // 添加你需要的语言
        }),
      )
      return webpackConfig
    },
  },
}
也可以参考: stackoverflow