<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Docusaurus Blog</title>
        <link>https://docusaurus.io/zh-CN/blog</link>
        <description>Keep up to date with upcoming Docusaurus releases and articles by following our feed!</description>
        <lastBuildDate>Tue, 07 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2026 Facebook, Inc.</copyright>
        <item>
            <title><![CDATA[Docusaurus 3.10]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.10</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.10</guid>
            <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[我们很高兴地宣布 Docusaurus 3.10 现已发布。]]></description>
            <content:encoded><![CDATA[<p>我们很高兴地宣布 <strong>Docusaurus 3.10</strong> 现已发布。</p>
<p>这将是 <strong>v3.x 的最后一个版本</strong>，它将帮助你<strong>为 Docusaurus v4 做好准备</strong>。</p>
<p>Upgrading is easy. 我们遵循<a href="https://semver.org/lang/zh-CN/" target="_blank" rel="noopener noreferrer" class="">语义化版本</a>，根据我们的<a class="" href="https://docusaurus.io/zh-CN/community/release-process">发布流程</a>，小版本的更新<strong>没有破坏性变更</strong>。</p>
<p>然而，如果你选择全局启用 <code>future.v4: true</code> 来迎接即将到来的 Docusaurus v4 破坏性变更，请仔细阅读下面的专属章节。</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-77e4a0d9b978e519751c324db47003e5.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="v4-future-flags">v4 Future 标志<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#v4-future-flags" class="hash-link" aria-label="链接到 v4 Future 标志" title="链接到 v4 Future 标志" translate="no">​</a></h2>
<p>The <a class="" href="https://docusaurus.io/zh-CN/docs/api/docusaurus-config#future">Docusaurus v4 Future Flags</a> let you <strong>opt in for upcoming Docusaurus v4 breaking changes</strong> incrementally and prepare for Docusaurus v4 ahead of time. You can enable them all at once with <code>future.v4: true</code>.</p>
<p>This release introduces new flags and breaking changes that might break your site if you use <code>future.v4: true</code> and upgrade:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/11797" target="_blank" rel="noopener noreferrer" class=""><code>future.v4.siteStorageNamespacing</code></a>: In Docusaurus v4, <code>localStorage</code> keys will be automatically namespaced by default (<code>theme</code> =&gt; <code>theme-&lt;hash&gt;</code>) to prevent key conflicts. This is likely to reset your site's visitor storage unless you migrate it to new key names. See the dedicated <a href="https://docusaurus.io/zh-CN/blog/releases/3.10#site-storage" class="">Site Storage section</a> below.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/11802" target="_blank" rel="noopener noreferrer" class=""><code>future.v4.fasterByDefault</code></a>: Docusaurus Faster is now stable and will be enabled by default in Docusaurus v4. See the dedicated <a href="https://docusaurus.io/zh-CN/blog/releases/3.10#docusaurus-faster" class="">Docusaurus Faster section</a> below.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/11896" target="_blank" rel="noopener noreferrer" class=""><code>future.v4.mdx1CompatDisabledByDefault</code></a>: In Docusaurus v4, MDX v1 compatibility options will be disabled by default, and you might have to adjust your docs accordingly. See the dedicated <a href="https://docusaurus.io/zh-CN/blog/releases/3.10#strict-mdx" class="">Strict MDX section</a> below.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="security">Security<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#security" class="hash-link" aria-label="链接到 Security" title="链接到 Security" translate="no">​</a></h2>
<p><strong><a href="https://github.blog/security/supply-chain-security/our-plan-for-a-more-secure-npm-supply-chain/" target="_blank" rel="noopener noreferrer" class="">npm supply chain attacks</a></strong> have surged recently. A single compromised maintainer or package can ripple through the ecosystem and affect thousands of downstream users, as seen with the <a href="https://socket.dev/blog/hidden-blast-radius-of-the-axios-compromise" target="_blank" rel="noopener noreferrer" class="">axios compromise</a>.</p>
<p>We’ve taken steps to strengthen our supply chain, and recommend securing your own site with additional measures as well.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="trusted-publishing">Trusted Publishing<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#trusted-publishing" class="hash-link" aria-label="链接到 Trusted Publishing" title="链接到 Trusted Publishing" translate="no">​</a></h3>
<p>We adopted <strong><a href="https://docs.npmjs.com/trusted-publishers" target="_blank" rel="noopener noreferrer" class="">npm Trusted Publishing</a></strong> for <a href="https://github.com/facebook/docusaurus/pull/11819" target="_blank" rel="noopener noreferrer" class="">stable</a> and <a href="https://github.com/facebook/docusaurus/pull/11712" target="_blank" rel="noopener noreferrer" class="">canary</a> releases.</p>
<p>Releases are now published through a single <code>publish.yml</code> GitHub Actions workflow using short-lived OIDC tokens. Each release has verifiable provenance, with a transparency log showing how and when it was published.</p>
<p><img decoding="async" loading="lazy" alt="npm trusted publishing checkmark displayed under the version" src="https://docusaurus.io/zh-CN/assets/images/security-0bb27807eec2c1ad1edd0df24298a516.jpg" width="1459" height="744" class="img_vXGZ"></p>
<p><img decoding="async" loading="lazy" alt="npm trusted publishing provenance details" src="https://docusaurus.io/zh-CN/assets/images/provenance-4b7dc023c1c4709717b5100e9db1d566.jpg" width="2860" height="696" class="img_vXGZ"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="security-workflow">Security Workflow<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#security-workflow" class="hash-link" aria-label="链接到 Security Workflow" title="链接到 Security Workflow" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11874" target="_blank" rel="noopener noreferrer" class="">#11874</a>, we introduced a new security workflow that runs daily and on every pull request. It scans for suspicious dependency updates affecting our official packages and their transitive dependencies:</p>
<ul>
<li class="">Install the Docusaurus site template through the <a href="https://socket.dev/blog/introducing-socket-firewall" target="_blank" rel="noopener noreferrer" class="">Socket Firewall</a> to detect known malware in our dependency graph</li>
<li class="">Check for unexpected <code>preinstall</code> and <code>postinstall</code> lifecycle scripts, using <a href="https://pnpm.io/settings#strictdepbuilds" target="_blank" rel="noopener noreferrer" class="">pnpm <code>strictDepBuilds</code></a></li>
<li class="">Check for GitHub repository and tarball URL dependencies, using <a href="https://pnpm.io/settings#blockexoticsubdeps" target="_blank" rel="noopener noreferrer" class="">pnpm <code>blockExoticSubdeps</code></a></li>
<li class="">Check for packages that downgrade their trust level, using <a href="https://pnpm.io/settings#trustpolicy" target="_blank" rel="noopener noreferrer" class="">pnpm <code>trustPolicy: no-downgrade</code></a></li>
<li class="">Run similar checks on our own monorepo, to protect Docusaurus maintainers and contributors</li>
</ul>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Security Limitations</div><div class="admonitionContent_Knsx"><p>This security workflow <strong>does not protect your site</strong>. It is designed to detect serious vulnerabilities affecting the Docusaurus ecosystem as early as possible, so we can react quickly and notify you.</p><p>With semver dependency ranges, it's impossible to guarantee a 100% secure supply chain, since any new npm release in our dependency graph can introduce a vulnerability. Ultimately, securing your site is your responsibility. At a minimum, rely on a lockfile and upgrade dependencies deliberately and cautiously.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="secure-your-site">Secure Your Site<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#secure-your-site" class="hash-link" aria-label="链接到 Secure Your Site" title="链接到 Secure Your Site" translate="no">​</a></h3>
<p>Read the <a href="https://github.com/lirantal/npm-security-best-practices" target="_blank" rel="noopener noreferrer" class="">npm security best practices</a> guide to learn how to secure your site — and npm applications in general — from compromised dependencies.</p>
<p>Each package manager offers different security options. In our experience, <a href="https://pnpm.io/blog/2025/12/05/newsroom-npm-supply-chain-security" target="_blank" rel="noopener noreferrer" class="">pnpm</a> offers the best ones. We won't document all the possibilities, but here's a pnpm config example that should work well with Docusaurus:</p>
<div class="language-yaml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">pnpm-workspace.yaml</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yaml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#22863A">minimumReleaseAge</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">10080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">blockExoticSubdeps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#005CC5">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">strictDepBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#005CC5">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">allowBuilds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">'@swc/core'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#005CC5">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">core-js-pure</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#005CC5">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">core-js</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#005CC5">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">trustPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> no</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">downgrade</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">trustPolicyExclude</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'detect-port@1.6.1'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'semver@6.3.1'</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Use release cooldowns</div><div class="admonitionContent_Knsx"><p>When a popular npm package gets compromised, the community usually notices quickly and takes it down. <a href="https://daniakash.com/posts/simplest-supply-chain-defense/" target="_blank" rel="noopener noreferrer" class="">Using a release cooldown</a> is an effective way to reduce risk during the exposure window.</p><p>Modern package managers now offer a way to delay npm updates, giving time for security scanners to report vulnerabilities.</p><div class="language-yaml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yaml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#6B6B6B;font-style:italic"># npm v11.10+ - .npmrc</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">min</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">release</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">age=7</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic"># pnpm v10.16+ - pnpm-workspace.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">minimumReleaseAge</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">10080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic"># Yarn v4.10+ - .yarnrc.yml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">npmMinimalAgeGate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">"7d"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic"># Bun v1.3+ - bunfig.toml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">install</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minimumReleaseAge = 604800</span><br></div></code></pre></div></div></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="docusaurus-faster">Docusaurus Faster - Stable<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#docusaurus-faster" class="hash-link" aria-label="链接到 Docusaurus Faster - Stable" title="链接到 Docusaurus Faster - Stable" translate="no">​</a></h2>
<p><strong><a href="https://github.com/facebook/docusaurus/issues/10556" target="_blank" rel="noopener noreferrer" class="">Docusaurus Faster</a></strong> lets you opt in for our modernized build infrastructure. This includes Rspack, SWC, LightningCSS, and other optimizations.</p>
<p>This release improves Docusaurus Faster with a new <a href="https://docusaurus.io/zh-CN/blog/releases/3.10#vcs" class=""><code>gitEagerVcs</code></a> flag and <a href="https://github.com/facebook/docusaurus/pull/11817" target="_blank" rel="noopener noreferrer" class="">full support for Yarn PnP</a>.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11802" target="_blank" rel="noopener noreferrer" class="">#11802</a>, we marked <strong>Docusaurus Faster as stable</strong>. You now need to update your config accordingly:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">const config = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> future: {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">   experimental_faster: true,</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   faster: true,</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> },</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token plain">};</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Faster By Default in v4</div><div class="admonitionContent_Knsx"><p>Docusaurus Faster will be <strong>enabled by default in Docusaurus v4</strong>, and is already used for all newly initialized v3 sites. It is now part of our v4 future flags (<code>future.v4.fasterByDefault: true</code>) to help our community prepare for Docusaurus v4. If you haven't already, now is a good time to turn it on!</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="site-storage">Site Storage - Stable<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#site-storage" class="hash-link" aria-label="链接到 Site Storage - Stable" title="链接到 Site Storage - Stable" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11797" target="_blank" rel="noopener noreferrer" class="">#11797</a>, we marked the <code>config.storage</code> API as stable. You now need to update your config accordingly:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">const config = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">  storage: {</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    type: 'localStorage',</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    namespace: true,</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">  },</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">  future: {</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    experimental_storage: {</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">      type: 'localStorage',</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">      namespace: true,</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">  },</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">};</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Automatic namespacing in v4</div><div class="admonitionContent_Knsx"><p>Docusaurus v4 will automatically namespace your storage keys to avoid <code>localStorage</code> key conflicts by default, and is now part of our v4 future flags (<code>future.v4.siteStorageNamespacing: true</code>). Instead of using a <code>theme</code> key, it will use <code>theme-&lt;hash&gt;</code>.</p><p>These storage key conflicts usually happen when running multiple <code>http://localhost:3000</code> apps, or when running multiple apps under the same domain (<code>https://example.com/app</code> and <code>https://example.com/docs</code>).</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="strict-mdx">Strict MDX<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#strict-mdx" class="hash-link" aria-label="链接到 Strict MDX" title="链接到 Strict MDX" translate="no">​</a></h2>
<p>This release introduces new MDX options to encourage stricter usage of native MDX syntax, instead of relying on proprietary Docusaurus syntax on top of MDX.</p>
<p>Historically, Docusaurus compiled your files with MDX v1, which was quite forgiving. Since then, the ecosystem has widely moved to MDX v3, which is stricter. Docusaurus v3.0 introduced <code>markdown.mdx1Compat</code> to help you upgrade incrementally.</p>
<p>In Docusaurus v4, we plan to turn the <code>markdown.mdx1Compat</code> options off by default. This upcoming change is now part of our <a href="https://docusaurus.io/zh-CN/blog/releases/3.10#v4-future-flags" class="">v4 future flags</a> (<code>future.v4.mdx1CompatDisabledByDefault: true</code>).</p>
<p>We'd like the community to adopt a stricter, native MDX syntax for a few reasons:</p>
<ul>
<li class="">This makes your docs more portable: external tools like Prettier, ESLint, TypeScript, VS Code, and GitHub can understand them.</li>
<li class="">Docusaurus doesn't need to pre-process your documents with regular expressions before MDX compilation.</li>
<li class="">This improves compatibility with the <a href="https://unifiedjs.com/" target="_blank" rel="noopener noreferrer" class="">Unified</a> ecosystem (Remark, MDX) and the <a href="https://mdxjs.com/playground/" target="_blank" rel="noopener noreferrer" class="">MDX Playground</a>.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="strict-extensions">Strict Extensions<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#strict-extensions" class="hash-link" aria-label="链接到 Strict Extensions" title="链接到 Strict Extensions" translate="no">​</a></h3>
<p>We believe that:</p>
<ul>
<li class=""><code>.md</code> should be parsed as CommonMark</li>
<li class=""><code>.mdx</code> should be parsed as MDX</li>
</ul>
<p>In reality, Docusaurus has only ever supported MDX, and we should have used the <code>.mdx</code> extension from the start. Newly initialized sites now use <code>.mdx</code> by default (<a href="https://github.com/facebook/docusaurus/pull/11897" target="_blank" rel="noopener noreferrer" class="">#11897</a>). We encourage you to rename your existing files to <code>.mdx</code> as well, so that external tools can understand your content is MDX.</p>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>About CommonMark support</div><div class="admonitionContent_Knsx"><p>Although we also have experimental support for CommonMark, it still doesn't have full feature parity with MDX (<a href="https://github.com/facebook/docusaurus/issues/9092" target="_blank" rel="noopener noreferrer" class="">issue</a>). Once we reach full feature parity, we'll default to <code>markdown.format: 'detect'</code> to ensure that <code>.md</code> files are parsed as CommonMark instead of MDX.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="strict-admonitions">Strict Admonitions<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#strict-admonitions" class="hash-link" aria-label="链接到 Strict Admonitions" title="链接到 Strict Admonitions" translate="no">​</a></h3>
<p>We have historically supported admonitions with titles using the <code>:::type My Title</code> syntax. Although convenient, this is a proprietary Docusaurus syntax.</p>
<p>The <a href="https://talk.commonmark.org/t/generic-directives-plugins-syntax/444" target="_blank" rel="noopener noreferrer" class="">Markdown Directive</a> syntax is more generic and reusable. It is not yet standardized, but widely adopted across ecosystems, including through the <a href="https://github.com/remarkjs/remark-directive" target="_blank" rel="noopener noreferrer" class="">remark-directive</a> package. We encourage you to migrate your admonitions to the <code>:::type[My Title]</code> syntax:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">:::warning Pay Attention</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">:::warning[Pay Attention]</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">Content</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">:::</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="strict-comments">Strict Comments<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#strict-comments" class="hash-link" aria-label="链接到 Strict Comments" title="链接到 Strict Comments" translate="no">​</a></h3>
<p>MDX v3 does not support HTML comments <code>&lt;!-- comment --&gt;</code>, but supports JSX comment expressions <code>{/* comment */}</code>.</p>
<p>If you use HTML comments, we encourage you to migrate to JSX comments. For example, you can truncate blog posts with a JSX comment:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">blog/my-post.mdx</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"># My Blog Post</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">&lt;!-- truncate --&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">{/* truncate */}</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">blog post content</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="strict-heading-ids">Strict Heading IDs<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#strict-heading-ids" class="hash-link" aria-label="链接到 Strict Heading IDs" title="链接到 Strict Heading IDs" translate="no">​</a></h3>
<p>Our historical heading IDs syntax <code>{#my-id}</code> is also a proprietary Docusaurus syntax, leading to ecosystem incompatibilities.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11755" target="_blank" rel="noopener noreferrer" class="">#11755</a>, we introduced a new heading ID syntax based on native MDX comments that we encourage you to adopt:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">## My Heading {#my-id}</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">## My Heading {/* #my-id */}</span><br></div></code></pre></div></div>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11777" target="_blank" rel="noopener noreferrer" class="">#11777</a>, we also added an option to our <code>write-heading-ids</code> CLI to emit and migrate to the new syntax:</p>
<div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">docusaurus write-heading-ids </span><span class="token parameter variable" style="color:#E36209">--syntax</span><span class="token plain"> mdx-comment </span><span class="token parameter variable" style="color:#E36209">--migrate</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="vcs">VCS API - Experimental<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#vcs" class="hash-link" aria-label="链接到 VCS API - Experimental" title="链接到 VCS API - Experimental" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11512" target="_blank" rel="noopener noreferrer" class="">#11512</a>, we added a new experimental VCS (Version Control System) API, and implemented built-in performance improvements when reading from the Git history.</p>
<p>Historically, Docusaurus only integrated with Git, reading the commit history to implement features such as:</p>
<ul>
<li class="">Displaying the last update date/time in the docs, blog and pages plugin when using the <code>showLastUpdateAuthor</code> or <code>showLastUpdateTime</code> options</li>
<li class="">Displaying the blog creation date in the blog plugin</li>
<li class="">Computing the <code>&lt;lastmod&gt;</code> value in the sitemap plugin</li>
</ul>
<p>This new API makes it possible to integrate Docusaurus with other VCS, such as SVN, Mercurial, a CMS or any other external system.</p>
<p>Here's an example implementation using hardcoded data:</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    experimental_vcs</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function-variable function" style="color:#8250DF">initialize</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">siteDir</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// You can initialize and cache VCS data here, if needed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function-variable function" style="color:#8250DF">getFileCreationInfo</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">filePath</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">timestamp</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">1490997600000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> author</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Slash'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function-variable function" style="color:#8250DF">getFileLastUpdateInfo</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">filePath</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">timestamp</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">1490997600000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> author</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Slash'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>We have also noticed that our historical strategy to read from the Git history can be a <strong>significant build performance bottleneck</strong> for large Docusaurus sites. Issuing one <code>git log &lt;filepath&gt;</code> call per MDX file doesn't scale well.</p>
<p>To solve this bottleneck, we implemented a strategy that reads the whole Git repository eagerly in a single <code>git log</code> call, leading to significant performance improvements. This strategy is now part of <a href="https://docusaurus.io/zh-CN/blog/releases/3.10#docusaurus-faster" class="">Docusaurus Faster</a> (<code>future.faster.gitEagerVcs: true</code>) and will become the default in Docusaurus v4.</p>
<p>We also provide built-in VCS preset strategies. The available presets are:</p>
<ul>
<li class=""><code>git-ad-hoc</code>: the historical strategy based on <code>git log &lt;filename&gt;</code> calls</li>
<li class=""><code>git-eager</code>: the new Git strategy that reads your whole repository upfront</li>
<li class=""><code>hardcoded</code>: returns a hardcoded value, useful in dev/tests to speed up DX</li>
<li class=""><code>disabled</code>: returns null for all files, considering them untracked</li>
<li class=""><code>default-v1</code>: the historical default (dynamic, <code>git-ad-hoc</code> in prod, <code>hardcoded</code> in dev)</li>
<li class=""><code>default-v2</code>: the upcoming Docusaurus v4 default (dynamic, <code>git-eager</code> in prod, <code>hardcoded</code> in dev)</li>
</ul>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    experimental_vcs</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'default-v2'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>实验性功能</div><div class="admonitionContent_Knsx"><p>The VCS API is experimental and its design may change. If you give it a try, please share feedback on this <a href="https://github.com/facebook/docusaurus/discussions/11909" target="_blank" rel="noopener noreferrer" class="">community discussion</a>.</p><p>Although the API may change, we consider the built-in Git Eager strategy stable for simple Git repositories. There may be edge cases with multiple nested Git repositories or submodules.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h2>
<ul>
<li class="">🇵🇰 <a href="https://github.com/facebook/docusaurus/pull/11632" target="_blank" rel="noopener noreferrer" class="">#11632</a>: Add new Urdu <code>ur</code> theme translations.</li>
<li class="">🇧🇷 <a href="https://github.com/facebook/docusaurus/pull/11533" target="_blank" rel="noopener noreferrer" class="">#11533</a>: Complete missing Brazilian Portuguese <code>pt-BR</code> theme translations.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.10#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11843" target="_blank" rel="noopener noreferrer" class="">#11843</a>, we now use TypeScript 6.0 for newly initialized sites. However, it requires <code>"ignoreDeprecations": "6.0"</code> for now.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11571" target="_blank" rel="noopener noreferrer" class="">#11571</a>, the <code>siteConfig.headTags</code> API now accepts custom HTML elements.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11675" target="_blank" rel="noopener noreferrer" class="">#11675</a>, the live code block theme now has a button to reset the playground.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11734" target="_blank" rel="noopener noreferrer" class="">#11734</a>, we split the <code>&lt;DocCard&gt;</code> component to make it easier to extend/swizzle. It's now easier to assign custom emojis for the docs generated index page.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11733" target="_blank" rel="noopener noreferrer" class="">#11733</a>, the <code>&lt;Tabs&gt;</code> component now uses React context instead of props, making it possible to create custom <code>&lt;TabItem&gt;</code> components.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11696" target="_blank" rel="noopener noreferrer" class="">#11696</a>, all newly initialized TypeScript sites will have <code>"strict: true"</code> by default.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11611" target="_blank" rel="noopener noreferrer" class="">#11611</a>, we made it possible to create a new Docusaurus site in <code>.</code>, the current directory.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11666" target="_blank" rel="noopener noreferrer" class="">#11666</a>, the pages plugin can now use Markdown file path links (<code>[text](./other-page.md)</code>), as the docs and blog plugins already support it.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11642" target="_blank" rel="noopener noreferrer" class="">#11642</a>, admonitions now support class/id shortcuts, such as <code>:::note{.my-class #my-id}</code>.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11541" target="_blank" rel="noopener noreferrer" class="">#11541</a> and <a href="https://github.com/facebook/docusaurus/pull/11683" target="_blank" rel="noopener noreferrer" class="">#11683</a>, we made sure Docusaurus is compatible with the latest version of Algolia DocSearch 4.x, unlocking new features such as AskAI Suggested Questions.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11684" target="_blank" rel="noopener noreferrer" class="">#11684</a> and <a href="https://github.com/facebook/docusaurus/pull/11653" target="_blank" rel="noopener noreferrer" class="">#11653</a>, we removed many third-party dependencies from our <code>create-docusaurus</code> CLI, making it faster to create a new site.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11794" target="_blank" rel="noopener noreferrer" class="">#11794</a>, we fixed a long-standing bug that prevented the translation of category index page titles in pagination links.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11784" target="_blank" rel="noopener noreferrer" class="">#11784</a>, we changed the syntax we recommend for math equations, preferring regular Markdown code blocks over <code>$$</code> to improve docs portability.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11753" target="_blank" rel="noopener noreferrer" class="">#11753</a>, we added a basic <code>AGENTS.md</code> file. As a reminder, any AI usage in Docusaurus contributions must be disclosed.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11698" target="_blank" rel="noopener noreferrer" class="">#11698</a>, we upgraded our monorepo to React 19. We'll drop support for React 18 in Docusaurus v4.</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.10.0">3.10.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.9]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.9</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.9</guid>
            <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 3.9.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 3.9</strong>.</p>
<p>This release drops support for Node.js 18, adds support for Algolia DocSearch v4 with AskAI, improves i18n support, adds Mermaid ELK layout support, and comes with various other improvements and bug fixes.</p>
<p>Upgrading is easy. We follow <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>, and minor version updates have <strong>no breaking changes</strong>, accordingly to our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a>. Note that <strong>we consider dropping End-of-Life Node.js versions as non-breaking changes</strong>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-e8a5c83b31b6ac5bb461df1568d7577f.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="dropping-nodejs-18">Dropping Node.js 18<a href="https://docusaurus.io/zh-CN/blog/releases/3.9#dropping-nodejs-18" class="hash-link" aria-label="链接到 Dropping Node.js 18" title="链接到 Dropping Node.js 18" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11408" target="_blank" rel="noopener noreferrer" class="">#11408</a>, we have dropped support for Node.js 18, and the new minimum required Node.js version is now v20.0.</p>
<p>Although it may look like a runtime requirement breaking change, Node.js 18 reached <a href="https://nodejs.org/en/about/releases/" target="_blank" rel="noopener noreferrer" class="">End-of-Life</a>. It <a href="https://nodejs.org/en/blog/announcements/node-18-eol-support" target="_blank" rel="noopener noreferrer" class="">won't receive security updates</a>, and you shouldn't use it anymore. Dropping End-of-Life versions of Node.js on minor version releases is a common practice in the Node.js ecosystem, that we now officially endorse and document on our <a class="" href="https://docusaurus.io/zh-CN/community/release-process#nodejs-support">release process</a>.</p>
<p>This upgrade is further motivated by our dependencies:</p>
<ul>
<li class="">Some of our dependencies now only receive security patches on newer versions that do not support Node.js 18 anymore. See, for example, this <a href="https://github.com/facebook/docusaurus/pull/11410" target="_blank" rel="noopener noreferrer" class=""><code>webpack-dev-server@4</code> security warning</a>. To keep the Docusaurus v3 release line secure for our users, for both the runtime and third-party dependencies, the upgrade is necessary.</li>
<li class="">Some of our dependencies are also dropping support for Node.js 18 in minor releases, transitively impacting Docusaurus runtime requirements. For example, <a href="https://rspack.rs/blog/announcing-1-5" target="_blank" rel="noopener noreferrer" class="">Rspack 1.5 now requires Node.js 18.12</a>, while Docusaurus v3 initially supported Node.js 18.0.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="docsearch-v4">DocSearch v4<a href="https://docusaurus.io/zh-CN/blog/releases/3.9#docsearch-v4" class="hash-link" aria-label="链接到 DocSearch v4" title="链接到 DocSearch v4" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11327" target="_blank" rel="noopener noreferrer" class="">#11327</a> and <a href="https://github.com/facebook/docusaurus/pull/11421" target="_blank" rel="noopener noreferrer" class="">#11421</a>, we added support for Algolia DocSearch v4. This new version comes with <a href="https://docsearch.algolia.com/docs/v4/askai" target="_blank" rel="noopener noreferrer" class="">AskAI</a> support, letting you add an AI-powered search assistant to your Docusaurus site that can answer questions based on what's in your documentation with a conversational experience.</p>
<div class="browserWindow_my1Q"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">http://localhost:3000/</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs" style="padding:0;font-size:0"><img decoding="async" loading="lazy" alt="Algolia DocSearch v4 - Ask AI screenshot" src="https://docusaurus.io/zh-CN/assets/images/askai-0443fb4e7ddd4420f61d87c5a10d9be6.png" width="1230" height="716" class="img_vXGZ"></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>DocSearch v4 is opt-in</div><div class="admonitionContent_Knsx"><p>Docusaurus v3 adds support for DocSearch v4 while keeping support for DocSearch v3.</p><p>Existing sites using DocSearch v3 can either stay on v3 or upgrade to v4 using their package manager (npm command: <code>npm update @docsearch/react</code>).</p><p>When using DocSearch v4, the new AskAI feature is not enabled by default: you also need to <a href="https://docsearch.algolia.com/docs/v4/askai/" target="_blank" rel="noopener noreferrer" class="">create an AskAI assistant</a> and add it to the <a class="" href="https://docusaurus.io/zh-CN/docs/search#ask-ai"><code>themeConfig.algolia.askAi</code> config attribute</a>.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="i18n-improvements">i18n improvements<a href="https://docusaurus.io/zh-CN/blog/releases/3.9#i18n-improvements" class="hash-link" aria-label="链接到 i18n improvements" title="链接到 i18n improvements" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11316" target="_blank" rel="noopener noreferrer" class="">#11316</a>, we added new <code>i18n.localeConfigs[locale].{url,baseUrl}</code> config options to better support complex and multi-domain i18n deployments. Previously, Docusaurus relied on hard-coded heuristics that made sense for most i18n projects, but weren't flexible enough to accommodate all use cases, leading UX and SEO issues. It is now possible to configure each locale's deployment URL and base URL independently, overriding the default values inferred by Docusaurus:</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  i18n</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    defaultLocale</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'en'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    locales</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#C6105F">'en'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'fr'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    localeConfigs</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      en</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        url</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'https://en.docusaurus.io'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        baseUrl</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      fr</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        url</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'https://fr.docusaurus.io'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        baseUrl</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11304" target="_blank" rel="noopener noreferrer" class="">#11304</a>, we optimized our i18n infrastructure with a new <code>i18n.localeConfigs[locale].translate</code> flag that is now <code>false</code> by default for sites that do not use any translations. This leads to an improved dev experience and faster builds for non-i18n sites by avoiding unnecessary file system read attempts of the <code>i18n</code> directory.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11228" target="_blank" rel="noopener noreferrer" class="">#11228</a>, we added a new <code>key</code> attribute to the docs sidebar items, allowing to assign explicit translation keys to each sidebar item that use the same label and would otherwise lead to translation key conflicts:</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">sidebars.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sidebar</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      type</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'category'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      label</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'API'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      key</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'api-for-feature-1'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      items</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      type</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'category'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      label</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'API'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      key</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'api-for-feature-2'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      items</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="mermaid-elk-layouts">Mermaid ELK layouts<a href="https://docusaurus.io/zh-CN/blog/releases/3.9#mermaid-elk-layouts" class="hash-link" aria-label="链接到 Mermaid ELK layouts" title="链接到 Mermaid ELK layouts" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11357" target="_blank" rel="noopener noreferrer" class="">#11357</a>, we added support for <a href="https://mermaid.js.org/intro/syntax-reference.html#supported-layout-algorithms" target="_blank" rel="noopener noreferrer" class="">Mermaid ELK layout algorithm</a>, based on the <a href="https://www.eclipse.org/elk/" target="_blank" rel="noopener noreferrer" class="">Eclipse Layout Kernel (ELK)</a>. Compared to the default Dagre layout, it provides more sophisticated layout capabilities and configuration options, especially useful when working with large or intricate diagrams.</p>
<p>You can enable it by adding the extra <code>@mermaid-js/layout-elk</code> npm dependency, making it possible to use the <code>layout: elk</code> Mermaid diagram metadata:</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token code punctuation" style="color:#393A34">```</span><span class="token code code-language">mermaid</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code code-block language-mermaid">---</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">config:</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token code code-block language-mermaid">  layout: elk</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">---</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">erDiagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    CUSTOMER ||--o{ ORDER : places</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    ORDER ||--|{ LINE-ITEM : contains</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    CUSTOMER }|..|{ DELIVERY-ADDRESS : uses</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code punctuation" style="color:#393A34">```</span><br></div></code></pre></div></div>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/3.9#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h2>
<ul>
<li class="">🇧🇷 <a href="https://github.com/facebook/docusaurus/pull/11315" target="_blank" rel="noopener noreferrer" class="">#11315</a>: Add missing Brazilian Portuguese theme translations.</li>
<li class="">🇺🇦 <a href="https://github.com/facebook/docusaurus/pull/11305" target="_blank" rel="noopener noreferrer" class="">#11305</a>: Add missing Ukrainian theme translations.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.9#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11283" target="_blank" rel="noopener noreferrer" class="">#11283</a>, we added <code>siteConfig.markdown.hooks.{onBrokenMarkdownLinks,onBrokenMarkdownImages}</code> and deprecated <code>siteConfig.onBrokenMarkdownLinks</code>. The new callback hooks also let you recover from broken links/images by returning a fallback URL.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11282" target="_blank" rel="noopener noreferrer" class="">#11282</a>, we added the <code>siteConfig.markdown.emoji</code> config option to disable the previously hard-coded <code>remark-emoji</code> behavior.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11397" target="_blank" rel="noopener noreferrer" class="">#11397</a>, we can now resolve site-aliased Markdown links starting with <code>@site/*</code>, that we already supported for ES imports.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11294" target="_blank" rel="noopener noreferrer" class="">#11294</a> and <a href="https://github.com/facebook/docusaurus/pull/11415" target="_blank" rel="noopener noreferrer" class="">#11415</a>, we upgraded to Rspack 1.5 and leveraging new Rspack config options to make Docusaurus build faster.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11356" target="_blank" rel="noopener noreferrer" class="">#11356</a>, we improved the display of docs sidebar items with long labels.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11405" target="_blank" rel="noopener noreferrer" class="">#11405</a>, we improved visual glitches caused by the <code>useColorMode()</code> hook when switching color modes, glitches that also affected your site's logo in the navbar.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11383" target="_blank" rel="noopener noreferrer" class="">#11383</a>, we disabled a Docusaurus Faster HTML minifier optimization that prevents your site's social card from displaying properly on some social platforms (e.g., LinkedIn).</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11425" target="_blank" rel="noopener noreferrer" class="">#11425</a>, we added the ability for blog authors to display an email icon with a <code>mailto:</code> link (<code>author.socials.email</code>).</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11422" target="_blank" rel="noopener noreferrer" class="">#11422</a>, we removed the <code>copy-text-to-clipboard</code> in favor of the native <code>navigator.clipboard</code> API.</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.9.0">3.9.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.8]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.8</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.8</guid>
            <pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 3.8.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 3.8</strong>.</p>
<p>This release improves build performance, includes new features and introduces "Future Flags" to prepare your site for Docusaurus 4.</p>
<p>Upgrading is easy. We follow <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>, and minor version updates have <strong>no breaking changes</strong>, accordingly to our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-b49b847d6c81d30ed3b8fff82aed14b5.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="performance">Performance<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#performance" class="hash-link" aria-label="链接到 Performance" title="链接到 Performance" translate="no">​</a></h2>
<p>This release keeps improving our build infrastructure performance with various optimizations, and 2 new Docusaurus Faster options.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="docusaurus-faster">Docusaurus Faster<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#docusaurus-faster" class="hash-link" aria-label="链接到 Docusaurus Faster" title="链接到 Docusaurus Faster" translate="no">​</a></h3>
<p><a href="https://github.com/facebook/docusaurus/issues/10556" target="_blank" rel="noopener noreferrer" class="">Docusaurus Faster</a> has been introduced in <a class="" href="https://docusaurus.io/zh-CN/blog/releases/3.6#docusaurus-faster">Docusaurus v3.6</a>, and permits you to opt-in for our upgraded build infrastructure and helps you build your site much faster. The experimental flags can be turned on individually, but we recommend to turn them all at once with this convenient shortcut:</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">experimental_faster</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>Don't forget to install the <code>@docusaurus/faster</code> dependency first!</p></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="persistent-cache">Persistent Cache<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#persistent-cache" class="hash-link" aria-label="链接到 Persistent Cache" title="链接到 Persistent Cache" translate="no">​</a></h4>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10931" target="_blank" rel="noopener noreferrer" class="">#10931</a>, we have enabled the <strong><a href="https://rspack.dev/blog/announcing-1-2#persistent-cache" target="_blank" rel="noopener noreferrer" class="">Rspack persistent cache</a></strong>. Similarly to the <a href="https://webpack.js.org/blog/2020-10-10-webpack-5-release/#persistent-caching" target="_blank" rel="noopener noreferrer" class="">Webpack persistent cache</a> (already supported), it permits to greatly speed up the bundling of the Docusaurus app on subsequent builds.</p>
<p>In practice, your site should build much faster if you run <code>docusaurus build</code> a second time.</p>
<p>This feature depends on using the <a href="https://rspack.dev/" target="_blank" rel="noopener noreferrer" class="">Rspack bundler</a>, and can be turned on with the <code>rspackPersistentCache</code> flag:</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">experimental_faster</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">rspackBundler</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// required flag</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">rspackPersistentCache</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// new flag</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-caution admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Preserving the cache</div><div class="admonitionContent_Knsx"><p>The persistent cache requires preserving the <code>./node_modules/.cache</code> folder across builds.</p><p>Popular CDNs such as Netlify and Vercel do that for you automatically. Depending on your CI and deployment pipeline, additional configuration can be needed to preserve the cache.</p></div></div>
<p><strong>Result</strong>: On average, you can expect your site's bundling time to be ~2-5× faster on rebuilds 🔥. The impact can be even more significant if you <a href="https://github.com/facebook/docusaurus/discussions/11199" target="_blank" rel="noopener noreferrer" class="">disable the optional <code>concatenateModule</code> optimization</a>.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="worker-threads">Worker Threads<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#worker-threads" class="hash-link" aria-label="链接到 Worker Threads" title="链接到 Worker Threads" translate="no">​</a></h4>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10826" target="_blank" rel="noopener noreferrer" class="">#10826</a>, we introduced a <a href="https://github.com/tinylibs/tinypool" target="_blank" rel="noopener noreferrer" class="">Node.js Worker Thread pool</a> to run the static side generation code. With this new strategy, we can better leverage all the available CPUs, reduce static site generation time, and contain potential memory leaks.</p>
<p>This feature can be turned on with the <code>ssgWorkerThreads</code> flag, and requires the <a href="https://docusaurus.io/zh-CN/blog/releases/3.8#postbuild-change" class=""><code>v4.removeLegacyPostBuildHeadAttribute</code></a> Future Flag to be turned on:</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">v4</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">removeLegacyPostBuildHeadAttribute</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// required</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">experimental_faster</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">ssgWorkerThreads</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p><strong>Result</strong>: On average, you can expect your site's static site generation time to be ~2× times faster 🔥. This was measured on a MacBook Pro M3 and result may vary depending on your CI.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-optimizations">Other Optimizations<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#other-optimizations" class="hash-link" aria-label="链接到 Other Optimizations" title="链接到 Other Optimizations" translate="no">​</a></h3>
<p>We identified and resolved several major bottlenecks, including:</p>
<ul>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11007" target="_blank" rel="noopener noreferrer" class="">#11007</a>, we optimized the dev server startup time for macOS users. We figured out that the code to open your browser used expensive synchronous/blocking calls that prevented the bundler from doing its work. From now on, the bundler and the macOS browser opening will run in parallel, leading to a faster <code>docusaurus start</code> experience for all macOS users.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11163" target="_blank" rel="noopener noreferrer" class="">#11163</a>, we noticed that the docs <code>showLastUpdateAuthor</code> and <code>showLastUpdateTime</code> are quite expensive, and require to run a <code>git log</code> command for each document. On large sites, running these commands in parallel can exhaust the system and lead to Node.js <code>EBADF</code> errors. We implemented a Git command queue to avoid exhausting the system, which also slightly increased performance of our plugin's <code>loadContent()</code> lifecycle.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10885" target="_blank" rel="noopener noreferrer" class="">#10885</a>, we implemented an SVG sprite for the external link icon. Due to its repeated appearance in various places of your site (navbar, footer, sidebars...), using a React SVG component lead to duplicated SVG markup in the final HTML. Using a sprite permits to only embed the icon SVG once, reducing the generated HTML size and the static generation time. We <a href="https://github.com/facebook/docusaurus/issues/5865" target="_blank" rel="noopener noreferrer" class="">plan to use more SVG sprites</a> in the future.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11176" target="_blank" rel="noopener noreferrer" class="">#11176</a>, we fine-tuned the webpack/Rspack configuration to remove useless optimizations.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>If bundling time is a concern, consider disabling the optional <code>concatenateModule</code> bundler optimization. We explain the tradeoffs and how to do it <a href="https://github.com/facebook/docusaurus/discussions/11199" target="_blank" rel="noopener noreferrer" class="">here</a>. It only saves 3% JS, and for a very large site, this change was incredibly impactful: 4x faster on cold builds, x16 faster rebuilds 🔥.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="impact">Impact<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#impact" class="hash-link" aria-label="链接到 Impact" title="链接到 Impact" translate="no">​</a></h3>
<p>We have upgraded the <a href="https://github.com/facebook/react-native-website/pull/4607" target="_blank" rel="noopener noreferrer" class="">React Native website to Docusaurus v3.8</a> already. Here's an updated benchmark showing the global Docusaurus Faster impact on total build time for a site with ~2000 pages:</p>
<table><thead><tr><th>ReactNative.dev</th><th>Cold Build</th><th>Warm Rebuild</th></tr></thead><tbody><tr><td>🐢 Docusaurus Slower</td><td>120s (baseline)</td><td>33s (3.6 × faster)</td></tr><tr><td>⚡️ Docusaurus Faster</td><td>31s (3.8 × faster)</td><td>17s (7 × faster)</td></tr></tbody></table>
<p>We measured similar results on our website:</p>
<table><thead><tr><th>Docusaurus.io</th><th>Cold Build</th><th>Warm Rebuild</th></tr></thead><tbody><tr><td>🐢️ Docusaurus Slower</td><td>146s (baseline)</td><td>45s (3.2 × faster)</td></tr><tr><td>⚡️ Docusaurus Faster</td><td>42s (3.5 × faster)</td><td>24s (6.1 × faster)</td></tr></tbody></table>
<p>You can also expect memory usage improvements, and a faster <code>docusaurus start</code> experience.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="future-flags">Future Flags<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#future-flags" class="hash-link" aria-label="链接到 Future Flags" title="链接到 Future Flags" translate="no">​</a></h2>
<p>The Docusaurus v4 Future Flags let you <strong>opt-in for upcoming Docusaurus v4 breaking changes</strong>, and help you manage them incrementally, one at a time. Enabling all the future flags will make your site easier to upgrade to Docusaurus v4 when it's released.</p>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>not invented here</div><div class="admonitionContent_Knsx"><p>The concept of Future Flags is not our invention. It has been popularized in the Remix community. You can read more about this gradual feature adoption strategy here:</p><ul>
<li class=""><a href="https://remix.run/docs/en/main/guides/api-development-strategy" target="_blank" rel="noopener noreferrer" class="">Gradual Feature Adoption with Future Flags</a></li>
<li class=""><a href="https://remix.run/blog/future-flags" target="_blank" rel="noopener noreferrer" class="">Future Proofing Your Remix App</a></li>
</ul></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Turn all the v4 future flags on</div><div class="admonitionContent_Knsx"><p>You can turn all the v4 Future Flags on at once with the following shortcut:</p><div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">v4</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div><p>This way, you are sure to always keep your site prepared for Docusaurus v4. Be aware that we'll introduce more Future Flags in the next minor versions. When upgrading, always read our release blog posts to understand the new breaking changes you opt into.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="css-cascade-layers">CSS Cascade Layers<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#css-cascade-layers" class="hash-link" aria-label="链接到 CSS Cascade Layers" title="链接到 CSS Cascade Layers" translate="no">​</a></h3>
<p>In Docusaurus v4, we plan to leverage <a href="https://css-tricks.com/css-cascade-layers/" target="_blank" rel="noopener noreferrer" class="">CSS Cascade Layers</a>. This modern CSS feature is widely supported and permits to group CSS rules in layers of specificity. It is particularly useful to give you more control over the CSS cascade. It makes the CSS rules less dependent on their insertion order. Your un-layered rules will now always override the layered CSS we provide.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11142" target="_blank" rel="noopener noreferrer" class="">#11142</a>, we implemented a new experimental <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-css-cascade-layers"><code>@docusaurus/plugin-css-cascade-layers</code></a> that you can turn on through the <code>v4.useCssCascadeLayers</code> flag if you use the classic preset:</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">v4</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">useCssCascadeLayers</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>We consider this feature as a <strong>breaking change</strong> because it can slightly alter the CSS rules application order in customized sites. These issues are usually limited, and relatively easy to fix (see for example the <a href="https://github.com/facebook/react-native-website/pull/4607" target="_blank" rel="noopener noreferrer" class="">React Native CSS changes</a>). Sites that do not provide custom CSS and do not swizzle any component should not be affected.</p>
<p>In practice, it permits to automatically apply built-in CSS Cascade Layers to all the CSS we provide, including our opinionated CSS framework <a href="https://infima.dev/" target="_blank" rel="noopener noreferrer" class="">Infima</a>:</p>
<div class="language-css codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-css codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token atrule rule" style="color:#D73A49">@layer</span><span class="token atrule" style="color:#22863A"> docusaurus.infima</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector" style="color:#6F42C1">h1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Infima css rules */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector" style="color:#6F42C1">pre</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Infima css rules */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Layers can help solves our long-standing <a href="https://github.com/facebook/docusaurus/issues/6032" target="_blank" rel="noopener noreferrer" class="">Global CSS pollution issue</a>. Our built-in global CSS rules may conflict with yours, making it harder to use Docusaurus to create playgrounds, demos and embedded widgets that are isolated from our CSS. Thankfully, <a href="https://mayank.co/blog/revert-layer/" target="_blank" rel="noopener noreferrer" class="">CSS Cascade Layers can be reverted</a> to create HTML subtrees that are not affected by the CSS Docusaurus provides.</p>
<details class="details_Nokh alert alert--info details_Cn_P" data-collapsed="true"><summary>Reverting layers</summary><div><div class="collapsibleContent_EoA1"><p>As <a href="https://github.com/facebook/docusaurus/pull/11142" target="_blank" rel="noopener noreferrer" class="">this issue</a> and <a href="https://mayank.co/blog/revert-layer/" target="_blank" rel="noopener noreferrer" class="">this blog post</a> explain, it is possible to revert layers to isolate an HTML subtree from the CSS that comes from that layer.</p><p>In practice, you can create a <code>.my-playground</code> class to revert the global CSS coming from Infima:</p><div class="language-css codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-css codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#6B6B6B;font-style:italic">/* The "impossible" :not() selector helps increase the specificity */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#6F42C1">.my-playground</span><span class="token selector pseudo-class" style="color:#6F42C1">:not</span><span class="token selector punctuation" style="color:#393A34">(</span><span class="token selector id" style="color:#6F42C1">#a</span><span class="token selector id" style="color:#6F42C1">#b</span><span class="token selector punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector" style="color:#6F42C1">&amp;</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#6F42C1"></span><br></div><div class="token-line" style="color:#393A34"><span class="token selector" style="color:#6F42C1">  *</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token atrule rule" style="color:#D73A49">@layer</span><span class="token atrule" style="color:#22863A"> docusaurus.infima</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#005CC5">all</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> revert-layer</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div><p>Then you can apply this class to any HTML element, so that Infima doesn't apply to any of its children. The HTML subtree becomes isolated from our built-in CSS.</p><div style="padding:10px"><div class="browserWindow_my1Q" style="min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">/tests/pages/style-isolation?docusaurus-data-navbar=false</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs" style="padding:0"><iframe src="/tests/pages/style-isolation?docusaurus-data-navbar=false" title="/tests/pages/style-isolation?docusaurus-data-navbar=false" style="display:block;width:100%;height:300px"></iframe></div></div></div></div></div></details>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="postbuild-change"><code>postBuild()</code> Change<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#postbuild-change" class="hash-link" aria-label="链接到 postbuild-change" title="链接到 postbuild-change" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10850" target="_blank" rel="noopener noreferrer" class="">#10850</a>, we added a new <code>removeLegacyPostBuildHeadAttribute</code> Future Flag that slightly changes the signature of the <code>postBuild()</code> plugin lifecycle method, removing the <code>head</code> attribute.</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">v4</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">removeLegacyPostBuildHeadAttribute</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>This legacy data structure is coming from our <a href="https://github.com/staylor/react-helmet-async" target="_blank" rel="noopener noreferrer" class="">react-helmet-async</a> dependency and should have never been exposed as public API in the first place. It is not serializable, which prevents us from implementing <a href="https://docusaurus.io/zh-CN/blog/releases/3.8#worker-threads" class="">Worker Threads for the static site generation</a>.</p>
<p>While technically a <strong>breaking change</strong>, we believe this change will not affect anyone. We couldn't find any open source plugin that uses the <code>head</code> parameter that this method receives. If turning this flag on breaks your site, please let us know <a href="https://github.com/facebook/docusaurus/pull/10850" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="system-color-mode">System Color Mode<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#system-color-mode" class="hash-link" aria-label="链接到 System Color Mode" title="链接到 System Color Mode" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10987" target="_blank" rel="noopener noreferrer" class="">#10987</a>, the classic theme now lets you revert the color mode to the system/OS value.</p>
<div class="browserWindow_my1Q"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">http://localhost:3000</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs"><div class="margin-vert--md" style="display:flex;justify-content:center"><div class="toggle_bT41"><button class="clean-btn toggleButton_x9TT toggleButtonDisabled_Dj8q" type="button" disabled="" title="系统模式" aria-label="切换浅色/暗黑模式（当前为系统模式）"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_nCQi lightToggleIcon_dnYY"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_nCQi darkToggleIcon_OBbf"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_nCQi systemToggleIcon_IWwm"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div></div></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="code-block-refactor">Code Block Refactor<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#code-block-refactor" class="hash-link" aria-label="链接到 Code Block Refactor" title="链接到 Code Block Refactor" translate="no">​</a></h2>
<p>In <a href="https://github.com/facebook/docusaurus/pull/11058" target="_blank" rel="noopener noreferrer" class="">#11058</a>, <a href="https://github.com/facebook/docusaurus/pull/11059" target="_blank" rel="noopener noreferrer" class="">#11059</a>, <a href="https://github.com/facebook/docusaurus/pull/11062" target="_blank" rel="noopener noreferrer" class="">#11062</a> and <a href="https://github.com/facebook/docusaurus/pull/11077" target="_blank" rel="noopener noreferrer" class="">#11077</a>, the theme code block components have been significantly refactored in a way that should be much easier to swizzle and extend.</p>
<p>According to our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a>, this is not a breaking change, but sites that have swizzled these components may need to upgrade them.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h2>
<ul>
<li class="">🇹🇷 <a href="https://github.com/facebook/docusaurus/pull/10893" target="_blank" rel="noopener noreferrer" class="">#10893</a>: Add missing Turkish theme translations.</li>
<li class="">🇵🇱 <a href="https://github.com/facebook/docusaurus/pull/10884" target="_blank" rel="noopener noreferrer" class="">#10884</a>: Add missing Polish theme translations.</li>
<li class="">🇨🇳 <a href="https://github.com/facebook/docusaurus/pull/10816" target="_blank" rel="noopener noreferrer" class="">#10816</a>: Add missing Chinese theme translations.</li>
<li class="">🇯🇵 <a href="https://github.com/facebook/docusaurus/pull/11030" target="_blank" rel="noopener noreferrer" class="">#11030</a>: Add missing Japanese theme translations.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="maintenance">维护<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#maintenance" class="hash-link" aria-label="链接到 维护" title="链接到 维护" translate="no">​</a></h2>
<p>Docusaurus 3.8 is ready for <a href="https://github.com/facebook/docusaurus/pull/11168" target="_blank" rel="noopener noreferrer" class="">Node.js 24</a> and <a href="https://github.com/facebook/docusaurus/pull/10966" target="_blank" rel="noopener noreferrer" class="">TypeScript 5.8</a>.</p>
<p>We also removed useless npm packages and internalizing unmaintained ones:</p>
<ul>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11010" target="_blank" rel="noopener noreferrer" class="">#11010</a> and <a href="https://github.com/facebook/docusaurus/pull/11014" target="_blank" rel="noopener noreferrer" class="">#11014</a>, we internalized the unmaintained <code>react-ideal-image</code> and <code>react-waypoint</code> package used in <code>@docusaurus/plugin-ideal-image</code>, and made them compatible with React 19.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10956" target="_blank" rel="noopener noreferrer" class="">#10956</a>, we removed our dependency to the unmaintained <code>react-dev-utils</code> package (from Create-React-App).</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10358" target="_blank" rel="noopener noreferrer" class="">#10358</a>, we replaced the unmaintained <code>shelljs</code> package by <code>execa</code></li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11138" target="_blank" rel="noopener noreferrer" class="">#11138</a>, we removed the <code>reading-time</code> package in favor of the built-in <code>Intl.Segmenter</code> standard API to compute blog post reading times.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11037" target="_blank" rel="noopener noreferrer" class="">#11037</a>, we removed the useless <code>clean-webpack-plugin</code>.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.8#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10852" target="_blank" rel="noopener noreferrer" class="">#10852</a>, the theme <code>docsVersionDropdown</code> navbar item now accepts a <code>versions</code> attribute.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10953" target="_blank" rel="noopener noreferrer" class="">#10953</a>, the <code>@docusaurus/remark-plugin-npm2yarn</code> plugin now supports Bun tabs conversions by default.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10945" target="_blank" rel="noopener noreferrer" class="">#10945</a>, more stable CSS classes are now applied to the main theme layout elements, to let you create more reliable CSS selectors.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10846" target="_blank" rel="noopener noreferrer" class="">#10846</a>, the Markdown code block <code>showLineNumbers</code> metastring can now accept a number to initialize the line counter initial value.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11090" target="_blank" rel="noopener noreferrer" class="">#11090</a>, we made it easier to provide a custom page title formatter.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/11088" target="_blank" rel="noopener noreferrer" class="">#11088</a>, the page plugin now supports <code>frontMatter.slug</code> like docs and blog plugins already do.</li>
<li class="">In <a href="https://github.com/facebook/docusaurus/pull/10875" target="_blank" rel="noopener noreferrer" class="">#10875</a>, the docs versioning CLI now also copies localized docs JSON translation files.</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.8.0">3.8.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.7]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.7</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.7</guid>
            <pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[我们很高兴地宣布 Docusaurus 3.7 现已发布。]]></description>
            <content:encoded><![CDATA[<p>我们很高兴地宣布 <strong>Docusaurus 3.7</strong> 现已发布。</p>
<p>Docusaurus 现已完全兼容 <a href="https://react.dev/blog/2024/12/05/react-19" target="_blank" rel="noopener noreferrer" class="">React 19</a>。</p>
<p>Upgrading should be easy. Our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a> respects <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-73a479db9ad439c10153f05dc03fdc91.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlight">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.7#highlight" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="react-19">React 19<a href="https://docusaurus.io/zh-CN/blog/releases/3.7#react-19" class="hash-link" aria-label="链接到 React 19" title="链接到 React 19" translate="no">​</a></h3>
<p>在 <a href="https://github.com/facebook/docusaurus/pull/10763" target="_blank" rel="noopener noreferrer" class="">#10763</a> 这一个更新中，我们添加了对 <a href="https://react.dev/blog/2024/12/05/react-19" target="_blank" rel="noopener noreferrer" class="">React 19</a> 的支持，Docusaurus 网站已经在 React 19 上运行。</p>
<p>从现在起，所有新初始化的站点默认都会在 React 19 上运行，Docusaurus v4 的最低要求版本将是 React 19 。</p>
<p>不过，React 18 仍然能够得到支持，现有的 Docusaurus 站点可以选择留在React 18，或者将其依赖升级到 React 19：</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> "name": "my-docusaurus-site",</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> "dependencies": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">   "react": "^18.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">   "react-dom": "^18.0.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   "react": "^19.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   "react-dom": "^19.0.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token plain">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>警告</div><div class="admonitionContent_Knsx"><p>无需立即升级您的网站。</p><p>React 19 要比 React 18重一点。 由于我们支持这两种版本，我们还不会对 React19 独有的功能施加影响。</p><p>然而，可以升级到 React 19 准备你的 Docusaurus v4 站点，将来可能会逐步减少 React 18 的支持。</p><p>以下是在 Docusaurus v4 之前升级您的网站的良好理由：</p><ul>
<li class="">你有自定义的 React 代码，并且想要确保它已为 React19 准备就绪</li>
<li class="">您计划在自己的代码中利用新的 React 19 的特性</li>
<li class="">您使用自定义或第三方插件，并且想要确保它们的兼容性</li>
<li class="">You have a monorepo and want to align the React dependency to v19 for all packages</li>
</ul></div></div>
<p>Along the way, we <a href="https://github.com/facebook/docusaurus/pull/10786" target="_blank" rel="noopener noreferrer" class="">fixed</a> all the remaining hydration errors reported by React 19, some of them produced by our aggressive HTML minifier settings.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="svgr-plugin">SVGR 插件<a href="https://docusaurus.io/zh-CN/blog/releases/3.7#svgr-plugin" class="hash-link" aria-label="链接到 SVGR 插件" title="链接到 SVGR 插件" translate="no">​</a></h3>
<p>Docusaurus 内置支持 <a href="https://github.com/gregberge/svgr" target="_blank" rel="noopener noreferrer" class="">SVGR</a>，允许您将 SVG 文件作为 React 组件无缝导入并使用：</p>
<div class="language-tsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-tsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">DocusaurusSvg</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'./docusaurus.svg'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#116329">DocusaurusSvg</span><span class="token tag" style="color:#22863A"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>This built-in support has been the source of various bug reports due to the inability to customize the <a href="https://react-svgr.com/docs/options/" target="_blank" rel="noopener noreferrer" class="">SVGR Options</a>, in particular the <a href="https://svgo.dev/" target="_blank" rel="noopener noreferrer" class="">SVG Optimizer</a> options.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10677" target="_blank" rel="noopener noreferrer" class="">#10677</a>, we extracted a new <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-svgr"><code>@docusaurus/plugin-svgr</code></a> that you can now configure according to your needs. 默认情况下它包含在我们经典预设中：</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">presets</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#C6105F">'classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#005CC5">svgr</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#005CC5">svgrConfig</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// 您的 SVGR 选项...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#005CC5">svgoConfig</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// 您的 SVGO 选项...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Use "svgoConfig: undefined" to use a svgo.config.js file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.7#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10768" target="_blank" rel="noopener noreferrer" class="">#10768</a>: Blog authors have built-in icons for social platforms bluesky, mastodon, threads, twitch, youtube, instagram.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10729" target="_blank" rel="noopener noreferrer" class="">#10729</a>：博客现在支持 <code>frontMatter.sidebar_label</code></li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10803" target="_blank" rel="noopener noreferrer" class="">#10803</a>: <code>@docusaurus/remark-plugin-npm2yarn</code> 现在支持 Bun 转换</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10672" target="_blank" rel="noopener noreferrer" class="">#10672</a>：将 Algolia DocSearch 升级到 <code>algoliasearch</code> v5</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10800" target="_blank" rel="noopener noreferrer" class="">#10800</a>: Docusaurus Faster turns Rspack incremental mode on by default.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10783" target="_blank" rel="noopener noreferrer" class="">#10783</a>：改进荷兰语的主题翻译</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10760" target="_blank" rel="noopener noreferrer" class="">#10760</a>：改进韩文的主题翻译</li>
</ul>
<p>查看 <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.7.0">3.7.0 changelog entry</a></strong> 以获取更详细的变更列表</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.6]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.6</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.6</guid>
            <pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[我们很高兴地宣布 Docusaurus 3.6 现已发布。]]></description>
            <content:encoded><![CDATA[<p>我们很高兴地宣布 <strong>Docusaurus 3.6</strong> 现已发布。</p>
<p>Docusaurus 现在可以⚡️⚡️⚡️: <strong>更快的</strong> 构建你的网站。</p>
<p>Upgrading should be easy. Our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a> respects <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-5214adcb56c496fa6afc571fb4d378f6.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<p>该版本主要专注于通过 <a href="https://github.com/facebook/docusaurus/issues/10556" target="_blank" rel="noopener noreferrer" class="">Docusaurus Faster</a> 项目构建性能。</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="docusaurus-faster">Docusaurus Faster<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#docusaurus-faster" class="hash-link" aria-label="链接到 Docusaurus Faster" title="链接到 Docusaurus Faster" translate="no">​</a></h2>
<p><a href="https://github.com/facebook/docusaurus/issues/10556" target="_blank" rel="noopener noreferrer" class="">Docusaurus Faster</a>项目的目标是减少构建时间和内存消耗。</p>
<p>我们致力于多个优化和使我们的基础设施现代化，以便更快地使用基于Rus的工具，特别是：</p>
<ul>
<li class="">🦀 <a href="https://rspack.dev/" target="_blank" rel="noopener noreferrer" class="">Rspack</a>: 基于Rust的快速网页打包工具, 几乎是可以作为 <a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer" class="">webpack</a>的完全替代品</li>
<li class="">🦀 <a href="https://swc.rs/" target="_blank" rel="noopener noreferrer" class="">SWC</a>: 快速的网页编辑器，基于Rust的网页平台(HTML, CS, JS)</li>
<li class="">🦀 <a href="https://lightningcss.dev/" target="_blank" rel="noopener noreferrer" class="">Lightning CSS</a>: 一个极为快速的 CSS 解析器、翻译器、打包工具和压缩器。</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="impacts">影响<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#impacts" class="hash-link" aria-label="链接到 影响" title="链接到 影响" translate="no">​</a></h3>
<p>采用新的基础设施可能会产生各种影响。 由于不可能将所有问题全部列举出来，因此我们将重点关注主要的几个。</p>
<p>为了帮助您轻松地使用它，我们在预期的静态站点输出和<a class="" href="https://docusaurus.io/zh-CN/docs/browser-support">浏览器支持</a> 方面相当保守。</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="build-time">构建时间<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#build-time" class="hash-link" aria-label="链接到 构建时间" title="链接到 构建时间" translate="no">​</a></h4>
<p>社区网站上的基准测试显示，您可以期待您的生产网站构建速度 ⚡️ 提高 2 到 4 倍！ 🔥:</p>
<ul>
<li class=""><a href="https://github.com/facebook/react-native-website/pull/4268" target="_blank" rel="noopener noreferrer" class="">React Native website</a>: 速度提升了 3.04x 倍 🔥</li>
<li class=""><a href="https://github.com/babel/website/pull/2997" target="_blank" rel="noopener noreferrer" class="">Babel website</a>: 速度提升了 3.27x 倍 🔥</li>
<li class=""><a href="https://github.com/facebook/lexical/pull/6761" target="_blank" rel="noopener noreferrer" class="">Lexical website</a>: 速度提升了 2x 倍 🔥</li>
</ul>
<p><a href="https://github.com/facebook/docusaurus/issues/10556#issuecomment-2407671873" target="_blank" rel="noopener noreferrer" class="">如何进行基准测试</a></p>
<div class="theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>关于重建</div><div class="admonitionContent_Knsx"><p><a href="https://rspack.dev/misc/planning/rowmap#persistent-cache" target="_blank" rel="noopener noreferrer" class="">Rspack 目前尚不支持持久缓存</a>，但它在开发路线图上，预计很快会实现。 我们认为，这对 Rspack 的采用并不是一个问题，因为冷启动的 Rspack 构建通常与使用持久缓存的热 Webpack 构建一样快。</p></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="memory-consumption">内存消耗<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#memory-consumption" class="hash-link" aria-label="链接到 内存消耗" title="链接到 内存消耗" translate="no">​</a></h4>
<p>您还应该注意到内存消耗的改进：</p>
<ul>
<li class="">新基础设施消耗总内存减少</li>
<li class="">我们修复了一个重要的<a href="https://github.com/facebook/docusaurus/pull/10599" target="_blank" rel="noopener noreferrer" class="">内存泄漏</a>，它特别影响到i18n 站点</li>
<li class="">我们添加了<a href="https://github.com/facebook/docusaurus/pull/10601" target="_blank" rel="noopener noreferrer" class="">CI检查</a>，以确保我们不会出现回归问题，并且我们的站点和初始化模版都能在内存受限的环境中构建。</li>
<li class="">我们添加了<a href="https://github.com/facebook/docusaurus/pull/10590" target="_blank" rel="noopener noreferrer" class="">内部工具</a>以更好地理解构建的哪一步消耗内存</li>
<li class="">我们<a href="https://github.com/facebook/docusaurus/pull/10410" target="_blank" rel="noopener noreferrer" class="">移除了一个 <code>process.exit(0)</code></a>，该代码可能会掩盖您自己代码和第三方插件中的内存泄漏问题。</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-impacts">其他影响<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#other-impacts" class="hash-link" aria-label="链接到 其他影响" title="链接到 其他影响" translate="no">​</a></h4>
<ul>
<li class="">HTML 压缩器现在可以<a href="https://github.com/facebook/docusaurus/discussions/10580" target="_blank" rel="noopener noreferrer" class="">在出现无效的 HTML markup时发出警告</a></li>
<li class="">静态 HTML 输出 <a href="https://github.com/facebook/docusaurus/pull/10554" target="_blank" rel="noopener noreferrer" class="">减少了~5%的大小</a></li>
<li class="">一些错误被新的基础结构自动修复</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="adoption-strategy">采用策略<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#adoption-strategy" class="hash-link" aria-label="链接到 采用策略" title="链接到 采用策略" translate="no">​</a></h3>
<p>这种新的基础设施是一种突破性的变化，但它是选择性的，不需要新版本的Docusaurus。</p>
<p>在使用 Docusaurus 更快之前，添加这个新包：</p>
<div class="theme-tabs-container tabs-container tabList_Qoir"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_AQgk tabs__item--active">npm</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_AQgk">Yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_AQgk">pnpm</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_AQgk">Bun</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_pnkT"><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">npm</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">install</span><span class="token plain"> @docusaurus/faster</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_pnkT" hidden=""><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">yarn</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">add</span><span class="token plain"> @docusaurus/faster</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_pnkT" hidden=""><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">pnpm</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">add</span><span class="token plain"> @docusaurus/faster</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_pnkT" hidden=""><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">bun </span><span class="token function" style="color:#8250DF">add</span><span class="token plain"> @docusaurus/faster</span><br></div></code></pre></div></div></div></div></div>
<p>为了帮助您在 <strong>在Docusaurus v3</strong>中逐步采用它，我们引入了一组可以逐步激活的功能标志。</p>
<p>我们建议通过这个简单的布尔快捷方式一次性启用它们：</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">experimental_faster</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>如果其中一个功能标志不适用于您的网站，可以独立启用功能标志：</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    experimental_faster</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      swcJsLoader</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      swcJsMinimizer</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      swcHtmlMinimizer</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      lightningCssMinimizer</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      rspackBundler</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      mdxCrossCompilerCache</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10435" target="_blank" rel="noopener noreferrer" class=""><code>swcJsLoader</code></a>: 使用 <a href="https://swc.rs/" target="_blank" rel="noopener noreferrer" class="">SWC</a> 转换JS(而不是 <a href="https://babeljs.io/" target="_blank" rel="noopener noreferrer" class="">Babel</a>)</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10441" target="_blank" rel="noopener noreferrer" class=""><code>swcJsLoader</code></a>: 使用 <a href="https://swc.rs/" target="_blank" rel="noopener noreferrer" class="">SWC</a> 转换JS(而不是 <a href="https://github.com/terser/terser" target="_blank" rel="noopener noreferrer" class="">Babel</a>)</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10554" target="_blank" rel="noopener noreferrer" class=""><code>swcHtmlMinimizer </code></a>: 使用 <a href="https://swc.rs/" target="_blank" rel="noopener noreferrer" class="">SWC</a> 来挖掘HTML和嵌入式JS/CSS(而不是 <a href="https://github.com/terser/html-minifier-terser" target="_blank" rel="noopener noreferrer" class="">html-minifier-terser</a>)</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10522" target="_blank" rel="noopener noreferrer" class=""><code>lightningCssMinimizer</code></a>：使用 <a href="https://lightningcss.dev/" target="_blank" rel="noopener noreferrer" class="">Lightning CSSS</a> 来缩小CSS (而不是 <a href="https://github.com/cssnano/cssnano" target="_blank" rel="noopener noreferrer" class="">cssnano</a> 和 <a href="https://github.com/clean-css/clean-css" target="_blank" rel="noopener noreferrer" class="">clean-css</a>)</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10402" target="_blank" rel="noopener noreferrer" class=""><code>rspackBundler</code></a>：使用 <a href="https://rspack.dev/" target="_blank" rel="noopener noreferrer" class="">Rspack</a> 打包您的应用程序(而不是 <a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer" class="">webpack</a>)</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10479" target="_blank" rel="noopener noreferrer" class=""><code>mdxCrossCompilerCache</code></a>：一次同时为浏览器/Node.js环境编译MDX文件，而不是两次。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>实验功能但安全</div><div class="admonitionContent_Knsx"><p>不要害怕打开此功能。 配置选项是实验性的。</p><p>新的基础设施是牢固的，我们的综合基础设施管道对其进行了很好的考验。 <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">Docusaurus网站</a>已经在生产中使用了它，我们也计划在其他Meta文档网站上使用它。</p></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="plugins">插件<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#plugins" class="hash-link" aria-label="链接到 插件" title="链接到 插件" translate="no">​</a></h4>
<p>新的基础设施使用 <a href="https://rspack.dev/" target="_blank" rel="noopener noreferrer" class="">Rspack</a>。 碰巧的是，Rspack 与 <a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer" class="">webpack</a> 几乎 100% 兼容，并且 Rspack 不会破坏我们的插件生态系统。</p>
<p>大多数Docusaurus插件都应该可以与Rspack开箱即用，即使是那些实现了<a class="" href="https://docusaurus.io/zh-CN/docs/api/plugin-methods/lifecycle-apis#configureWebpack"><code>configureWebpack</code></a> 的插件。</p>
<p>然而，其中有些需要做小的修改，以使其与Rspack兼容。 一般的想法是避免直接导入 <code>webpack</code> ，而是使用 "动态提供" webpack 实例：</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">import webpack from 'webpack';</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">export default function (context, options) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> return {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">   name: 'custom-docusaurus-plugin',</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">   configureWebpack(config, isServer) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   configureWebpack(config, isServer, {currentBundler}) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">     return {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">       plugins: [</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">         new webpack.DefinePlugin({}),</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">         new currentBundler.instance.DefinePlugin({}),</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">       ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">     };</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">   },</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> };</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token plain">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>插件作者</div><div class="admonitionContent_Knsx"><p>查看<a href="https://github.com/facebook/docusaurus/issues/10572" target="_blank" rel="noopener noreferrer" class="">专用问题</a>获取指南和支持。</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="next-steps">后续步骤<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#next-steps" class="hash-link" aria-label="链接到 后续步骤" title="链接到 后续步骤" translate="no">​</a></h3>
<p>这是一个开端：我们将继续开发<a href="https://github.com/facebook/docusaurus/issues/10556" target="_blank" rel="noopener noreferrer" class="">Docusaurus Faster</a>项目，并且已经计划了一些更多的性能改进。</p>
<p>取决于<a href="https://github.com/facebook/docusaurus/issues/10556" target="_blank" rel="noopener noreferrer" class="">您的反馈</a>, 我们计划在即将到来的主要版本Docusaurus中将此新基础设施设置为默认。</p>
<p>🙏 我们感谢所有这些伟大工具的作者，这些工具已经帮助我们使Docusaurus比以前快得多。 特别感谢 <a href="https://rspack.dev/misc/team/core-team" target="_blank" rel="noopener noreferrer" class="">Rspack 团队</a> 在整个过程中对我们的支持，他们迅速处理了我们的反馈，并现了我们所需的所有缺失功能，使这一切得以顺利进行。 👏</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="rsdoctor-plugin">Rsdoctor 插件<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#rsdoctor-plugin" class="hash-link" aria-label="链接到 Rsdoctor 插件" title="链接到 Rsdoctor 插件" translate="no">​</a></h2>
<p>在 <a href="https://github.com/facebook/docusaurus/pull/10588" target="_blank" rel="noopener noreferrer" class="">#10588</a>中, 我们创建了一个 <a href="https://rsdoctor.dev/" target="_blank" rel="noopener noreferrer" class="">Rsdoctor</a>的Docusaurus插件. 它分析了 Docusaurus 的打包阶段，帮助你找出在加载器、插件和压缩器方面导致打包速度变慢的原因。 它同时适用于webpack 和 Rspack。</p>
<p><img decoding="async" loading="lazy" alt="加载时间轴示例" src="https://docusaurus.io/zh-CN/assets/images/rsdoctor-36963a4eaca95f83538208463e62eae2.jpg" width="1436" height="690" class="img_vXGZ"></p>
<p>要使用它，请安装新的 <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-rsdoctor"><code>@docusaurus/plugin-rsdoctor</code></a> 包，然后在你的配置中使用插件：</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  plugins</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#C6105F">'rsdoctor'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* options */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>基于环境变量有条件地启用它：</p><div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  plugins</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#005CC5">RSDOCTOR</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">===</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'true'</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">&amp;&amp;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#C6105F">'rsdoctor'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* options */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#6B6B6B;font-style:italic"># Build without Rsdoctor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#8250DF">npm</span><span class="token plain"> run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic"># Build with Rsdoctor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#E36209">RSDOCTOR</span><span class="token operator" style="color:#D73A49">=</span><span class="token plain">true </span><span class="token function" style="color:#8250DF">npm</span><span class="token plain"> run build</span><br></div></code></pre></div></div></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="mermaid">Mermaid<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#mermaid" class="hash-link" aria-label="链接到 Mermaid" title="链接到 Mermaid" translate="no">​</a></h2>
<p>在 <a href="https://github.com/facebook/docusaurus/pull/10510" target="_blank" rel="noopener noreferrer" class="">#10510</a> 中，我们放宽了我们的 <a href="https://mermaid.js.org/" target="_blank" rel="noopener noreferrer" class="">Mermaid diagrams</a> 依赖范围以允许较新的主要版本的Mermaid。 我们现在支持 Mermaid 10 和 11，并预计即将发布的版本也将兼容，让您可以根据自己的需求进行升级。</p>
<p>解锁了新的图表类型，例如 <a href="https://mermaid.js.org/syntax/structure" target="_blank" rel="noopener noreferrer" class="">架构图</a>：</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h2>
<ul>
<li class="">🇸🇮 <a href="https://github.com/facebook/docusaurus/pull/10551" target="_blank" rel="noopener noreferrer" class="">#10551</a>: 改进斯洛文尼亚语翻译。</li>
<li class="">:越南：<a href="https://github.com/facebook/docusaurus/pull/10507" target="_blank" rel="noopener noreferrer" class="">#10507</a>：改进越南主题翻译。</li>
<li class="">🇪🇸 <a href="https://github.com/facebook/docusaurus/pull/10413" target="_blank" rel="noopener noreferrer" class="">#10413</a>: 改进西班牙语主题的翻译。</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.6#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10586" target="_blank" rel="noopener noreferrer" class="">#10586</a>: 博客支持 <code>frontMatter.title_meta</code> 以基于SEO 的理由覆盖 <code>frontMatter.title</code> 。</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10600" target="_blank" rel="noopener noreferrer" class="">#10600</a>: <code>docusaurus build</code> and <code>docusaurus depl</code> 现在支持多个<code>--locale</code> CLI args.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10454" target="_blank" rel="noopener noreferrer" class="">#10454</a>: <code>docusaurus-mot-plugin-npm2yarn</code> 升级到 [<code>npmto-yarn</code> v3](<a href="https://github.com/nebrelbug/npm-to" target="_blank" rel="noopener noreferrer" class="">https://github.com/nebrelbug/npm-to</a> yarn/releases/tag/v3.0.0.0) 并可以转换 <code>npx</code> 命令。</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10612" target="_blank" rel="noopener noreferrer" class="">#10612</a>：Canary releases will used <code>3.5.2-canary-&lt;number&gt;</code> 而不是<code>0.0.0-canary-&lt;number&gt;</code> for respect plugins <code>peerDependency</code>。</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10547" target="_blank" rel="noopener noreferrer" class="">#10547</a>: <code>@docusaurus/tsconfig</code> 升级到 `target: 'es2022'</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10514" target="_blank" rel="noopener noreferrer" class="">#10514</a>：从Docusaurus init 模板中删除<code>babel.config.js</code>，以阻止定制Babel。</li>
</ul>
<p>查看 <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.6.0">3.6.0 changelog entry</a></strong> 以获取更详细的变更列表</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.5]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.5</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.5</guid>
            <pubDate>Fri, 09 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 3.5.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 3.5</strong>.</p>
<p>This release contains many <strong>new exciting blog features</strong>.</p>
<p>Upgrading should be easy. Our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a> respects <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-7b2ed059f27fc8b64f3f20025ebb382f.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="blog-social-icons">Blog Social Icons<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#blog-social-icons" class="hash-link" aria-label="链接到 Blog Social Icons" title="链接到 Blog Social Icons" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10222" target="_blank" rel="noopener noreferrer" class="">#10222</a>, we added the possibility to associate social links to blog authors, for inline authors declared in front matter or global through the <code>authors.yml</code> file.</p>
<div class="language-yml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">blog/authors.yml</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#22863A">slorber</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Sébastien Lorber</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#6B6B6B;font-style:italic"># other author properties...</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">socials</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sebastienlorber</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">linkedin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sebastienlorber</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">github</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> slorber</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">newsletter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//thisweekinreact.com</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Author socials screenshot displaying slorber author with 4 social platform icons" src="https://docusaurus.io/zh-CN/assets/images/author-socials-93483e664b2d095b137cf10c4769c100.png" width="780" height="180" class="img_vXGZ"></p>
<p>Icons and handle shortcuts are provided for pre-defined platforms <code>x</code>, <code>linkedin</code>, <code>github</code> and <code>stackoverflow</code>. It's possible to provide any additional platform entry (like <code>newsletter</code> in the example above) with a full URL.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="blog-authors-pages">Blog Authors Pages<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#blog-authors-pages" class="hash-link" aria-label="链接到 Blog Authors Pages" title="链接到 Blog Authors Pages" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10216" target="_blank" rel="noopener noreferrer" class="">#10216</a>, we added the possibility for <a class="" href="https://docusaurus.io/zh-CN/docs/blog#global-authors">global blog authors</a> (declared in <code>authors.yml</code>) to have their own dedicated page listing all the blog posts they contributed to.</p>
<p>This feature is opt-in and mostly relevant for <strong>multi-author blogs</strong>. You can turn it on for a specific author by setting the <code>page: true</code> property:</p>
<div class="language-yml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">blog/authors.yml</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#22863A">slorber</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Sébastien Lorber</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#6B6B6B;font-style:italic"># the description will be displayed on the author's page</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'A freelance React and React-Native developer...'</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">page</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#005CC5">true</span><span class="token plain"> </span><span class="token comment" style="color:#6B6B6B;font-style:italic"># Turns the feature on</span><br></div></code></pre></div></div>
<p>This creates a <a class="" href="https://docusaurus.io/zh-CN/blog/authors/slorber">dedicated author page</a> at <code>/blog/authors/slorber</code>.</p>
<p><img decoding="async" loading="lazy" alt="Author page screenshot for slorber global author" src="https://docusaurus.io/zh-CN/assets/images/author-page-4a9753641b116ddfeecc46ed1dcee907.png" width="883" height="900" class="img_vXGZ"></p>
<p>An <a class="" href="https://docusaurus.io/zh-CN/blog/authors">authors index page</a> is also created, listing all the blog authors.</p>
<p><img decoding="async" loading="lazy" alt="Author index page listing multiple authors" src="https://docusaurus.io/zh-CN/assets/images/author-index-4abd3b8b777b2c1b3958768559896262.png" width="705" height="645" class="img_vXGZ"></p>
<p>Check the <a class="" href="https://docusaurus.io/zh-CN/docs/blog#authors-pages">blog authors pages guide</a> for details.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="blog-feeds-styling">Blog Feeds Styling<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#blog-feeds-styling" class="hash-link" aria-label="链接到 Blog Feeds Styling" title="链接到 Blog Feeds Styling" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/9252" target="_blank" rel="noopener noreferrer" class="">#9252</a>, we added support for <a href="https://darekkay.com/blog/rss-styling/" target="_blank" rel="noopener noreferrer" class="">styling your blog feeds</a> by providing custom XSLT <code>.xls</code> files for the RSS and Atom feeds. This allows browsers to render the feeds in a more visually appealing way, like a regular HTML page, instead of the default XML view.</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">website/docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> blogOptions </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">feedOptions</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">xslt</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">rss</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'custom-rss.xsl'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">atom</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'custom-atom.xsl'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Writing your own XSLT can be complex, but you can also use <code>xslt: true</code> to turn on the built-in style:</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">website/docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> blogOptions </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">feedOptions</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">xslt</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Screenshot of the Docusaurus blog RSS feed, beautifully styled" src="https://docusaurus.io/zh-CN/assets/images/blog-feed-xslt-22194c2a971aba7f3bbf6115d3aa1d49.png" width="730" height="782" class="img_vXGZ"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="blog-sidebar-grouping">Blog Sidebar Grouping<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#blog-sidebar-grouping" class="hash-link" aria-label="链接到 Blog Sidebar Grouping" title="链接到 Blog Sidebar Grouping" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10252" target="_blank" rel="noopener noreferrer" class="">#10252</a>, we added support for grouping blog posts by years in the blog sidebar.</p>
<p><img decoding="async" loading="lazy" alt="Screenshot of the Docusaurus blog, in particular the sidebar items grouped by year" src="https://docusaurus.io/zh-CN/assets/images/blog-sidebar-years-1d0be02836d9a3307386c365b9969a37.png" width="910" height="452" class="img_vXGZ"></p>
<p>This feature is now turned on by default, but can be disabled with <code>themeConfig.blog.sidebar.groupByYear: false</code>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="blog-consistency-options">Blog Consistency Options<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#blog-consistency-options" class="hash-link" aria-label="链接到 Blog Consistency Options" title="链接到 Blog Consistency Options" translate="no">​</a></h3>
<p>We added new blog options to enforce recommended practices for your blog posts:</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="oninlineauthors"><code>onInlineAuthors</code><a href="https://docusaurus.io/zh-CN/blog/releases/3.5#oninlineauthors" class="hash-link" aria-label="链接到 oninlineauthors" title="链接到 oninlineauthors" translate="no">​</a></h4>
<p>We believe large multi-blogs are easier to manage by using <a class="" href="https://docusaurus.io/zh-CN/docs/blog#global-authors">global authors</a>, declared in <code>authors.yml</code>. This notably permits to avoids duplicating author information across multiple blog posts, and now permits to generate <a class="" href="https://docusaurus.io/zh-CN/docs/blog#authors-pages">author pages</a>.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10224" target="_blank" rel="noopener noreferrer" class="">#10224</a>, we added the <code>onInlineAuthors</code> option. Use <code>onInlineAuthors: 'throw'</code> to forbid <a class="" href="https://docusaurus.io/zh-CN/docs/blog#inline-authors">inline authors</a>, and enforce a consistent usage of <a class="" href="https://docusaurus.io/zh-CN/docs/blog#global-authors">global authors</a>.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="onuntruncatedblogposts"><code>onUntruncatedBlogPosts</code><a href="https://docusaurus.io/zh-CN/blog/releases/3.5#onuntruncatedblogposts" class="hash-link" aria-label="链接到 onuntruncatedblogposts" title="链接到 onuntruncatedblogposts" translate="no">​</a></h4>
<p>We believe blog posts are better using <a class="" href="https://docusaurus.io/zh-CN/docs/blog#blog-list">truncation markers</a> (<code>&lt;!-- truncate --&gt;</code> or <code>{/* truncate */}</code>). On paginated lists (blog home, tags pages, authors pages), this permits to render a more concise preview of the blog post instead of a full blog post.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10375" target="_blank" rel="noopener noreferrer" class="">#10375</a>, we added the <code>onUntruncatedBlogPosts</code> option. Use <code>onUntruncatedBlogPosts: 'throw'</code> to enforce a consistent usage of <a class="" href="https://docusaurus.io/zh-CN/docs/blog#blog-list">truncation markers</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h2>
<ul>
<li class="">🇪🇪 <a href="https://github.com/facebook/docusaurus/pull/10339" target="_blank" rel="noopener noreferrer" class="">#10339</a>: Add Estonian theme translations.</li>
<li class="">🇮🇩 <a href="https://github.com/facebook/docusaurus/pull/10325" target="_blank" rel="noopener noreferrer" class="">#10325</a>: Add Indonesian theme translations.</li>
<li class="">🇪🇸 <a href="https://github.com/facebook/docusaurus/pull/10360" target="_blank" rel="noopener noreferrer" class="">#10360</a>: Improve Spanish theme translations.</li>
<li class="">🇩🇪 <a href="https://github.com/facebook/docusaurus/pull/10235" target="_blank" rel="noopener noreferrer" class="">#10235</a>: Improve German theme translations.</li>
<li class="">🇨🇳 <a href="https://github.com/facebook/docusaurus/pull/10257" target="_blank" rel="noopener noreferrer" class="">#10257</a>: Improve Traditional Chinese (zh-Hant) theme translations.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.5#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10369" target="_blank" rel="noopener noreferrer" class="">#10369</a>: Add support for <a href="https://pkg.pr.new/" target="_blank" rel="noopener noreferrer" class="">pkg.pr.new</a> continuous releases so that you can test any pull-request code in a StackBlitz playground.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10376" target="_blank" rel="noopener noreferrer" class="">#10376</a>: Theme unlisted/draft banners are also shown in dev so that you don't forget to publish your content.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10335" target="_blank" rel="noopener noreferrer" class="">#10335</a>: The Markdown top-level headings <code># title</code> are automatically wrapped in <code>&lt;header&gt;</code> for consistency with front matter <code>title: Title</code>.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10286" target="_blank" rel="noopener noreferrer" class="">#10286</a>: Allows Docusaurus plugins to self-disable by returning <code>null</code>.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10241" target="_blank" rel="noopener noreferrer" class="">#10241</a>: Add support for <a href="https://mdxjs.com/packages/mdx/#processoroptions" target="_blank" rel="noopener noreferrer" class="">MDX processor <code>recmaPlugins</code> option</a> to modify the MDX Estree AST.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10324" target="_blank" rel="noopener noreferrer" class="">#10324</a>: The docs autogenerated <code>_category_.json</code> accepts a new <code>description</code> property that gets displayed on generated index pages.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10368" target="_blank" rel="noopener noreferrer" class="">#10368</a>: The CLI command <code>docusaurus --version</code> now actually returns the Docusaurus version.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10240" target="_blank" rel="noopener noreferrer" class="">#10240</a>: Markdown <code>mdx-code-block</code> now supports indentation.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10219" target="_blank" rel="noopener noreferrer" class="">#10219</a>: Fix <code>&lt;TabItem lazy&gt;</code> support the for <code>className</code> prop.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10313" target="_blank" rel="noopener noreferrer" class="">#10313</a>: Blog-related <code>@docusaurus/theme-common/internal</code> APIs have been moved to <code>@docusaurus/plugin-content-blog/client</code>.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10316" target="_blank" rel="noopener noreferrer" class="">#10316</a>: Docs-related <code>@docusaurus/theme-common/internal</code> APIs have been moved to <code>@docusaurus/plugin-content-docs/client</code>.</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.5.0">3.5.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.4]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.4</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.4</guid>
            <pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 3.4.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 3.4</strong>.</p>
<p>Upgrading should be easy. Our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a> respects <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-66116702bb73f0bf68a095ddaecc0fe4.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.4#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="tags-files">Tags files<a href="https://docusaurus.io/zh-CN/blog/releases/3.4#tags-files" class="hash-link" aria-label="链接到 Tags files" title="链接到 Tags files" translate="no">​</a></h3>
<p>The docs and blog plugins both already supported a <code>tags</code> front matter attribute, enabling you to group related content. But tags declared inline in the front matter are not always ideal.</p>
<p>With <a href="https://github.com/facebook/docusaurus/pull/10137" target="_blank" rel="noopener noreferrer" class="">#10137</a>, you can now declare a list of pre-defined tags in a <code>tags.yml</code> file:</p>
<div class="language-yml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">blog/tags.yml</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#22863A">tag1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">label</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Tag 1'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Tag 1 description'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">permalink</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /tag</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">permalink</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">tag2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">label</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Tag 2'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Tag 2 description'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">permalink</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /tag</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">permalink</span><br></div></code></pre></div></div>
<p>These predefined tags can be used in the front matter of your blog or docs files:</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">blog/2024-05-31-my-blog-post.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#22863A">tags</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> </span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">[</span><span class="token front-matter-block front-matter yaml language-yaml">tag1</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> tag2</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">]</span><span class="token front-matter-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34;font-weight:bold">#</span><span class="token title important" style="color:#0550AE;font-weight:bold"> Title</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Content</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Keeping tags usage consistent</div><div class="admonitionContent_Knsx"><p>Use the new <code>onInlineTags: 'throw'</code> plugin option to enforce the usage of predefined tags and prevent contributors from creating new unwanted tags.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="hash-router---experimental">Hash Router - Experimental<a href="https://docusaurus.io/zh-CN/blog/releases/3.4#hash-router---experimental" class="hash-link" aria-label="链接到 Hash Router - Experimental" title="链接到 Hash Router - Experimental" translate="no">​</a></h3>
<p>With <a href="https://github.com/facebook/docusaurus/pull/9859" target="_blank" rel="noopener noreferrer" class="">9859</a>, we added a new <strong>experimental</strong> hash router config option, useful for <strong>offline browsing</strong> by opening your site locally through the <code>file://</code> protocol.</p>
<div class="language-tsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-tsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    experimental_router</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'hash'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>警告</div><div class="admonitionContent_Knsx"><p>This mode is <strong>not recommended for sites deployed through a web server</strong>.</p></div></div>
<p>When this mode is turned on, Docusaurus will opt out of static site rendering, and build a client-side single page application where all routes are prefixed with <code>/#/</code>. A single <code>index.html</code> file is generated. This file can be opened locally in your browser by simply clicking it, using the browser <code>file://</code> protocol. This makes it possible to distribute a Docusaurus site as a <code>.zip</code> file so that readers can browse it offline, without having to install anything complex on their computer apart a web browser.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus hash router - local browsing using the file:// protocol" src="https://docusaurus.io/zh-CN/assets/images/hash-96c9ef1044dc1febfe3eefdc9350e2a0.png" width="1203" height="601" class="img_vXGZ"></p>
<p>Try browsing our own Docusaurus site built with the hash router:</p>
<ul>
<li class=""><a href="https://facebook.github.io/docusaurus/#/" target="_blank" rel="noopener noreferrer" class="">Docusaurus website - Hash Router web deployment</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/actions/workflows/build-hash-router.yml" target="_blank" rel="noopener noreferrer" class="">Docusaurus website - Hash Router downloadable GitHub artifacts</a></li>
</ul>
<div class="theme-admonition theme-admonition-caution admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>实验性功能</div><div class="admonitionContent_Knsx"><p>This feature is <strong>experimental</strong>. If you try it out, please let us know how it works for you <a href="https://github.com/facebook/docusaurus/issues/3825" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="site-storage---experimental">Site Storage - Experimental<a href="https://docusaurus.io/zh-CN/blog/releases/3.4#site-storage---experimental" class="hash-link" aria-label="链接到 Site Storage - Experimental" title="链接到 Site Storage - Experimental" translate="no">​</a></h3>
<p>Docusaurus uses the browser <code>localStorage</code> API to persist UI state.</p>
<p>But sometimes the storage space is "shared" between multiple sites using the same domain, leading to <strong>storage key conflicts</strong>. This generally happens in two cases</p>
<ul>
<li class="">when working on multiple <code>http://localhost:3000</code> sites</li>
<li class="">when hosting multiple sites under the same domain: <code>https://example.com/site1/</code> and <code>https://example.com/site2/</code></li>
</ul>
<p>For this reason, we introduced a new <strong>experimental</strong> <code>siteStorage</code> configuration option:</p>
<div class="language-tsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-tsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  future</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    experimental_storage</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      type</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'localStorage'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      namespace</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>When <code>namespace: true</code> is set, we apply a hash suffix to all the storage keys, making them unique to the current site (based on <code>config.url</code> and <code>config.baseUrl</code>. For example, the <code>theme</code> storage key becomes <code>theme-x6f</code>. It is also possible to provide your own custom suffix <code>namespace: 'suffix'</code>. We also made it possible to use <code>type: 'sessionStorage'</code> instead of the default <code>localStorage</code>.</p>
<div class="theme-admonition theme-admonition-caution admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>实验性功能</div><div class="admonitionContent_Knsx"><p>This feature is <strong>experimental</strong>. If you try it out, please let us know how it works for you <a href="https://github.com/facebook/docusaurus/pull/10121" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.4#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10151" target="_blank" rel="noopener noreferrer" class="">#10151</a>: add Turkmen (tk) theme translations</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10111" target="_blank" rel="noopener noreferrer" class="">#10111</a>: add Bulgarian (bg) theme translations</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10168" target="_blank" rel="noopener noreferrer" class="">#10168</a>: fix many long overdue Markdown link resolution bugs</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10178" target="_blank" rel="noopener noreferrer" class="">#10178</a>: the <code>/search</code> page now respects the <code>contextualSearch: false</code> setting</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10118" target="_blank" rel="noopener noreferrer" class="">#10118</a>: fix bad pluralization on docs generated index category card description</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10130" target="_blank" rel="noopener noreferrer" class="">#10130</a>: fix false positives reported by the broken anchor checker due to trailing slashes</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.4.0">3.4.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.3]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.3</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.3</guid>
            <pubDate>Fri, 03 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[我们很高兴地宣布 Docusaurus 3.3 现已发布。]]></description>
            <content:encoded><![CDATA[<p>我们很高兴地宣布 <strong>Docusaurus 3.3</strong> 现已发布。</p>
<p>Upgrading should be easy. Our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a> respects <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>. Minor versions do not include any breaking changes.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-105335e6b4ebb3f62aa9b5cf83ccddea.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.3#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="prepare-for-react-19">Prepare for React 19<a href="https://docusaurus.io/zh-CN/blog/releases/3.3#prepare-for-react-19" class="hash-link" aria-label="链接到 Prepare for React 19" title="链接到 Prepare for React 19" translate="no">​</a></h3>
<p>The React core team recently <a href="https://react.dev/blog/2024/04/25/react-19" target="_blank" rel="noopener noreferrer" class="">released the first <strong>React 19 beta</strong></a>. They also <a href="https://react.dev/blog/2024/04/25/react-19-upgrade-guide" target="_blank" rel="noopener noreferrer" class="">published an upgrade guide and a <strong>React v18.3 release</strong></a> with new warnings to help us identify issues <strong>before upgrading to React 19</strong>.</p>
<p>Docusaurus v3 depends on React <code>18.x</code>. When initializing a new Docusaurus sites, it will use that new React <code>18.3</code> release. It's also the case if you decide to upgrade your dependencies, or re-generate your package manager lockfile.</p>
<p>It turns out in its current state, <strong>Docusaurus had a few of those extra warnings to fix</strong>, notably this one immediately appearing on your dev console on any page load and navigation:</p>
<blockquote>
<p>Warning: LoadableComponent uses the legacy contextTypes API which is no longer supported and will be removed in the next major release. Use React.createContext() with static contextType instead.</p>
</blockquote>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10079" target="_blank" rel="noopener noreferrer" class="">#10079</a>, we got Docusaurus ready for React 19. We fixed all the React 18.3 warnings we encountered. In case we missed any, don't hesitate to <a href="https://github.com/facebook/docusaurus/issues/10099" target="_blank" rel="noopener noreferrer" class=""><strong>report new warnings</strong></a> if you see them, to us but also to other Docusaurus third-party plugin authors.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="createsitemapitems"><code>createSitemapItems</code><a href="https://docusaurus.io/zh-CN/blog/releases/3.3#createsitemapitems" class="hash-link" aria-label="链接到 createsitemapitems" title="链接到 createsitemapitems" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10083" target="_blank" rel="noopener noreferrer" class="">#10083</a>, we introduced a new flexible <code>createSitemapItems()</code> hook to the sitemap plugin. This enables users to create/filter/transform/enhance the sitemap items with their own custom logic.</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  presets</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#C6105F">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        sitemap</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token function-variable function" style="color:#8250DF">createSitemapItems</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            defaultCreateSitemapItems</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token operator" style="color:#D73A49">...</span><span class="token plain">params</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> items </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">await</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">defaultCreateSitemapItems</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">params</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> items</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">!</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'/tags/'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="pages-plugin-improvements">Pages plugin improvements<a href="https://docusaurus.io/zh-CN/blog/releases/3.3#pages-plugin-improvements" class="hash-link" aria-label="链接到 Pages plugin improvements" title="链接到 Pages plugin improvements" translate="no">​</a></h3>
<p>The Docusaurus <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-content-pages">pages plugin</a> has historically been lagging behind the docs and blog plugins in terms of available feature.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/10032" target="_blank" rel="noopener noreferrer" class="">#10032</a> we normalized the options available on each core content plugins by adding a few the missing page plugins APIs related to the edit url and the last update metadata displayed at the bottom on Markdown pages.</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">presets</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#C6105F">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#005CC5">pages</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#005CC5">editUrl</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#C6105F">'https://github.com/facebook/docusaurus/tree/main/website/src/pages'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#005CC5">editLocalizedFiles</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#005CC5">showLastUpdateAuthor</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#005CC5">showLastUpdateTime</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div style="padding:10px"><div class="browserWindow_my1Q" style="min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">/examples/markdownPageExample</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs" style="padding:0"><iframe src="/examples/markdownPageExample" title="/examples/markdownPageExample" style="display:block;width:100%;height:300px"></iframe></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Only for Markdown pages</div><div class="admonitionContent_Knsx"><p>These new plugin options only apply to Markdown pages, and have no effect on React pages for which you have full control over the layout with JSX.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.3#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10064" target="_blank" rel="noopener noreferrer" class="">#10064</a>: new site config option <code>siteConfig.markdown.anchors.maintainCase</code></li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9767" target="_blank" rel="noopener noreferrer" class="">#9767</a>: new <code>docusaurus deploy --target-dir</code> option</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10042" target="_blank" rel="noopener noreferrer" class="">#10042</a>: new (experimental) plugin API: <code>route.props</code></li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10060" target="_blank" rel="noopener noreferrer" class="">#10060</a>: optimizes the App entrypoint, avoid useless re-renders on navigations</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10080" target="_blank" rel="noopener noreferrer" class="">#10080</a>: <code>&lt;Admonition&gt;</code> component can render properly without heading/icon</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10091" target="_blank" rel="noopener noreferrer" class="">#10091</a>: <code>&lt;Tabs&gt;</code> props can now override defaults</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10090" target="_blank" rel="noopener noreferrer" class="">#10090</a>: <code>docusaurus serve</code> works better with a <code>/baseUrl/</code> pathname prefix</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10070" target="_blank" rel="noopener noreferrer" class="">#10070</a>: add missing theme translations for <code>pt-BR</code></li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/10025" target="_blank" rel="noopener noreferrer" class="">#10025</a>: doc sidebar item label now impacts the doc pagination label</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.3.0">3.3.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.2]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.2</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.2</guid>
            <pubDate>Fri, 29 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[我们很高兴地宣布 Docusaurus 3.2 现已发布。]]></description>
            <content:encoded><![CDATA[<p>我们很高兴地宣布 <strong>Docusaurus 3.2</strong> 现已发布。</p>
<p>The upgrade should be easy: as explained in our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process documentation</a>, minor versions respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-8ca15c1adaeb77ca302178575136a0b6.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.2#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="faster-builds">Faster builds<a href="https://docusaurus.io/zh-CN/blog/releases/3.2#faster-builds" class="hash-link" aria-label="链接到 Faster builds" title="链接到 Faster builds" translate="no">​</a></h3>
<p>We worked hard to reduce the time it takes to build a Docusaurus site in production mode.</p>
<p>Between v3.1.0 and v3.2.0, several changes have been made, leading to significantly faster production builds for many sites.</p>
<p>Let's take an example. Our benchmark on the <a href="https://github.com/facebook/react-native-website/pull/4072" target="_blank" rel="noopener noreferrer" class="">React Native website upgrading to v3.2</a> reports the following results:</p>
<ul>
<li class="">🔥 Cold builds: 95s ➡️ 66s (~30% faster)</li>
<li class="">🔥 Incremental builds: 55s ➡️ 22s (~60% faster)</li>
</ul>
<p>The results will vary depending on your site's topology and the options you turned on, but we expect the largest sites will see the most significant improvements.</p>
<p>Note that this is only the beginning, and Docusaurus performance can still be significantly improved, notably the bundling time and the memory consumption. Track our <a href="https://github.com/facebook/docusaurus/issues/4765" target="_blank" rel="noopener noreferrer" class="">performance issue</a> for upcoming improvements.</p>
<details class="details_Nokh alert alert--info details_Cn_P" data-collapsed="true"><summary>What is the difference between a cold build and an incremental build?</summary><div><div class="collapsibleContent_EoA1"><p>A cold build is when the Docusaurus caches are empty, generally after running <code>docusaurus clear</code>.</p><p>An incremental build happens when you run another time the <code>docusaurus build</code> command. Docusaurus automatically tries to "re-use" computations from former builds to make subsequent builds faster. In practice it's based on <a href="https://webpack.js.org/guides/build-performance/#persistent-cache" target="_blank" rel="noopener noreferrer" class="">Webpack persistent caching</a>. To enable incremental builds on your CI server, you can persist the <code>node_modules/.cache</code> folder across builds.</p></div></div></details>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="faster-dev-server">Faster Dev Server<a href="https://docusaurus.io/zh-CN/blog/releases/3.2#faster-dev-server" class="hash-link" aria-label="链接到 Faster Dev Server" title="链接到 Faster Dev Server" translate="no">​</a></h3>
<p>We also worked on improving the performance of the dev server, so that you can get a faster feedback when editing Markdown/MDX files.</p>
<p>The way we initially implemented content reloading wasn't great. For example, editing a blog post file would also trigger a useless reload of the unrelated docs plugin. From now on, when editing a plugin's content, only that plugin will reload. It's hard to measure precisely the impact of this change, but I estimate edits should appear in your browser at least 50% faster 🔥.</p>
<p>We plan to keep improving the speed of our dev server, with even more granular hot reloads, ensuring we don't run useless computations that would always keep giving the same result.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="mdx-partials-table-of-contents">MDX partials table-of-contents<a href="https://docusaurus.io/zh-CN/blog/releases/3.2#mdx-partials-table-of-contents" class="hash-link" aria-label="链接到 MDX partials table-of-contents" title="链接到 MDX partials table-of-contents" translate="no">​</a></h3>
<p>With <a href="https://github.com/facebook/docusaurus/pull/9684" target="_blank" rel="noopener noreferrer" class="">#9684</a>, Docusaurus is now able to render headings coming from an imported partial into the table-of-contents.</p>
<p>Docusaurus and MDX allows you to <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/react#importing-markdown">import one Markdown file into another</a>. We usually call the imported Markdown file a "partial", and use the <code>_</code> prefix so that this file does not lead to the creation of a new page.</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">myDoc.mdx</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34;font-weight:bold">#</span><span class="token title important" style="color:#0550AE;font-weight:bold"> My Doc</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34;font-weight:bold">##</span><span class="token title important" style="color:#0550AE;font-weight:bold"> Doc heading</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Content is imported from another MDX file:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">import ImportedDoc from './\_importedDoc.mdx';</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">ImportedDoc</span><span class="token tag" style="color:#22863A"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">_myPartial.mdx</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34;font-weight:bold">##</span><span class="token title important" style="color:#0550AE;font-weight:bold"> Partial heading</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Some paragraph</span><br></div></code></pre></div></div>
<p>Previously, the heading <code>Partial heading</code> did not appear in the table-of-contents, but now it will!</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="blog-improvements">Blog improvements<a href="https://docusaurus.io/zh-CN/blog/releases/3.2#blog-improvements" class="hash-link" aria-label="链接到 Blog improvements" title="链接到 Blog improvements" translate="no">​</a></h3>
<p>We improved the blog plugin with several new options to make it even more powerful and flexible:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9912" target="_blank" rel="noopener noreferrer" class="">#9912</a>: you can now display the last update time and author of a blog post, a feature the docs plugin already had.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9886" target="_blank" rel="noopener noreferrer" class="">#9886</a>: a new <code>processBlogPosts</code> option allow you to filter/transform/sort blog posts.</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9838" target="_blank" rel="noopener noreferrer" class="">#9838</a>: a new <code>pageBasePath</code> option allows you to customize the blog pagination URL segment (<code>/blog/page/2</code>)</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="sitemap-lastmod">Sitemap lastmod<a href="https://docusaurus.io/zh-CN/blog/releases/3.2#sitemap-lastmod" class="hash-link" aria-label="链接到 Sitemap lastmod" title="链接到 Sitemap lastmod" translate="no">​</a></h3>
<p>With <a href="https://github.com/facebook/docusaurus/pull/9954" target="_blank" rel="noopener noreferrer" class="">#9954</a>, the sitemap plugin has a new <code>lastmod</code> option that can now emit a <code>&lt;lastmod&gt;</code> tag on the XML. The value is read from the Git history by default, but can be overridden with docs and blog <code>last_update</code> front matter.</p>
<p>We also made it possible to opt-out of emitting <code>&lt;priority&gt;</code> and <code>&lt;frequency&gt;</code> tags, which are generally ignored by crawlers (notably <a href="https://developers.google.com/search/blog/2023/06/sitemaps-lastmod-ping" target="_blank" rel="noopener noreferrer" class="">Google</a>).</p>
<p>We recommend using the following sitemap plugin config, that will become the default in Docusaurus V4:</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">lastmod</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'date'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">priority</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#CF222E">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">changefreq</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#CF222E">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.2#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9687" target="_blank" rel="noopener noreferrer" class="">#9687</a>: new Vercel Analytics plugin</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9681" target="_blank" rel="noopener noreferrer" class="">#9681</a> and <a href="https://github.com/facebook/docusaurus/pull/9442" target="_blank" rel="noopener noreferrer" class="">#9442</a>: <code>docusaurus swizzle</code> and <code>create-docusaurus</code> CLIs now ask users if they prefer to use TypeScript</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9928" target="_blank" rel="noopener noreferrer" class="">#9928</a>: new Icelandic translation</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9931" target="_blank" rel="noopener noreferrer" class="">#9928</a>: new <code>allContentLoaded</code> plugin lifecycle (experimental)</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.2.0">3.2.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 3.1]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.1</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.1</guid>
            <pubDate>Fri, 05 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 3.1.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 3.1</strong>.</p>
<p>The upgrade should be easy: as explained in our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process documentation</a>, minor versions respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-e1b6e0c51be29d4ab2d4c966d220410c.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.1#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="broken-anchors-checker">Broken anchors checker<a href="https://docusaurus.io/zh-CN/blog/releases/3.1#broken-anchors-checker" class="hash-link" aria-label="链接到 Broken anchors checker" title="链接到 Broken anchors checker" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/9528" target="_blank" rel="noopener noreferrer" class="">#9528</a>, we improved the built-in broken links checker to also detect broken anchors.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/broken-anchor-4191e5dd94aef9e8c5e3524880670f0f.jpg" width="1920" height="896" class="img_vXGZ"></p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Make it fail fast</div><div class="admonitionContent_Knsx"><p>The new <a class="" href="https://docusaurus.io/zh-CN/docs/api/docusaurus-config#onBrokenAnchors"><code>onBrokenAnchors</code></a> option has value <code>warn</code> by default, for retro-compatibility reasons.</p><p>We recommend to turn it to <code>throw</code> and fail your CI builds instead of deploying broken anchors to productions.</p></div></div>
<div class="theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>备注</div><div class="admonitionContent_Knsx"><p>For users and plugin authors implementing custom <code>&lt;Heading&gt;</code> and <code>&lt;Link&gt;</code> components, we provide a new <a class="" href="https://docusaurus.io/zh-CN/docs/docusaurus-core#useBrokenLinks"><code>useBrokenLinks</code></a> React hook API.</p><p><strong>Most Docusaurus users don't need to care about it</strong>, built-in components (<code>docusaurus/Link</code> and <code>@theme/Heading</code>) already use it internally.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="parsefrontmatter-hook"><code>parseFrontMatter</code> hook<a href="https://docusaurus.io/zh-CN/blog/releases/3.1#parsefrontmatter-hook" class="hash-link" aria-label="链接到 parsefrontmatter-hook" title="链接到 parsefrontmatter-hook" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/9624" target="_blank" rel="noopener noreferrer" class="">#9624</a>, we added a new <a class="" href="https://docusaurus.io/zh-CN/docs/api/docusaurus-config#markdown"><code>siteConfig.markdown.parseFrontMatter</code> function hook</a>.</p>
<p>This makes it possible to implement convenient front matter transformations, shortcuts, or to integrate with external systems using front matter that Docusaurus plugins do not support.</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">markdown</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token function-variable function" style="color:#8250DF">parseFrontMatter</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter" style="color:#953800">params</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Reuse the default parser</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> result </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#CF222E">await</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#8250DF">defaultParseFrontMatter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">params</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Process front matter description placeholders</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">description</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">description</span><span class="token operator" style="color:#D73A49">?.</span><span class="token method function property-access" style="color:#8250DF">replaceAll</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'{{MY_VAR}}'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'MY_VALUE'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Create your own front matter shortcut</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#CF222E">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">i_do_not_want_docs_pagination</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pagination_prev</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#CF222E">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pagination_next</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#CF222E">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Rename an unsupported front matter coming from another system</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#CF222E">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">cms_seo_summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">description</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">cms_seo_summary</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#CF222E">delete</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">frontMatter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">cms_seo_summary</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#CF222E">return</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Read the <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features#front-matter">front matter guide</a> and the <a class="" href="https://docusaurus.io/zh-CN/docs/api/docusaurus-config#markdown"><code>parseFrontMatter</code> API ref</a> for details.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/3.1#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9674" target="_blank" rel="noopener noreferrer" class="">#9674</a>: add <code>siteConfig.markdown.remarkRehypeOptions</code> to pass options to <code>remark-rehype</code>, letting you customize things such as MDX footnote label</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9671" target="_blank" rel="noopener noreferrer" class="">#9671</a>: add code block MagicComments support for (Visual) Basic/Batch/Fortran/COBOL/ML</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9610" target="_blank" rel="noopener noreferrer" class="">#9610</a>: enable CLI port configuration via <code>PORT</code> environment variable</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9477" target="_blank" rel="noopener noreferrer" class="">#9477</a>: complete Brazilian Portuguese (pt-BR) translations</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/3.1.0">3.1.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Announcing Docusaurus 3.0]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/3.0</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/3.0</guid>
            <pubDate>Tue, 31 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are happy to announce Docusaurus 3.0! 🥳]]></description>
            <content:encoded><![CDATA[<p>Today, we are happy to <strong>announce Docusaurus 3.0</strong>! 🥳</p>
<p>At <a href="https://opensource.fb.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Meta Open Source</strong></a>, we believe Docusaurus will help you build the <strong>best documentation websites</strong> with <strong>minimal effort</strong>, letting you <strong>focus on what really matters</strong>: writing the content.</p>
<p>This is a new <strong>major version</strong> of Docusaurus, coming with <strong>new exciting features</strong> and upgraded dependencies.</p>
<p>In line with the <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class=""><strong>Semantic Versioning</strong></a> principles, this release includes <strong>breaking changes</strong> we documented thoroughly in the <a class="" href="https://docusaurus.io/zh-CN/docs/migration/v3"><strong>v3 upgrade guide</strong></a>. Breaking changes can be bothersome, but they are necessary to set the ground for a <strong>new wave of Docusaurus features</strong> we plan to implement.</p>
<p><img decoding="async" loading="lazy" alt="v3.0 social-card image" src="https://docusaurus.io/zh-CN/assets/images/social-card-75819f68ecbb579fe176843bb2e3df82.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<p>We initially planned to release more frequent major versions, but Docusaurus v3 has taken longer than expected. Among the breaking changes that we accrued, <strong>upgrading to MDX v3</strong> is probably the main challenge to the adoption of this new version. We went the extra mile to make this upgrade as easy as possible, notably by adding <a class="" href="https://docusaurus.io/zh-CN/docs/api/docusaurus-config#markdown">compatibility options for MDX v1</a>.</p>
<p>The simplest sites will only need to upgrade a few npm dependencies. For more complex sites, we came up with a few strategies that can help you upgrade more confidently:</p>
<ul>
<li class=""><a class="" href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3">Prepare your site</a> ahead of time, incrementally, while staying on Docusaurus v2</li>
<li class=""><a class="" href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing">Set up visual regression tests</a> to catch unexpected visual changes happening during the upgrade</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>About Docusaurus v2</div><div class="admonitionContent_Knsx"><p>According to our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a>, Docusaurus v2 has now entered <strong>maintenance mode</strong>. It will only receive support for major security issues for 3 months, until 31 January 2024. It is recommended to upgrade within that time frame to v3.</p></div></div>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="breaking-changes">Breaking changes<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#breaking-changes" class="hash-link" aria-label="链接到 Breaking changes" title="链接到 Breaking changes" translate="no">​</a></h2>
<p>This section only gives you a quick glance. All the breaking changes are thoroughly documented in the <a class="" href="https://docusaurus.io/zh-CN/docs/migration/v3"><strong>v3 upgrade guide</strong></a>.</p>
<p>Docusaurus v3 upgraded a few dependencies to new major versions, each coming with its own breaking changes:</p>
<ul>
<li class="">Node.js v16 ➡️ v18</li>
<li class="">React v17 ➡️ v18</li>
<li class="">MDX v1 ➡️ v3</li>
<li class="">TypeScript v4 ➡️ v5</li>
<li class="">prism-react-renderer v1 ➡️ v2</li>
<li class="">react-live v2 ➡️ v4</li>
<li class="">Mermaid v9 ➡️ v10</li>
<li class="">import-fresh v3 ➡️ jiti v1</li>
<li class="">remark-emoji v2 ➡️ v4</li>
</ul>
<p>A typical <code>package.json</code> dependency upgrade looks like:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">package.json</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "dependencies": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    // upgrade to Docusaurus v3</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@docusaurus/core": "2.4.3",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@docusaurus/preset-classic": "2.4.3",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/core": "3.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/preset-classic": "3.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    // upgrade to MDX v3</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@mdx-js/react": "^1.6.22",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@mdx-js/react": "^3.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    // upgrade to prism-react-renderer v2.0+</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "prism-react-renderer": "^1.3.5",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "prism-react-renderer": "^2.1.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    // upgrade to React v18.0+</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "react": "^17.0.2",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "react-dom": "^17.0.2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "react": "^18.2.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "react-dom": "^18.2.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  },</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "devDependencies": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    // upgrade Docusaurus dev dependencies to v3</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@docusaurus/module-type-aliases": "2.4.3",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@docusaurus/types": "2.4.3"</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/module-type-aliases": "3.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/types": "3.0.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "engines": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    // require Node.js 18.0+</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "node": "&gt;=16.14"</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "node": "&gt;=18.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">}</span><br></div></code></pre></div></div>
<p>Apart from MDX v3, most breaking changes coming with those upgraded dependencies have been handled internally for you: most of the time, you shouldn't have to do anything. Outside of dependencies, the only functional breaking changes coming explicitly from the Docusaurus codebase are:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9189" target="_blank" rel="noopener noreferrer" class="">#9189</a>: new default blog RSS feed limit of 20 entries</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9308" target="_blank" rel="noopener noreferrer" class="">#9308</a>: fix and re-introduce the <code>:::warning</code> admonition, deprecate <code>:::caution</code></li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9310" target="_blank" rel="noopener noreferrer" class="">#9310</a>: remove the legacy versioned sidebar id prefix, used for sites versioned before <code>v2.0.0-beta.10</code> (December 2021)</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/7966" target="_blank" rel="noopener noreferrer" class="">#7966</a>: refactor docs theme components, eventually requiring to you re-swizzle them</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<p>Below is a non-exhaustive list of new useful features coming with this new version. All the features are listed in the <a href="https://github.com/facebook/docusaurus/releases/tag/v3.0.0" target="_blank" rel="noopener noreferrer" class=""><strong>Docusaurus v3.0.0 release notes</strong></a>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="markdown">Markdown<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#markdown" class="hash-link" aria-label="链接到 Markdown" title="链接到 Markdown" translate="no">​</a></h3>
<p>Docusaurus v3 upgraded from MDX v1 to MDX v3:</p>
<ul>
<li class="">in <a href="https://github.com/facebook/docusaurus/pull/8288" target="_blank" rel="noopener noreferrer" class="">#8288</a>, we upgraded to <a href="https://mdxjs.com/blog/v2/" target="_blank" rel="noopener noreferrer" class=""><strong>MDX v2</strong></a> (<a href="https://mdxjs.com/migrating/v2/" target="_blank" rel="noopener noreferrer" class="">migration guide</a>)</li>
<li class="">in <a href="https://github.com/facebook/docusaurus/pull/9451" target="_blank" rel="noopener noreferrer" class="">#9451</a>, we upgraded to <a href="https://mdxjs.com/blog/v3/" target="_blank" rel="noopener noreferrer" class=""><strong>MDX v3</strong></a> (<a href="https://mdxjs.com/migrating/v3/" target="_blank" rel="noopener noreferrer" class="">migration guide</a>)</li>
</ul>
<p>This new MDX version is <strong>much better for content writers and plugin authors</strong>, and lays the ground for implementing new exciting Markdown features.</p>
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>MDX v3 - the main challenge</div><div class="admonitionContent_Knsx"><p>The transition from MDX v1 to MDX v3 is the <strong>main challenge</strong> to the adoption of Docusaurus v3.</p><p>Some documents that compiled successfully under Docusaurus v2 might now <strong>fail to compile</strong> under Docusaurus v3, while others might <strong>render differently</strong>.</p><p>Most breaking changes come from <a href="https://mdxjs.com/blog/v2/" target="_blank" rel="noopener noreferrer" class="">MDX v2</a>, and <a href="https://mdxjs.com/blog/v3/" target="_blank" rel="noopener noreferrer" class="">MDX v3</a> is a relatively small release. The <a href="https://mdxjs.com/migrating/v2/" target="_blank" rel="noopener noreferrer" class="">MDX v2 migration guide</a> has a section on how to <a href="https://mdxjs.com/migrating/v2/#update-mdx-files" target="_blank" rel="noopener noreferrer" class="">update MDX files</a> that will be particularly relevant to us. Also make sure to read the <a href="https://mdxjs.com/docs/troubleshooting-mdx/" target="_blank" rel="noopener noreferrer" class="">Troubleshooting MDX</a> page that can help you interpret common MDX error messages.</p><p><strong>Don't be intimidated</strong>. Most problems are <strong>easy to fix</strong> and often related to <code>{</code> and <code>&lt;</code> characters that you now need to escape. However, depending on the size of your site, you might need to edit many files and feel overwhelmed. For this reason, we provide a command <a href="https://github.com/slorber/docusaurus-mdx-checker" target="_blank" rel="noopener noreferrer" class=""><code>npx docusaurus-mdx-checker</code></a> to help you get an estimate of the work to be done, and we recommend to <a class="" href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3">prepare your site in advance</a>.</p><p>If you created custom <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/plugins">MDX plugins</a> (Remark/Rehype), the AST is slightly different, and you might need to refactor them.</p></div></div>
<p>This notably enables us to add a <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features#mdx-vs-commonmark">CommonMark mode</a> that should make it easier for existing documentations to adopt Docusaurus. It is currently opt-in and <strong>experimental</strong> and limited (<a href="https://github.com/facebook/docusaurus/issues/9092" target="_blank" rel="noopener noreferrer" class="">some Docusaurus features will not work</a>). In Docusaurus v3, all files are still interpreted as MDX, but we plan to interpret <code>.md</code> files as CommonMark in an upcoming major version, and recommend to use the <code>.mdx</code> extension for any file using JSX or ES modules.</p>
<p>We also introduced a new way to <a class="" href="https://docusaurus.io/zh-CN/docs/api/docusaurus-config#markdown">configure Markdown globally for your site</a>, and plan to add more flexible options later.</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">markdown</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">format</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'mdx'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">mermaid</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function-variable function" style="color:#8250DF">preprocessor</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter" style="color:#953800">filePath</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter" style="color:#953800"> fileContent</span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#CF222E">return</span><span class="token plain"> fileContent</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#8250DF">replaceAll</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'{{MY_VAR}}'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'MY_VALUE'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">mdx1Compat</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">comments</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">admonitions</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">headingIds</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Docusaurus now uses the <a href="https://github.com/remarkjs/remark-directive" target="_blank" rel="noopener noreferrer" class="">remark-directive</a> plugin to support admonitions. This also offers you the ability to create your own Remark plugins to extend Markdown with your own <a href="https://talk.commonmark.org/t/generic-directives-plugins-syntax/444" target="_blank" rel="noopener noreferrer" class="">custom directives</a> such as <code>:textDirective</code>, <code>::leafDirective</code> or <code>:::containerDirective</code>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="esm-ts-configs">ESM and TypeScript configs<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#esm-ts-configs" class="hash-link" aria-label="链接到 ESM and TypeScript configs" title="链接到 ESM and TypeScript configs" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/9317" target="_blank" rel="noopener noreferrer" class="">#9317</a>, we added support for ES Modules and TypeScript config files, including site config, docs sidebars, plugins and presets.</p>
<p>Here are 2 TypeScript examples, giving you a modern experience with IDE autocompletion:</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Config</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@docusaurus/types'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">type</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">*</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">as</span><span class="token plain"> Preset </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> Config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  title</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'My Site'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  favicon</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'img/favicon.ico'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// your site config ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  presets</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#C6105F">'classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// your preset config ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> satisfies Preset</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Options</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  themeConfig</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// your theme config ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> satisfies Preset</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ThemeConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">sidebars.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">SidebarsConfig</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@docusaurus/plugin-content-docs'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> sidebars</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> SidebarsConfig </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  docs</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#C6105F">'introduction'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> sidebars</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="unlisted-content">Unlisted content<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#unlisted-content" class="hash-link" aria-label="链接到 Unlisted content" title="链接到 Unlisted content" translate="no">​</a></h3>
<p>Docusaurus already supported a <code>draft: true</code> front matter option in our 3 content plugins (docs, blog, pages), which allows you to remove some pages from your production builds.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8004" target="_blank" rel="noopener noreferrer" class="">#8004</a>, we introduced a new <code>unlisted: true</code> front matter option, which will keep your pages available in production builds, while "hiding" them and making them impossible to discover unless you have the url. This enables convenient workflows where you can easily ask for feedback on a piece of content before the final publication.</p>
<p>Unlisted content will:</p>
<ul>
<li class="">be excluded from <code>sitemap.xml</code></li>
<li class="">be excluded from SEO results thanks to <code>&lt;meta name="robots" content="noindex, nofollow" /&gt;</code></li>
<li class="">be excluded from blog RSS feeds</li>
<li class="">be excluded from Algolia DocSearch results</li>
<li class="">be filtered from site navbar items, docs sidebars, blog sidebar, blog archives, tags pages...</li>
</ul>
<p>Unlisted content will also display a banner so that you don't forget to turn it off once your content is ready for prime time. Here's an example of an <a class="" href="https://docusaurus.io/zh-CN/tests/blog/unlisted-post">unlisted blog post</a>:</p>
<div style="padding:10px"><div class="browserWindow_my1Q" style="min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">/tests/blog/unlisted-post</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs" style="padding:0"><iframe src="/tests/blog/unlisted-post" title="/tests/blog/unlisted-post" style="display:block;width:100%;height:300px"></iframe></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="react-18">React 18<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#react-18" class="hash-link" aria-label="链接到 React 18" title="链接到 React 18" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8961" target="_blank" rel="noopener noreferrer" class="">#8961</a>, we upgraded to React 18. This is important, notably for the <a href="https://react.dev/blog/2022/03/29/react-v18#gradually-adopting-concurrent-features" target="_blank" rel="noopener noreferrer" class="">gradual adoption of Concurrent React features</a>, as well as upcoming exciting features such as <a href="https://github.com/facebook/docusaurus/issues/9089" target="_blank" rel="noopener noreferrer" class="">build-time React Server Components</a>.</p>
<p>This new version of React should be a drop-in replacement for most Docusaurus sites. It comes with breaking changes that we handled internally in the Docusaurus codebase. If your site is using a lot of custom React code, we recommend you to take a look at the official article on <a href="https://react.dev/blog/2022/03/08/react-18-upgrade-guide" target="_blank" rel="noopener noreferrer" class="">How to Upgrade to React 18</a>, notably the new <a href="https://react.dev/blog/2022/03/08/react-18-upgrade-guide#automatic-batching" target="_blank" rel="noopener noreferrer" class="">automatic batching</a> behavior.</p>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Experimental support for React 18 features</div><div class="admonitionContent_Knsx"><p>React 18 comes with new features:</p><ul>
<li class=""><code>&lt;Suspense&gt;</code></li>
<li class=""><code>React.lazy()</code></li>
<li class=""><code>startTransition()</code></li>
</ul><p>Their Docusaurus support is considered as <strong>experimental</strong>. We might have to adjust the integration in the future, leading to a different runtime behavior.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="automatic-jsx-runtime">Automatic JSX runtime<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#automatic-jsx-runtime" class="hash-link" aria-label="链接到 Automatic JSX runtime" title="链接到 Automatic JSX runtime" translate="no">​</a></h3>
<p>Docusaurus now uses the <a href="https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html" target="_blank" rel="noopener noreferrer" class="">"automatic" JSX runtime</a>.</p>
<p>It is not needed anymore to import React in JSX files that do not use any React API.</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">src/components/MyComponent.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49"> import React from 'react';</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> export default function MyComponent() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">   return &lt;div&gt;Hello&lt;/div&gt;;</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="debug-builds">Debug builds<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#debug-builds" class="hash-link" aria-label="链接到 Debug builds" title="链接到 Debug builds" translate="no">​</a></h3>
<p>It is now possible to build your static site in dev mode.</p>
<div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">docusaurus build </span><span class="token parameter variable" style="color:#E36209">--dev</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Debug React-related problems</div><div class="admonitionContent_Knsx"><p>Docusaurus will log more errors to the console, notably React 18 hydration errors through the new <a href="https://react.dev/reference/react-dom/client/hydrateRoot#parameters" target="_blank" rel="noopener noreferrer" class=""><code>onRecoverableError</code> callback</a>.</p><p>This new build mode is particularly helpful for <strong>troubleshooting React problems</strong>. Docusaurus will use the development build of React, thus producing detailed and readable error messages instead of minified ones linking to the <a href="https://reactjs.org/docs/error-decoder.html/" target="_blank" rel="noopener noreferrer" class="">React Error Decoder page</a>.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="typescript">TypeScript<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#typescript" class="hash-link" aria-label="链接到 TypeScript" title="链接到 TypeScript" translate="no">​</a></h3>
<p>Docusaurus v3 now requires a minimum version of TypeScript 5.0.</p>
<p>We re-internalized the base recommended TypeScript config to a new official package:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">tsconfig.json</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">  "extends": "@tsconfig/docusaurus/tsconfig.json",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">  "extends": "@docusaurus/tsconfig",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "compilerOptions": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    "baseUrl": "."</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">}</span><br></div></code></pre></div></div>
<p>We also have cleaner, normalized exports for Docusaurus core type, plugin, and preset options, which you can use within the brand-new <a href="https://docusaurus.io/zh-CN/blog/releases/3.0#esm-ts-configs" class="">TypeScript config files</a>:</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Config</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@docusaurus/types'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Options</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ThemeConfig</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">SidebarsConfig</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@docusaurus/plugin-content-docs'</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="code-blocks">代码块<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#code-blocks" class="hash-link" aria-label="链接到 代码块" title="链接到 代码块" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/9316" target="_blank" rel="noopener noreferrer" class="">#9316</a>, we improved on syntax highlighting thanks to the <a href="https://github.com/FormidableLabs/prism-react-renderer" target="_blank" rel="noopener noreferrer" class="">prism-react-renderer</a> v2 upgrade. For example, a bash param <code>--save</code> is now colored:</p>
<div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">npm</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#E36209">--save</span><span class="token plain"> some-package</span><br></div></code></pre></div></div>
<p>The <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/code-blocks#interactive-code-editor">interactive code editor</a> also upgrades to <a href="https://github.com/FormidableLabs/react-live" target="_blank" rel="noopener noreferrer" class="">react-live</a> v4, coming with a new <a href="https://github.com/alangpierce/sucrase" target="_blank" rel="noopener noreferrer" class="">sucrase</a> compiler. It is faster, lighter, and supports modern features, notably TypeScript type annotations.</p>
<div class="playgroundContainer_TDLX"><div class="playgroundHeader_h_Hu"><div class="playgroundHeaderContent_epzO">实时编辑器</div><div class="playgroundHeaderButtons_RTSm"><button type="button" aria-label="Reset code to original" title="Reset" class="clean-btn resetButton_gKmz"><svg class="resetButtonIcon_B9AZ" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"></path><path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z"></path></svg>重置</button></div></div><div class="playgroundEditor_uqZ4"><pre class="prism-code language-tsx" style="margin:0;outline:none;padding:10px;font-family:inherit;color:#393A34;background-color:#f6f8fa" spellcheck="false"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">Hello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span>
</span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> name</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'World'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Hello </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span>
</span></pre></div><div class="playgroundHeader_h_Hu"><div class="playgroundHeaderContent_epzO">结果</div></div><div class="playgroundPreview_u2xE"><div>Loading...</div></div></div>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8982" target="_blank" rel="noopener noreferrer" class="">#8982</a> and <a href="https://github.com/facebook/docusaurus/pull/8870" target="_blank" rel="noopener noreferrer" class="">#8870</a>, we also added <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/code-blocks#custom-magic-comments">magic comments</a> support for TeX-like, Haskell-like, and WebAssembly comment syntax.</p>
<div class="language-haskell codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">haskell.hs</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-haskell codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token hvariable">stringLength</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">::</span><span class="token plain"> </span><span class="token constant" style="color:#005CC5">String</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">-&gt;</span><span class="token plain"> </span><span class="token constant" style="color:#005CC5">Int</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token hvariable">stringLength</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hvariable">stringLength</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token hvariable">x</span><span class="token operator" style="color:#D73A49">:</span><span class="token hvariable">xs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">1</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">+</span><span class="token plain"> </span><span class="token hvariable">stringLength</span><span class="token plain"> </span><span class="token hvariable">xs</span><br></div></code></pre></div></div>
<div class="language-matlab codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">matlab.m</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-matlab codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> result </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">times2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">n</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  result </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> n </span><span class="token operator" style="color:#D73A49">*</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">x </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">10</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">y </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">times2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="mermaid-diagrams">Mermaid diagrams<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#mermaid-diagrams" class="hash-link" aria-label="链接到 Mermaid diagrams" title="链接到 Mermaid diagrams" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/9305" target="_blank" rel="noopener noreferrer" class="">#9305</a>, we upgraded to Mermaid v10.4 and added support for async diagram rendering. Docusaurus is now able to render new types of diagrams.</p>
<details class="details_Nokh alert alert--info details_Cn_P" data-collapsed="true"><summary>Mindmap</summary><div><div class="collapsibleContent_EoA1"></div></div></details>
<details class="details_Nokh alert alert--info details_Cn_P" data-collapsed="true"><summary>Quadrant chart</summary><div><div class="collapsibleContent_EoA1"></div></div></details>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="query-string-data-attributes">Query-string data attributes<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#query-string-data-attributes" class="hash-link" aria-label="链接到 Query-string data attributes" title="链接到 Query-string data attributes" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/9028" target="_blank" rel="noopener noreferrer" class="">#9028</a>, we made it possible to set custom HTML <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*" target="_blank" rel="noopener noreferrer" class="">data attributes</a> though <code>docusaurus-data-x</code> query-string parameters. This makes it easier to embed a Docusaurus iframe on another site, and lets you customize the appearance of the embedded version with CSS.</p>
<div class="language-css codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">/src/css/custom.css</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-css codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token selector" style="color:#6F42C1">html</span><span class="token selector attribute punctuation" style="color:#393A34">[</span><span class="token selector attribute attr-name" style="color:#0550AE">data-navbar</span><span class="token selector attribute operator" style="color:#D73A49">=</span><span class="token selector attribute attr-value" style="color:#C6105F">'false'</span><span class="token selector attribute punctuation" style="color:#393A34">]</span><span class="token selector" style="color:#6F42C1"> </span><span class="token selector class" style="color:#6F42C1">.navbar</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#005CC5">display</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> none</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector" style="color:#6F42C1">html</span><span class="token selector attribute punctuation" style="color:#393A34">[</span><span class="token selector attribute attr-name" style="color:#0550AE">data-red-border</span><span class="token selector attribute punctuation" style="color:#393A34">]</span><span class="token selector" style="color:#6F42C1"> div</span><span class="token selector id" style="color:#6F42C1">#__docusaurus</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#005CC5">border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token color" style="color:#005CC5">red</span><span class="token plain"> solid thick</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div style="padding:10px"><div class="browserWindow_my1Q" style="min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">/docs/?docusaurus-data-navbar=false&amp;docusaurus-data-red-border</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs" style="padding:0"><iframe src="/docs/?docusaurus-data-navbar=false&amp;docusaurus-data-red-border" title="/docs/?docusaurus-data-navbar=false&amp;docusaurus-data-red-border" style="display:block;width:100%;height:300px"></iframe></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-features">Other features<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#other-features" class="hash-link" aria-label="链接到 Other features" title="链接到 Other features" translate="no">​</a></h3>
<p>Other new features worth mentioning:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9189" target="_blank" rel="noopener noreferrer" class="">#9189</a>: new blog <code>feedOptions.limit</code> option</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9071" target="_blank" rel="noopener noreferrer" class="">#9071</a>: add normalized SEO front matter support for the pages plugin</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9028" target="_blank" rel="noopener noreferrer" class="">#9171</a>: the client-redirects plugin now supports fully qualified urls and query-string/hash in destination url</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/9171" target="_blank" rel="noopener noreferrer" class="">#9171</a>: new ESLint rule <a class="" href="https://docusaurus.io/zh-CN/docs/api/misc/@docusaurus/eslint-plugin/no-html-links"><code>no-html-links</code></a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8384" target="_blank" rel="noopener noreferrer" class="">#8384</a>: new ESLint rule <a class="" href="https://docusaurus.io/zh-CN/docs/api/misc/@docusaurus/eslint-plugin/prefer-docusaurus-heading"><code>prefer-docusaurus-heading</code></a></li>
</ul>
<p>Read <a href="https://github.com/facebook/docusaurus/releases/tag/v3.0.0" target="_blank" rel="noopener noreferrer" class=""><strong>Docusaurus v3.0.0 release notes</strong></a> for an exhaustive list of changes.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="conclusion">结语<a href="https://docusaurus.io/zh-CN/blog/releases/3.0#conclusion" class="hash-link" aria-label="链接到 结语" title="链接到 结语" translate="no">​</a></h2>
<p>This release comes with a few features, but more importantly <strong>upgrades many pieces of the Docusaurus infrastructure</strong>.</p>
<p>The <strong>MDX upgrade</strong> consumed a lot of our time this year, and we worked hard to make this important upgrade less difficult for all of you.</p>
<p>Now that we've caught up with our infrastructure, we'll be back <strong>delivering useful documentation features</strong> very soon, in upcoming minor versions.</p>
<p>We would like to thank you for using Docusaurus over the years. The documentation framework space is becoming more competitive lately, and we will do our best to ensure that Docusaurus remains a <strong>competitive solution</strong> that stands out for its great <strong>flexibility</strong>.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Preparing your site for Docusaurus v3]]></title>
            <link>https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3</link>
            <guid>https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3</guid>
            <pubDate>Fri, 29 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[这篇博文是在 Docusaurus v3 还处于测试时写的。 在升级到 Docusaurus v3 当前稳定版本时，请留意依赖项版本的变更以及相应的升级步骤。 请使用升级指南了解最新的迁移步骤。]]></description>
            <content:encoded><![CDATA[<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>警告</div><div class="admonitionContent_Knsx"><p>这篇博文是在 Docusaurus v3 还处于测试时写的。 在升级到 Docusaurus v3 当前稳定版本时，请留意依赖项版本的变更以及相应的升级步骤。 请使用<a href="https://docusaurus.io/docs/next/migration/v3" target="_blank" rel="noopener noreferrer" class="">升级指南</a>了解最新的迁移步骤。</p></div></div>
<p><strong>Docusaurus v3</strong> is now <a href="https://github.com/facebook/docusaurus/discussions/9312" target="_blank" rel="noopener noreferrer" class=""><strong>in beta</strong></a> and the official release is around the corner. This is the perfect time to start <strong>preparing your site</strong> for this new major version.</p>
<p>Docusaurus v3 comes with a few <strong>breaking changes</strong>, many of which can be <strong>handled today under Docusaurus v2</strong>. Preparing your site ahead of time can be done incrementally, and will make it easier to upgrade to v3.</p>
<p>主要的突破变化是从 MDX v1 升级到 MDX v3 。 请阅读 <a href="https://mdxjs.com/blog/v2/" target="_blank" rel="noopener noreferrer" class=""><strong>MDX v2</strong></a> 和 <a href="https://mdxjs.com/blog/v3/" target="_blank" rel="noopener noreferrer" class=""><strong>MDX v3</strong></a> 的版本说明获取更详细的信息。 MDX will now compile your Markdown content <strong>more strictly</strong> and with <strong>subtle differences</strong>.</p>
<p>This article will mostly focus on how to prepare your content for this new MDX version, and will also list a few other breaking changes that you can handle today.</p>
<p><img decoding="async" loading="lazy" alt="Preparing your site for Docusaurus v3 - social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-1c688c53b51bdaa6e15ae532bf756276.png" width="1040" height="546" class="img_vXGZ"></p>
<!-- -->
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>警告</div><div class="admonitionContent_Knsx"><p>This article mentions most Docusaurus v3 breaking changes, but is not exhaustive. Read the <a href="https://github.com/facebook/docusaurus/discussions/9312" target="_blank" rel="noopener noreferrer" class="">v3.0.0-beta.0 release notes</a> for an exhaustive list.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Don't be afraid</div><div class="admonitionContent_Knsx"><p>There's a lot of content in this blog post, but many Docusaurus v2 sites can upgrade with very few changes.</p><p>If your site is relatively small, with only a few customizations, you can probably <a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#try-docusaurus-v3-today" class="">upgrade to Docusaurus v3</a> immediately.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="preparatory-work">Preparatory work<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#preparatory-work" class="hash-link" aria-label="链接到 Preparatory work" title="链接到 Preparatory work" translate="no">​</a></h2>
<p>Before preparing for the Docusaurus v3 upgrade, we recommend upgrading to the latest <a class="" href="https://docusaurus.io/zh-CN/versions">Docusaurus v2 version</a>.</p>
<p>Depending on the complexity of your site, it may be a good idea to adopt the <a class="" href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing">visual regression testing workflow</a> that we recently presented. It could help you catch unexpected visual side effects occurring during the Docusaurus v3 upgrade.</p>
<p>We also recommend using the <code>.mdx</code> extension whenever you use JSX, <code>import</code>, or <code>export</code> (i.e. MDX features) inside a Markdown file. It is semantically more correct and improves compatibility with external tools (IDEs, formatters, linters, etc.). In future versions of Docusaurus, <code>.md</code> files will be parsed as standard <a href="https://commonmark.org/" target="_blank" rel="noopener noreferrer" class="">CommonMark</a>, which does not support these features. In Docusaurus v3, <code>.md</code> files keep being compiled as MDX files, but it will be possible to <a href="https://github.com/facebook/docusaurus/issues/3018" target="_blank" rel="noopener noreferrer" class="">opt-in for CommonMark</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="preparing-content-for-mdx-v3">为MDX v3做准备<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#preparing-content-for-mdx-v3" class="hash-link" aria-label="链接到 为MDX v3做准备" title="链接到 为MDX v3做准备" translate="no">​</a></h2>
<p>MDX is a major dependency of Docusaurus responsible for compiling your <code>.md</code> and <code>.mdx</code> files to React components.</p>
<p>MDX v3更加强大，但也带来了一些变化，可能需要您对内容进行一些重构。 MDX v3更加严格，一些在v1下编译良好的组件现在可能在v3下无法编译，最有可能的原因是<code>{</code>和<code>&lt;</code>字符。</p>
<p>Upgrading MDX comes with all the breaking changes documented on the <a href="https://mdxjs.com/blog/v2/" target="_blank" rel="noopener noreferrer" class="">MDX v2</a> and <a href="https://mdxjs.com/blog/v3/" target="_blank" rel="noopener noreferrer" class="">MDX v3</a> release blog posts. 大多数重大变更来自MDX v2。 The <a href="https://mdxjs.com/migrating/v2/" target="_blank" rel="noopener noreferrer" class="">MDX v2 migration guide</a> has a section on how to <a href="https://mdxjs.com/migrating/v2/#update-mdx-files" target="_blank" rel="noopener noreferrer" class="">update MDX files</a> that will be particularly relevant to us. Also make sure to read the <a href="https://mdxjs.com/docs/troubleshooting-mdx/" target="_blank" rel="noopener noreferrer" class="">Troubleshooting MDX</a> page that can help you interpret common MDX error messages.</p>
<p>还请确保阅读我们更新的 <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/react"><strong>MDX 和 React</strong></a> 文档页面。</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Ask for help</div><div class="admonitionContent_Knsx"><p>我们有一个专门的 <a href="https://github.com/facebook/docusaurus/discussions/9053" target="_blank" rel="noopener noreferrer" class="">MDX v3 - 升级支持</a> 讨论版。</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="using-the-mdx-playground">Using the MDX playground<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#using-the-mdx-playground" class="hash-link" aria-label="链接到 Using the MDX playground" title="链接到 Using the MDX playground" translate="no">​</a></h3>
<p>The MDX playground is your new best friend. It permits to understand how your content is <strong>compiled to React components</strong>, and troubleshoot compilation or rendering issues in isolation.</p>
<p>Each MDX version comes with its own playground:</p>
<ul>
<li class=""><a href="https://mdxjs.com/playground/" target="_blank" rel="noopener noreferrer" class="">MDX 游乐场 - 当前版本</a></li>
<li class=""><a href="https://mdx-git-renovate-babel-monorepo-mdx.vercel.app/playground/" target="_blank" rel="noopener noreferrer" class="">MDX 游乐场 - v1</a></li>
</ul>
<details class="details_Nokh alert alert--info details_Cn_P" data-collapsed="true"><summary>Configuring the MDX playground options for Docusaurus</summary><div><div class="collapsibleContent_EoA1"><p>To obtain a compilation behavior similar to what Docusaurus v2 uses, please turn on these options on the <a href="https://mdxjs.com/playground/" target="_blank" rel="noopener noreferrer" class="">MDX playground</a>:</p><ul>
<li class="">Use <code>MDX</code></li>
<li class="">Use <code>remark-gfm</code></li>
<li class="">Use <code>remark-directive</code></li>
</ul><p><img decoding="async" loading="lazy" alt="Screenshot of the MDX playground&amp;#39;s options panel, with only the &amp;quot;Use MDX&amp;quot;, &amp;quot;Use remark-gfm&amp;quot;, and &amp;quot;Use remark-directive&amp;quot; options checked" src="https://docusaurus.io/zh-CN/assets/images/mdx2-playground-options-eab88e8328a6902759c4236ffc93d9c6.png" width="1968" height="1316" class="img_vXGZ"></p></div></div></details>
<p>一起使用这两个MDX Playground，您很快就会注意到一些内容的编译不同或未能编译到 v3。</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Making your content future-proof</div><div class="admonitionContent_Knsx"><p>The goal will be to refactor your problematic content so that it <strong>works fine with both versions of MDX</strong>. This way, when you upgrade to Docusaurus v3, this content will already work out-of-the-box.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="using-the-mdx-checker-cli">Using the MDX checker CLI<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#using-the-mdx-checker-cli" class="hash-link" aria-label="链接到 Using the MDX checker CLI" title="链接到 Using the MDX checker CLI" translate="no">​</a></h3>
<p>We provide a <a href="https://github.com/slorber/docusaurus-mdx-checker" target="_blank" rel="noopener noreferrer" class="">docusaurus-mdx-checker</a> CLI that permits to easily spot problematic content. 您可以在您的 Docusaurus v2 网站上运行这个命令来获取一个 MDX v3 下无法编译的文件列表。</p>
<div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">npx docusaurus-mdx-checker</span><br></div></code></pre></div></div>
<p>For each compilation issue, the CLI will log the file path and a line number to look at.</p>
<p><img decoding="async" loading="lazy" alt="Screenshot of the terminal showing an example MDX checker CLI output, with a few error messages" src="https://docusaurus.io/zh-CN/assets/images/mdx-checker-output-0f96cc19fd3ed4d55901ca90ad657c14.png" width="1161" height="417" class="img_vXGZ"></p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>Use this CLI to estimate of how much work will be required to make your content compatible with MDX v3.</p></div></div>
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>警告</div><div class="admonitionContent_Knsx"><p>This CLI is a best effort, and will only report compilation errors.</p><p>It will not report subtle compilation changes that do not produce errors but can affect how your content is displayed. To catch these problems, we recommend using <a class="" href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-confidence-using-visual-regression-testing">visual regression tests</a>.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="common-mdx-problems">Common MDX problems<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#common-mdx-problems" class="hash-link" aria-label="链接到 Common MDX problems" title="链接到 Common MDX problems" translate="no">​</a></h3>
<p>我们将一些Docusaurus网站升级到 Docusaurus v3 和 MDX v3：</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8288" target="_blank" rel="noopener noreferrer" class="">Docusaurus PR</a></li>
<li class=""><a href="https://github.com/facebook/react-native-website/pull/3780" target="_blank" rel="noopener noreferrer" class="">React-Native PR</a></li>
<li class=""><a href="https://github.com/jestjs/jest/pull/14463" target="_blank" rel="noopener noreferrer" class="">Jest PR</a></li>
</ul>
<p>These upgrades permitted us to aggregate the most common content problems, and document how to best handle them.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="bad-usage-of-">Bad usage of <code>{</code><a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#bad-usage-of-" class="hash-link" aria-label="链接到 bad-usage-of-" title="链接到 bad-usage-of-" translate="no">​</a></h4>
<p>The <code>{</code> character is used for opening <a href="https://mdxjs.com/docs/what-is-mdx/#expressions" target="_blank" rel="noopener noreferrer" class="">JavaScript expressions</a>. MDX will now fail if what you put inside <code>{expression}</code> is not a valid expression.</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">The object shape looks like {username: string, age: number}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Error message</div><div class="admonitionContent_Knsx"><blockquote>
<p>Could not parse expression with acorn: Unexpected content after expression</p>
</blockquote></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Available options to fix this error:</p><ul>
<li class="">Use inline code: <code>{username: string, age: number}</code></li>
<li class="">Use the HTML code: <code>&amp;#123;</code></li>
<li class="">Escape it: <code>\{</code></li>
</ul></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="bad-usage-of--1">Bad usage of <code>&lt;</code><a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#bad-usage-of--1" class="hash-link" aria-label="链接到 bad-usage-of--1" title="链接到 bad-usage-of--1" translate="no">​</a></h4>
<p>The <code>&lt;</code> character is used for opening <a href="https://mdxjs.com/docs/what-is-mdx/#jsx" target="_blank" rel="noopener noreferrer" class="">JSX tags</a>. MDX will now fail if it thinks your JSX is invalid.</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">Use Android version &lt;5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">You can use a generic type like Array</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">T</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Follow the template "Road to </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">YOUR_MINOR_VERSION</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">"</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Error messages</div><div class="admonitionContent_Knsx"><blockquote>
<p>Unexpected character <code>5</code> (U+0035) before name, expected a character that can start a name, such as a letter, <code>$</code>, or <code>_</code></p>
</blockquote><blockquote>
<p>Expected a closing tag for <code>&lt;T&gt;</code> (1:6-1:9) before the end of <code>paragraph</code> end-tag-mismatch mdast-util-mdx-jsx</p>
</blockquote><blockquote>
<p>Expected a closing tag for <code>&lt;YOUR_MINOR_VERSION&gt;</code> (134:19-134:39) before the end of <code>paragraph</code></p>
</blockquote></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Available options to fix this error:</p><ul>
<li class="">Use inline code: <code>Array&lt;T&gt;</code></li>
<li class="">Use the HTML code: <code>&amp;lt;</code> or <code>&amp;#60;</code></li>
<li class="">Escape it: <code>\&lt;</code> (unfortunately the <code>\</code> will be displayed under MDX v1)</li>
</ul></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="bad-usage-of-gfm-autolink">Bad usage of GFM Autolink<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#bad-usage-of-gfm-autolink" class="hash-link" aria-label="链接到 Bad usage of GFM Autolink" title="链接到 Bad usage of GFM Autolink" translate="no">​</a></h4>
<p>Docusaurus supports <a href="https://github.github.com/gfm/" target="_blank" rel="noopener noreferrer" class="">GitHub Flavored Markdown (GFM)</a>, but <a href="https://github.github.com/gfm/#autolinks" target="_blank" rel="noopener noreferrer" class="">autolink</a> using the <code>&lt;link&gt;</code> syntax is not supported anymore by MDX.</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">sebastien@thisweekinreact.com</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">&lt;http://localhost:3000&gt;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Error messages</div><div class="admonitionContent_Knsx"><blockquote>
<p>Unexpected character <code>@</code> (U+0040) in name, expected a name character such as letters, digits, <code>$</code>, or <code>_</code>; whitespace before attributes; or the end of the tag (note: to create a link in MDX, use <code>[text](url)</code>)</p>
</blockquote><blockquote>
<p>Unexpected character <code>/</code> (U+002F) before local name, expected a character that can start a name, such as a letter, <code>$</code>, or <code>_</code> (note: to create a link in MDX, use <code>[text](url)</code>)</p>
</blockquote></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Use regular Markdown links, or remove the <code>&lt;</code> and <code>&gt;</code>. MDX and GFM are able to autolink literals already.</p><div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">sebastien@thisweekinreact.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">sebastien@thisweekinreact.com</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">mailto:sebastien@thisweekinreact.com</span><span class="token url" style="color:#36acaa">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">http://localhost:3000</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">http://localhost:3000</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">http://localhost:3000</span><span class="token url" style="color:#36acaa">)</span><br></div></code></pre></div></div></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="lower-case-mdxcomponent-mapping">小写 MDXComponent 映射<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#lower-case-mdxcomponent-mapping" class="hash-link" aria-label="链接到 小写 MDXComponent 映射" title="链接到 小写 MDXComponent 映射" translate="no">​</a></h4>
<p>对于提供<a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/react#mdx-component-scope">自定义 <code>MDXComponent</code>mapping</a> 的用户，组件现在是 "sandboxed"：</p>
<ul>
<li class=""><code>h1</code> 的映射 <code>MDXComponent</code> 仅用于<code># hi</code> ，而不是用于<code>&lt;h1&gt;hi&lt;/h1&gt;</code></li>
<li class=""><strong>小写</strong> 自定义元素名称将不再被相应的 <code>MDXComponent</code> 组件所替代。</li>
</ul>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>visual difference</div><div class="admonitionContent_Knsx"><p>Your <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/react#mdx-component-scope"><code>MDXComponent</code> component mapping</a> might not be applied as before, and your custom components might no longer be used.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>For native Markdown elements, you can keep using <strong>lower-case</strong>: <code>p</code>, <code>h1</code>, <code>img</code>, <code>a</code>...</p><p>For any other element, <strong>use upper-case names</strong>.</p><div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">src/theme/MDXComponents.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">import MDXComponents from '@theme-original/MDXComponents';</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">export default {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  ...MDXComponents,</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  p: (props) =&gt; &lt;p {...props} className="my-paragraph"/&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">  myElement: (props) =&gt; &lt;div {...props} className="my-class" /&gt;,</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">  MyElement: (props) =&gt; &lt;div {...props} className="my-class" /&gt;,</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">};</span><br></div></code></pre></div></div></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="unintended-extra-paragraphs">Unintended extra paragraphs<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#unintended-extra-paragraphs" class="hash-link" aria-label="链接到 Unintended extra paragraphs" title="链接到 Unintended extra paragraphs" translate="no">​</a></h4>
<p>In MDX, it is now possible to interleave JSX and Markdown more easily without requiring extra line breaks. Writing content on multiple lines can also produce new expected <code>&lt;p&gt;</code> tags.</p>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>visual difference</div><div class="admonitionContent_Knsx"><p>See how this content is rendered differently by MDX v1 and v3.</p><div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Some </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Markdown</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Some </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Markdown</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> content</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div><div class="language-html codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">MDX v1 output</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-html codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Some **Markdown** content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Some **Markdown** content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div><div class="language-html codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">MDX v3 output</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-html codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Some </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">strong</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Markdown</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">strong</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Some </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">strong</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Markdown</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">strong</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#22863A">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>If you don't want an extra <code>&lt;p&gt;</code> tag, refactor content on a case by case basis to use a single-line JSX tag.</p><div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">&lt;figure&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  &lt;img src="/img/myImage.png" alt="My alt" /&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">  &lt;figcaption&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    My image caption</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">  &lt;/figcaption&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">  &lt;figcaption&gt;My image caption&lt;/figcaption&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">&lt;/figure&gt;</span><br></div></code></pre></div></div><p>If your content contains "Markdown inlines" (<code>**</code>, <code>*</code>, <code>_</code>, <code>[link](/path)</code>), you might not be able to refactor it ahead of time, and will have to do it alongside the Docusaurus v3 upgrade.</p></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="unintended-usage-of-directives">Unintended usage of directives<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#unintended-usage-of-directives" class="hash-link" aria-label="链接到 Unintended usage of directives" title="链接到 Unintended usage of directives" translate="no">​</a></h4>
<p>Docusaurus v3 now uses <a href="https://talk.commonmark.org/t/generic-directives-plugins-syntax/444" target="_blank" rel="noopener noreferrer" class="">Markdown Directives</a> (implemented with <a href="https://github.com/remarkjs/remark-directive" target="_blank" rel="noopener noreferrer" class="">remark-directive</a>) as a generic way to provide support for admonitions, and other upcoming Docusaurus features.</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">This is a :textDirective</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">::leafDirective</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">:::containerDirective</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Container directive content</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">:::</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Visual change</div><div class="admonitionContent_Knsx"><p>Directives are parsed with the purpose of being handled by other Remark plugins. Unhandled directives will be ignored, and won't be rendered back in their original form.</p><div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">The AWS re:Invent conf is great</span><br></div></code></pre></div></div><p>Due to <code>:Invent</code> being parsed as a text directive, this will now be rendered as:</p><div class="language-text codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-text codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">The AWS re</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">conf is great</span><br></div></code></pre></div></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><ul>
<li class="">Use the HTML code: <code>&amp;#58;</code></li>
<li class="">Add a space after <code>:</code> (if it makes sense): <code>: text</code></li>
<li class="">Escape it: <code>\:</code> (unfortunately the <code>\</code> will be displayed under MDX v1)</li>
</ul></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="unsupported-indented-code-blocks">Unsupported indented code blocks<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#unsupported-indented-code-blocks" class="hash-link" aria-label="链接到 Unsupported indented code blocks" title="链接到 Unsupported indented code blocks" translate="no">​</a></h4>
<p>MDX does not transform indented text as code blocks anymore.</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">    console.log("hello");</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Visual change</div><div class="admonitionContent_Knsx"><p>The upgrade does not generally produce new MDX compilation errors, but can lead to content being rendered in an unexpected way because there isn't a code block anymore.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Use the regular code block syntax instead of indentation:</p><div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">example.md</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token code punctuation" style="color:#393A34">```</span><span class="token code code-language">js</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code code-block language-js">console.log('hello');</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code punctuation" style="color:#393A34">```</span><br></div></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="mdx-plugins">MDX plugins<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#mdx-plugins" class="hash-link" aria-label="链接到 MDX plugins" title="链接到 MDX plugins" translate="no">​</a></h3>
<p>All the official packages (Unified, Remark, Rehype...) in the MDX ecosystem are now <a href="https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c" target="_blank" rel="noopener noreferrer" class=""><strong>ES Modules only</strong></a> and do not support <a href="https://nodejs.org/api/modules.html#modules-commonjs-modules" target="_blank" rel="noopener noreferrer" class="">CommonJS</a> anymore.</p>
<p>In practice this means that you can't do <code>require("remark-plugin")</code> anymore.</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Docusaurus v3 now supports <a href="https://flaviocopes.com/es-modules/" target="_blank" rel="noopener noreferrer" class=""><strong>ES Modules</strong></a> configuration files. We recommend that you migrate your config file to ES module, that enables you to import the Remark plugins easily:</p><div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token imports">remarkPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'remark-plugin'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">title</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Docusaurus'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* site config using remark plugins here */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div><p>If you want to keep using CommonJS modules, you can use dynamic imports as a workaround that enables you to import ES modules inside a CommonJS module. Fortunately, the <a class="" href="https://docusaurus.io/zh-CN/docs/configuration#syntax-to-declare-docusaurus-config">Docusaurus config supports the usage of an async function</a> to let you do so.</p><div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method-variable function-variable method function property-access" style="color:#8250DF">exports</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">async</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> myPlugin </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword control-flow" style="color:#CF222E">await</span><span class="token plain"> </span><span class="token keyword module" style="color:#CF222E">import</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'remark-plugin'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#CF222E">default</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#CF222E">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// site config...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>For plugin authors</div><div class="admonitionContent_Knsx"><p>If you created custom Remark or Rehype plugins, you may need to refactor those, or eventually rewrite them completely, due to how the new AST is structured. We have created a <a href="https://github.com/facebook/docusaurus/discussions/9337" target="_blank" rel="noopener noreferrer" class="">dedicated support discussion</a> to help plugin authors upgrade their code.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-breaking-changes">Other breaking changes<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#other-breaking-changes" class="hash-link" aria-label="链接到 Other breaking changes" title="链接到 Other breaking changes" translate="no">​</a></h2>
<p>Apart from MDX, there are other breaking changes that you can already prepare your site for, notably major version upgrades of important dependencies.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="nodejs-180">Node.js 18.0<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#nodejs-180" class="hash-link" aria-label="链接到 Node.js 18.0" title="链接到 Node.js 18.0" translate="no">​</a></h3>
<p>Node.js 16 <a href="https://nodejs.org/en/blog/announcements/nodejs16-eol" target="_blank" rel="noopener noreferrer" class="">reached End-of-Life</a>, and Docusaurus v3 now requires <strong>Node.js &gt;= 18.0</strong>.</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Upgrade your Docusaurus v2 site to Node.js 18 before upgrading to Docusaurus v3.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="react-180">React 18.0<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#react-180" class="hash-link" aria-label="链接到 React 18.0" title="链接到 React 18.0" translate="no">​</a></h3>
<p>Docusaurus v3 now requires <strong>React &gt;= 18.0</strong>.</p>
<p>React 18 comes with its own breaking changes that should be relatively easy to handle, depending on the amount of custom React code you created for your site.</p>
<p>Simple Docusaurus sites that only use our official theme code without swizzling do not have anything to do.</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Read the official <a href="https://react.dev/blog/2022/03/29/react-v18" target="_blank" rel="noopener noreferrer" class="">React v18.0</a> and <a href="https://react.dev/blog/2022/03/08/react-18-upgrade-guide" target="_blank" rel="noopener noreferrer" class="">How to Upgrade to React 18</a>, and look at your first-party React code to figure out which components might be affected this React 18 upgrade.</p><p>We recommend to particularly look for:</p><ul>
<li class="">Automatic batching for stateful components</li>
<li class="">New React hydration errors reported to the console</li>
</ul></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="typescript-50">TypeScript 5.0<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#typescript-50" class="hash-link" aria-label="链接到 TypeScript 5.0" title="链接到 TypeScript 5.0" translate="no">​</a></h3>
<p>Docusaurus v3 now requires <strong>TypeScript &gt;= 5.0</strong>.</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Upgrade your Docusaurus v2 site to TypeScript 5 before upgrading to Docusaurus v3.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="typescript-base-config">TypeScript base config<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#typescript-base-config" class="hash-link" aria-label="链接到 TypeScript base config" title="链接到 TypeScript base config" translate="no">​</a></h3>
<p>The official Docusaurus TypeScript config has been re-internalized from the external package <a href="https://www.npmjs.com/package/@tsconfig/docusaurus" target="_blank" rel="noopener noreferrer" class=""><code>@tsconfig/docusaurus</code></a> to our new monorepo package <a href="https://www.npmjs.com/package/@docusaurus/tsconfig" target="_blank" rel="noopener noreferrer" class=""><code>@docusaurus/tsconfig</code></a>.</p>
<p>This new package is versioned alongside all the other Docusaurus core packages, and will be used to ensure TypeScript retro-compatibility and breaking changes on major version upgrades.</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>The new Docusaurus v3 TypeScript config is sensibly the same as the former Docusaurus v2 TypeScript config. If you upgraded to TypeScript 5, using the Docusaurus v3 config on a v2 site is already possible:</p><div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">package.json</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "devDependencies": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@tsconfig/docusaurus": "^1.0.7",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/tsconfig": "^3.0.0-beta.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">}</span><br></div></code></pre></div></div><div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">tsconfig.json</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">  "extends": "@tsconfig/docusaurus/tsconfig.json",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">  "extends": "@docusaurus/tsconfig",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "compilerOptions": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    "baseUrl": "."</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">}</span><br></div></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="admonition-warning">Admonition warning<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#admonition-warning" class="hash-link" aria-label="链接到 Admonition warning" title="链接到 Admonition warning" translate="no">​</a></h3>
<p>For historical reasons, we support an undocumented admonition <code>:::warning</code> that renders with a red color.</p>
<div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Warning</div><div class="admonitionContent_Knsx"><p>This is a Docusaurus v2 <code>:::warning</code> admonition.</p></div></div>
<p>However, the color and icon is historically wrong. Docusaurus v3 re-introduces <code>:::warning</code> admonition officially, documents it, and fix the color and icon.</p>
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>警告</div><div class="admonitionContent_Knsx"><p>This is a Docusaurus v3 <code>:::warning</code> admonition.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>If you previously used the undocumented <code>:::warning</code> admonition, make sure to verify for each usage if yellow is now an appropriate color. If you want to keep the red color, use <code>:::danger</code> instead.</p><p>Docusaurus v3 also <a href="https://github.com/facebook/docusaurus/pull/9308" target="_blank" rel="noopener noreferrer" class="">deprecated the <code>:::caution</code></a> admonition. Please refactor <code>:::caution</code> (yellow) to either <code>:::warning</code> (yellow) or <code>:::danger</code> (red).</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="versioned-sidebars">Versioned sidebars<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#versioned-sidebars" class="hash-link" aria-label="链接到 Versioned sidebars" title="链接到 Versioned sidebars" translate="no">​</a></h3>
<p>This breaking change will only affect <strong>Docusaurus v2 early adopters</strong> who versioned their docs before <code>v2.0.0-beta.10</code> (December 2021).</p>
<p>When creating version <code>v1.0.0</code>, the sidebar file contained a prefix <code>version-v1.0.0/</code> that <a href="https://github.com/facebook/docusaurus/pull/9310" target="_blank" rel="noopener noreferrer" class="">Docusaurus v3 does not support anymore</a>.</p>
<div class="language-json codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">versioned_sidebars/version-v1.0.0-sidebars.json</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-json codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#005CC5">"version-v1.0.0/docs"</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#C6105F">"version-v1.0.0/introduction"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#C6105F">"version-v1.0.0/prerequisites"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>How to prepare</div><div class="admonitionContent_Knsx"><p>Your Docusaurus v2 site is able to handle the 2 sidebar formats similarly.</p><p>You can remove the useless versioned prefix from your versioned sidebars.</p><div class="language-json codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">versioned_sidebars/version-v1.0.0-sidebars.json</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-json codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#005CC5">"docs"</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#C6105F">"introduction"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">"prerequisites"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="try-docusaurus-v3-today">Try Docusaurus v3 today<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#try-docusaurus-v3-today" class="hash-link" aria-label="链接到 Try Docusaurus v3 today" title="链接到 Try Docusaurus v3 today" translate="no">​</a></h2>
<p>Docusaurus v3 is now <a href="https://github.com/facebook/docusaurus/discussions/9312" target="_blank" rel="noopener noreferrer" class="">in beta</a>, and already used in production by <a href="https://reactnative.dev/" target="_blank" rel="noopener noreferrer" class="">React-Native</a>, <a href="https://jestjs.io/" target="_blank" rel="noopener noreferrer" class="">Jest</a>, and <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">our own website</a>.</p>
<p>We think this new Docusaurus version is <strong>robust and ready to be deployed in production</strong>. It should be released officially soon, after receiving a positive feedback from early adopters of our community.</p>
<p>We would really appreciate it if you try upgrading and report issues on the <a href="https://github.com/facebook/docusaurus/discussions/9312" target="_blank" rel="noopener noreferrer" class="">3.0.0-beta.0 release discussion thread</a>.</p>
<p>For most sites, the upgrade should be easy. If you prepared your site ahead of time as documented here, upgrading the following dependencies should be enough:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">package.json</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "dependencies": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@docusaurus/core": "2.4.3",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@docusaurus/preset-classic": "2.4.3",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@mdx-js/react": "^1.6.22",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/core": "3.0.0-beta.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/preset-classic": "3.0.0-beta.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@mdx-js/react": "^3.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    "clsx": "^2.0.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    "prism-react-renderer": "^1.3.5",</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "react": "^17.0.2",</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "react-dom": "^17.0.2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "react": "^18.2.0",</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "react-dom": "^18.2.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  },</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "devDependencies": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">    "@docusaurus/module-type-aliases": "2.4.3"</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    "@docusaurus/module-type-aliases": "3.0.0-beta.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="ask-for-help">Ask for help<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#ask-for-help" class="hash-link" aria-label="链接到 Ask for help" title="链接到 Ask for help" translate="no">​</a></h2>
<p>We will be there to help you upgrade through the following support channels:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/discussions/9336" target="_blank" rel="noopener noreferrer" class="">Docusaurus v3 - Upgrade Support</a></li>
<li class=""><a href="https://discord.com/channels/398180168688074762/1154771869094912090" target="_blank" rel="noopener noreferrer" class="">Docusaurus v3 - Discord channel #migration-v2-to-v3</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/discussions/9053" target="_blank" rel="noopener noreferrer" class="">MDX v3 - 升级支持</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/discussions/9337" target="_blank" rel="noopener noreferrer" class="">MDX v3 - Remark/Rehype 插件支持</a></li>
<li class=""><a href="https://discord.com/channels/398180168688074762/1116724556976111616" target="_blank" rel="noopener noreferrer" class="">MDX v3 - Discord 频道 #migration-mdx-v3</a></li>
</ul>
<p>Alternatively, you can look for a paid <a href="https://github.com/facebook/docusaurus/discussions/9281" target="_blank" rel="noopener noreferrer" class="">Docusaurus Service Provider</a> to execute this upgrade for you. If your site is open source, you can also ask our community for <a href="https://github.com/facebook/docusaurus/discussions/9283" target="_blank" rel="noopener noreferrer" class="">free, benevolent help</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="conclusion">结语<a href="https://docusaurus.io/zh-CN/blog/preparing-your-site-for-docusaurus-v3#conclusion" class="hash-link" aria-label="链接到 结语" title="链接到 结语" translate="no">​</a></h2>
<p>Docusaurus v3 is ready to try, and will be released soon. This article already gives you a good idea of all the major changes required to upgrade.</p>
<p>The initial 3.0 release is focusing on dependency and infrastructure upgrades that will permit us to implement new exciting features. It also comes with a few useful features that we will detail in the final release notes.</p>]]></content:encoded>
            <category>Maintenance</category>
        </item>
        <item>
            <title><![CDATA[Upgrading frontend dependencies with confidence]]></title>
            <link>https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing</link>
            <guid>https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing</guid>
            <pubDate>Fri, 22 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Upgrade npm dependencies with confidence thanks to a visual regression testing workflow using GitHub Actions, Playwright and Argos.]]></description>
            <content:encoded><![CDATA[<p>Frontend developers often need to <strong>upgrade npm dependencies</strong>, but those upgrades can feel scary and lead to <strong>subtle UI side effects</strong> not caught by your regular test suite.</p>
<p>Upgrading Docusaurus is a good example: without reviewing all the pages one by one, it's hard to be sure there's no visual regression. <strong>Docusaurus v3 is around the corner</strong> (currently in <a href="https://github.com/facebook/docusaurus/discussions/9312" target="_blank" rel="noopener noreferrer" class="">beta</a>), and we would like to help you do this upgrade with confidence.</p>
<p>This article introduces a <strong>visual regression testing</strong> workflow based on <a href="https://github.com/features/actions" target="_blank" rel="noopener noreferrer" class=""><strong>GitHub Actions</strong></a>, <a href="https://playwright.dev/" target="_blank" rel="noopener noreferrer" class=""><strong>Playwright</strong></a>, and <a href="https://argos-ci.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Argos</strong></a>. It is not directly coupled to Docusaurus or React, and can be adapted to work with other frontend applications and frameworks.</p>
<p><img decoding="async" loading="lazy" alt="Upgrading frontend dependencies with confidence - social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-0662a6f419d0032829f99915ccf8918b.png" width="1500" height="785" class="img_vXGZ"></p>
<!-- -->
<p>This workflow has been tested while upgrading Docusaurus v2 to v3, and already helped catch a few visual regressions on sites such as <a href="https://reactnative.dev/" target="_blank" rel="noopener noreferrer" class="">React Native</a>, <a href="https://jestjs.io/" target="_blank" rel="noopener noreferrer" class="">Jest</a>, and the <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">Docusaurus</a> site itself.</p>
<p>Docusaurus v3 comes with infrastructure changes and major dependency upgrades such as <a href="https://mdxjs.com/blog/v3/" target="_blank" rel="noopener noreferrer" class="">MDX v3</a> and <a href="https://react.dev/blog/2022/03/29/react-v18" target="_blank" rel="noopener noreferrer" class="">React 18</a>, which can produce unexpected side effects. It would have been difficult to notice all the visual regressions without such a workflow. That's why we encourage site owners to consider adopting visual regression testing, especially for highly customized sites.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="workflow-overview">Workflow overview<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#workflow-overview" class="hash-link" aria-label="链接到 Workflow overview" title="链接到 Workflow overview" translate="no">​</a></h2>
<p>The general idea is pretty simple:</p>
<ul>
<li class="">Build your site in CI with <a href="https://github.com/features/actions" target="_blank" rel="noopener noreferrer" class="">GitHub Actions</a></li>
<li class="">Take screenshots of all <code>sitemap.xml</code> pages with <a href="https://playwright.dev/" target="_blank" rel="noopener noreferrer" class="">Playwright</a></li>
<li class="">Upload them to <a href="https://argos-ci.com/" target="_blank" rel="noopener noreferrer" class="">Argos</a></li>
<li class="">Do this for both Git branches <code>main</code> and <code>pr-branch</code></li>
<li class="">Compare the screenshots side-by-side in <a href="https://argos-ci.com/" target="_blank" rel="noopener noreferrer" class="">Argos</a></li>
</ul>
<p>Argos will then <strong>report visual differences</strong> found between <code>main</code> and <code>pr-branch</code> as a GitHub commit status and pull-request comment. This can help you detect visual regressions ahead of time in an automated way.</p>
<p><img decoding="async" loading="lazy" alt="Argos GitHub commit status" src="https://docusaurus.io/zh-CN/assets/images/argos-github-status-05e8264c59fa4f8a21292f59665edf3d.png" width="978" height="375" class="img_vXGZ"></p>
<p><img decoding="async" loading="lazy" alt="Argos GitHub PR comment" src="https://docusaurus.io/zh-CN/assets/images/argos-github-comment-8b62a1561b13881608d5c9f8a8f833a5.png" width="982" height="303" class="img_vXGZ"></p>
<p>Argos creates a report referencing all the visual differences found while comparing the 2 Git branches sites side-by-side, and provides a convenient UX to easily spot the difference.</p>
<p>Check the <a href="https://app.argos-ci.com/meta-open-source/docusaurus" target="_blank" rel="noopener noreferrer" class="">Docusaurus Argos page</a> to explore our own website reports.</p>
<p>Here is a more concrete example of Argos <a href="https://app.argos-ci.com/slorber/rnw-visual-tests/builds/32/56012838" target="_blank" rel="noopener noreferrer" class="">reporting a visual regression</a> found while upgrading the React-Native website:</p>
<p><a href="https://app.argos-ci.com/slorber/rnw-visual-tests/builds/32/56012838" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Argos GitHub PR comment" src="https://docusaurus.io/zh-CN/assets/images/argos-react-native-regression-216ace77baedfaf873a770112ec817ac.png" width="1959" height="979" class="img_vXGZ"></a></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="workflow-implementation">Workflow implementation<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#workflow-implementation" class="hash-link" aria-label="链接到 Workflow implementation" title="链接到 Workflow implementation" translate="no">​</a></h2>
<p>This section will describe the implementation details of each step of the workflow.</p>
<p>You will need to <a href="https://app.argos-ci.com/signup" target="_blank" rel="noopener noreferrer" class="">sign up to Argos</a> and <a href="https://argos-ci.com/docs/github" target="_blank" rel="noopener noreferrer" class="">connect Argos to your GitHub repository</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="dependencies">Dependencies<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#dependencies" class="hash-link" aria-label="链接到 Dependencies" title="链接到 Dependencies" translate="no">​</a></h3>
<p>This workflow requires the following dev dependencies, in addition to the usual Docusaurus ones:</p>
<div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">yarn</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:#E36209">-D</span><span class="token plain"> @argos-ci/cli @argos-ci/playwright @playwright/test cheerio</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="github-action">GitHub Action<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#github-action" class="hash-link" aria-label="链接到 GitHub Action" title="链接到 GitHub Action" translate="no">​</a></h3>
<p>The GitHub action is responsible for executing the workflow for each Git branch.</p>
<p>A minimal workflow could look like:</p>
<div class="language-yaml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">.github/workflows/argos.yml</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yaml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Argos CI Screenshots</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">pull_request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">take-screenshots</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Check out repository code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Use Node.js</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">node@v3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#22863A">node-version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> current</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install dependencies</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yarn install </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">frozen</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">lockfile</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install Playwright browsers</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yarn playwright install </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deps chromium</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Build the website</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yarn docusaurus build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Take screenshots with Playwright</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yarn playwright test</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Upload screenshots to Argos</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#22863A">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yarn argos upload ./screenshots</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="playwright-config">Playwright config<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#playwright-config" class="hash-link" aria-label="链接到 Playwright config" title="链接到 Playwright config" translate="no">​</a></h3>
<p>Playwright is responsible for taking screenshots of the website previously built locally by the GitHub action.</p>
<p>A minimal <a href="https://playwright.dev/docs/test-configuration" target="_blank" rel="noopener noreferrer" class="">Playwright config</a> could look like:</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">playwright.config.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">devices</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@playwright/test'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">PlaywrightTestConfig</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@playwright/test'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> PlaywrightTestConfig </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  webServer</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    port</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">3000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    command</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'yarn docusaurus serve'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  projects</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'chromium'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      use</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token operator" style="color:#D73A49">...</span><span class="token plain">devices</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#C6105F">'Desktop Chrome'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">default</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="playwright-test">Playwright test<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#playwright-test" class="hash-link" aria-label="链接到 Playwright test" title="链接到 Playwright test" translate="no">​</a></h3>
<p>A Playwright config is not enough: we also need to write a Playwright test file to generate the site screenshots.</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">screenshot.spec.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">*</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">as</span><span class="token plain"> fs </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'fs'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">test</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@playwright/test'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">argosScreenshot</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'@argos-ci/playwright'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">extractSitemapPathnames</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pathnameToArgosName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'./utils'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Constants</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> siteUrl </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'http://localhost:3000'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> sitemapPath </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'./build/sitemap.xml'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> stylesheetPath </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'./screenshot.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> stylesheet </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> fs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">readFileSync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stylesheetPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Wait for hydration, requires Docusaurus v2.4.3+</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Docusaurus adds a &lt;html data-has-hydrated="true"&gt; once hydrated</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">// See https://github.com/facebook/docusaurus/pull/9256</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">waitForDocusaurusHydration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">documentElement</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dataset</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hasHydrated </span><span class="token operator" style="color:#D73A49">===</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'true'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">screenshotPathname</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pathname</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#8250DF">test</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#C6105F">`</span><span class="token template-string string" style="color:#C6105F">pathname </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">pathname</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#C6105F">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">page</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> url </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> siteUrl </span><span class="token operator" style="color:#D73A49">+</span><span class="token plain"> pathname</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#CF222E">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">goto</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#CF222E">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">waitForFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">waitForDocusaurusHydration</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#CF222E">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">addStyleTag</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">content</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> stylesheet</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#CF222E">await</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">argosScreenshot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">page</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">pathnameToArgosName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pathname</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">describe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'Docusaurus site screenshots'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> pathnames </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">extractSitemapPathnames</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sitemapPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'Pathnames to screenshot:'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> pathnames</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  pathnames</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">screenshotPathname</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<details class="details_Nokh alert alert--info details_Cn_P" data-collapsed="true"><summary>Why do we take screenshots with Argos instead of Playwright?</summary><div><div class="collapsibleContent_EoA1"><p>Argos has a <a href="https://argos-ci.com/docs/playwright" target="_blank" rel="noopener noreferrer" class="">Playwright integration</a> that wraps the original Playwright screenshot API and provides better defaults to make screenshots more deterministic.</p></div></div></details>
<details class="details_Nokh alert alert--info details_Cn_P" data-collapsed="true"><summary>What's inside <code>utils.ts</code>?</summary><div><div class="collapsibleContent_EoA1"><p>This module contains implementation details that we choose to hide for clarity.</p><div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">*</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">as</span><span class="token plain"> cheerio </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'cheerio'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">import</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">*</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">as</span><span class="token plain"> fs </span><span class="token keyword" style="color:#CF222E">from</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'fs'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Extract a list of pathnames, given a fs path to a sitemap.xml file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Docusaurus generates a build/sitemap.xml file for you!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">extractSitemapPathnames</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sitemapPath</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> sitemap </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> fs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">readFileSync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sitemapPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> $ </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> cheerio</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">load</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sitemap</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">xmlMode</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> urls</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#8250DF">$</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'loc'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">each</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">handleLoc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    urls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#8250DF">$</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#CF222E">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> urls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">new</span><span class="token plain"> </span><span class="token class-name constant" style="color:#005CC5">URL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">pathname</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">// Converts a pathname to a decent screenshot name</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#CF222E">export</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">pathnameToArgosName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pathname</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> pathname</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex anchor function" style="color:#8250DF">^</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex alternation keyword" style="color:#CF222E">|</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex anchor function" style="color:#8250DF">$</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-flags" style="color:#36acaa">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">''</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">||</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'index'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div></div></div></details>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="stylesheet">Stylesheet<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#stylesheet" class="hash-link" aria-label="链接到 Stylesheet" title="链接到 Stylesheet" translate="no">​</a></h3>
<p>Screenshots are not always deterministic, and taking a screenshot of a page twice can lead to subtle variations that will be reported by Argos as <strong>false positive</strong> visual regressions.</p>
<p>For this reason, we recommend injecting an extra stylesheet to hide the problematic elements. You will probably need to add new CSS rules to this base stylesheet, according to flaky elements found on your own site. Read <a href="https://argos-ci.com/docs/about-flaky" target="_blank" rel="noopener noreferrer" class="">Argos - About flaky tests docs</a> for details.</p>
<div class="language-css codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">screenshot.css</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-css codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Iframes can load lazily */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">iframe</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Avatars can be flaky due to using external sources: GitHub/Unavatar */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.avatar__photo</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Gifs load lazily and are animated */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">img[src$=</span><span class="token string" style="color:#C6105F">'.gif'</span><span class="token plain">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Algolia keyboard shortcuts appear with a little delay */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.DocSearch-Button-Keys &gt; kbd</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* The live playground preview can often display dates/counters */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector attribute punctuation" style="color:#393A34">[</span><span class="token selector attribute attr-name" style="color:#0550AE">class</span><span class="token selector attribute operator" style="color:#D73A49">*=</span><span class="token selector attribute attr-value" style="color:#C6105F">'playgroundPreview'</span><span class="token selector attribute punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#005CC5">visibility</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hidden</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Different docs last-update dates can alter layout */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.theme-last-updated</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#6B6B6B;font-style:italic">/* Mermaid diagrams are rendered client-side and produce layout shifts */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#6F42C1">.docusaurus-mermaid-container</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#005CC5">display</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> none</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>prevent layout shifts</div><div class="admonitionContent_Knsx"><p>We recommend hiding flaky UI elements affecting layout with <code>display: none;</code>.</p><p>For example, the docs "Last Updated on" might render on more than 1 line, eventually "pushing" the rest of your content further down, leading to Argos detecting many different pixels.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="example-repository">Example repository<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#example-repository" class="hash-link" aria-label="链接到 Example repository" title="链接到 Example repository" translate="no">​</a></h2>
<p>The <a href="https://github.com/slorber/docusaurus-argos-example" target="_blank" rel="noopener noreferrer" class="">slorber/docusaurus-argos-example</a> repo shows a complete example of implementing this workflow on a newly initialized Docusaurus v2 site, using a Yarn monorepo.</p>
<p><a href="https://github.com/slorber/docusaurus-argos-example" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Docusaurus + Argos monorepo example screenshot" src="https://docusaurus.io/zh-CN/assets/images/docusaurus-argos-example-repo-screenshot-a56583e16aa02c7fa96c592f1339928f.png" width="767" height="427" class="img_vXGZ"></a></p>
<p>Relevant pull-requests:</p>
<ul>
<li class=""><a href="https://github.com/slorber/docusaurus-argos-example/pull/1" target="_blank" rel="noopener noreferrer" class="">PR - Set up GitHub Action + Playwright + Argos</a>: implements the minimal workflow described above</li>
<li class=""><a href="https://github.com/slorber/docusaurus-argos-example/pull/2" target="_blank" rel="noopener noreferrer" class="">PR - Upgrading Docusaurus from v2 to v3</a>: shows how Argos caught 3 visual regressions while upgrading</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>More advanced example?</div><div class="admonitionContent_Knsx"><p>Browse the Docusaurus repository for a more advanced integration:</p><ul>
<li class=""><a href="https://github.com/facebook/docusaurus/blob/main/.github/workflows/argos.yml" target="_blank" rel="noopener noreferrer" class="">GitHub Action</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/tree/main/argos" target="_blank" rel="noopener noreferrer" class="">Playwright + Argos tests</a></li>
</ul></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="make-it-cheap">Make it cheap<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#make-it-cheap" class="hash-link" aria-label="链接到 Make it cheap" title="链接到 Make it cheap" translate="no">​</a></h2>
<p>The tools we choose are implementation details of this visual regression testing workflow.</p>
<p>For Docusaurus, we choose <a href="https://argos-ci.com/" target="_blank" rel="noopener noreferrer" class="">Argos</a>: it works well for us, and offers <a href="https://argos-ci.com/pricing" target="_blank" rel="noopener noreferrer" class="">free</a> and <a href="https://argos-ci.com/docs/open-source" target="_blank" rel="noopener noreferrer" class="">open source</a> plans. However, you are free to adopt alternative tools.</p>
<p>In case you don't mind storing large screenshots in Git, you can also try the free, self-hosted <a href="https://playwright.dev/docs/test-snapshots" target="_blank" rel="noopener noreferrer" class="">Playwright Visual Comparisons</a> and browse visual differences with <code>npx playwright show-report</code>. However, we found using a dedicated external tool is more convenient.</p>
<p>External tools can be expensive, but generally offer free plans with an ample quota of screenshots. You can reduce your screenshot consumption by implementing a few tricks below.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="limit-the-number-of-pathnames">Limit the number of pathnames<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#limit-the-number-of-pathnames" class="hash-link" aria-label="链接到 Limit the number of pathnames" title="链接到 Limit the number of pathnames" translate="no">​</a></h3>
<p>The base setup involves taking a screenshot of every single pathname found in <code>sitemap.xml</code>. For large sites, that can lead to a lot of screenshots.</p>
<p>You can decide to filter the pathnames to only take screenshots of the most critical pages.</p>
<p>For the Docusaurus website, do not take screenshots for versioned docs pages:</p>
<div class="language-ts codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">screenshot.spec.ts</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-ts codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">function</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">isVersionedDocsPathname</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pathname</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token builtin">boolean</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> pathname</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">match</span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex anchor function" style="color:#8250DF">^</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex" style="color:#36acaa">docs</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex char-set class-name" style="color:#116329">\d</span><span class="token regex regex-source language-regex special-escape escape" style="color:#36acaa">\.</span><span class="token regex regex-source language-regex char-set class-name" style="color:#116329">\d</span><span class="token regex regex-source language-regex special-escape escape" style="color:#36acaa">\.</span><span class="token regex regex-source language-regex char-set class-name" style="color:#116329">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-source language-regex alternation keyword" style="color:#CF222E">|</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex" style="color:#36acaa">next</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">describe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#C6105F">'Docusaurus site screenshots'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> pathnames </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">extractSitemapPathnames</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sitemapPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isVersionedDocsPathname</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  pathnames</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#8250DF">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">screenshotPathname</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="limit-the-workflow-concurrency">Limit the workflow concurrency<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#limit-the-workflow-concurrency" class="hash-link" aria-label="链接到 Limit the workflow concurrency" title="链接到 Limit the workflow concurrency" translate="no">​</a></h3>
<p>Implementing <a href="https://docs.github.com/en/actions/using-jobs/using-concurrency" target="_blank" rel="noopener noreferrer" class="">GitHub Actions concurrency groups</a> will prevent successive commits to trigger multiple useless workflow runs. The workflow will only be executed for the last commit, and previous commits will be canceled automatically.</p>
<div class="language-yaml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">.github/workflows/argos.yml</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yaml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#22863A">concurrency</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> github.workflow </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> github.head_ref </span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> github.run_id </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">cancel-in-progress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#005CC5">true</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="run-your-workflow-conditionally">Run your workflow conditionally<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#run-your-workflow-conditionally" class="hash-link" aria-label="链接到 Run your workflow conditionally" title="链接到 Run your workflow conditionally" translate="no">​</a></h3>
<p>It's not worth running this workflow for every single commit and pull-request.</p>
<p>For example, if someone corrects a typo in your documentation, you probably don't want to take hundreds of screenshots and have Argos to point out that only the modified page has a visual difference: duh, that's a bit expected!</p>
<p>For the Docusaurus website, we only run the workflow for pull-request having the <code>Argos</code> label:</p>
<div class="language-yaml codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">.github/workflows/argos.yml</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-yaml codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#22863A">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Argos CI Screenshots</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">pull_request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">types</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> opened</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> synchronize</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> reopened</span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> labeled</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#22863A">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#22863A">take-screenshots</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> github.ref_name == 'main' </span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> (github.event_name == 'pull_request' </span><span class="token important">&amp;&amp;</span><span class="token plain"> contains(github.event.pull_request.labels.</span><span class="token important">*.name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> 'Argos')) </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#22863A">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#6B6B6B;font-style:italic"># Your job steps here ...</span><br></div></code></pre></div></div>
<p>There are many options to explore, such as <a href="https://docs.github.com/en/actions/using-workflows/manually-running-a-workflow" target="_blank" rel="noopener noreferrer" class="">triggering the workflow manually</a> or <a href="https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#example-including-paths" target="_blank" rel="noopener noreferrer" class="">only when files matching a specific pattern are modified</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="conclusion">结语<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#conclusion" class="hash-link" aria-label="链接到 结语" title="链接到 结语" translate="no">​</a></h2>
<p>I believe <strong>visual regression testing is underused</strong> in the frontend ecosystem.</p>
<p>Taking full-page screenshots is a <strong>low-hanging fruit</strong> that is easy to set up and can help you <strong>catch a new class of bugs</strong> that your regular test suite would miss. This technique shines not only for npm package upgrades, but also for <strong>any kind of refactoring</strong> that shouldn't change the user interface.</p>
<p>So why not give it a try?</p>
<p>Happy hacking!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="see-also">See also<a href="https://docusaurus.io/zh-CN/blog/upgrading-frontend-dependencies-with-releve-using-visual-regression-testing#see-also" class="hash-link" aria-label="链接到 See also" title="链接到 See also" translate="no">​</a></h2>
<p>Useful documentation links:</p>
<ul>
<li class=""><a href="https://playwright.dev/docs/intro" target="_blank" rel="noopener noreferrer" class="">Playwright - Installation</a></li>
<li class=""><a href="https://playwright.dev/docs/test-configuration" target="_blank" rel="noopener noreferrer" class="">Playwright - Test config guide</a></li>
<li class=""><a href="https://playwright.dev/docs/api/class-testconfig" target="_blank" rel="noopener noreferrer" class="">Playwright - Test config API</a></li>
<li class=""><a href="https://argos-ci.com/docs/installation" target="_blank" rel="noopener noreferrer" class="">Argos - Installation</a></li>
<li class=""><a href="https://argos-ci.com/docs/github-actions" target="_blank" rel="noopener noreferrer" class="">Argos - Use with GitHub Actions</a></li>
<li class=""><a href="https://argos-ci.com/docs/playwright" target="_blank" rel="noopener noreferrer" class="">Argos - Use with Playwright</a></li>
<li class=""><a href="https://argos-ci.com/docs/about-flaky" target="_blank" rel="noopener noreferrer" class="">Argos - About flaky tests</a></li>
</ul>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 2.4]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/2.4</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/2.4</guid>
            <pubDate>Thu, 23 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 2.4.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 2.4</strong>.</p>
<p>The upgrade should be easy: as explained in our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process documentation</a>, minor versions respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus blog post social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-3239a62bb56c9529ff255bc2c72e94f6.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="sidebar-item-description">Sidebar item description<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#sidebar-item-description" class="hash-link" aria-label="链接到 Sidebar item description" title="链接到 Sidebar item description" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8236" target="_blank" rel="noopener noreferrer" class="">#8236</a>, we made it possible to provide a new <code>description</code> attribute for docs sidebar items of type <code>link</code> and <code>category</code>.</p>
<div class="language-tsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">sidebars.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-tsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    type</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'link'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    label</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Link with description'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    href</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'https://docusaurus.io'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Some link description'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    type</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'category'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    label</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Category with description'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'Some category description'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    items</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>These descriptions will be used in category generated index pages.</p>
<p><img decoding="async" loading="lazy" alt="Show sidebar category generated index with custom descriptions" src="https://docusaurus.io/zh-CN/assets/images/sidebar-item-description-f38981b17f486bc09fb811c6992ef668.jpg" width="1400" height="691" class="img_vXGZ"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="theme-query-string">Theme Query String<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#theme-query-string" class="hash-link" aria-label="链接到 Theme Query String" title="链接到 Theme Query String" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8708" target="_blank" rel="noopener noreferrer" class="">#8708</a>, we added the possibility to force Docusaurus to initialize itself in <code>light</code> or <code>dark</code> mode through a new <code>docusaurus-theme</code> query-string parameter.</p>
<p>This is useful to ensure a consistent theme when embedding an existing Docusaurus page into an iframe or WebView.</p>
<div style="padding:10px"><div class="browserWindow_my1Q" style="min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">/docs/?docusaurus-theme=light</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs" style="padding:0"><iframe src="/docs/?docusaurus-theme=light" title="/docs/?docusaurus-theme=light" style="display:block;width:100%;height:300px"></iframe></div></div></div>
<div style="padding:10px"><div class="browserWindow_my1Q" style="min-width:min(100%,45vw);width:800px;max-width:100%;overflow:hidden"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">/docs/?docusaurus-theme=dark</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs" style="padding:0"><iframe src="/docs/?docusaurus-theme=dark" title="/docs/?docusaurus-theme=dark" style="display:block;width:100%;height:300px"></iframe></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="remark-plugin-npm2yarn-upgrade">Remark plugin npm2yarn upgrade<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#remark-plugin-npm2yarn-upgrade" class="hash-link" aria-label="链接到 Remark plugin npm2yarn upgrade" title="链接到 Remark plugin npm2yarn upgrade" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8690" target="_blank" rel="noopener noreferrer" class="">#8690</a>, we upgraded our Remark plugin <a href="https://github.com/facebook/docusaurus/tree/main/packages/docusaurus-remark-plugin-npm2yarn" target="_blank" rel="noopener noreferrer" class="">@docusaurus/remark-plugin-npm2yarn</a> with many conversion bug fixes, first-class support for pnpm, and the ability to register custom converters producing new tabs.</p>
<div class="language-markdown codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-markdown codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">Run these commands!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token code punctuation" style="color:#393A34">```</span><span class="token code code-language">bash npm2yarn</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code code-block language-bash">npm install</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-bash">npm run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-bash">npm run myCustomScript -- --some-arg</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code punctuation" style="color:#393A34">```</span><br></div></code></pre></div></div>
<div class="browserWindow_my1Q"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">http://localhost:3000</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs"><div class="theme-tabs-container tabs-container tabList_Qoir"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_AQgk tabs__item--active">npm</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_AQgk">Yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_AQgk">pnpm</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_AQgk">Bun</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_pnkT"><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">npm</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#8250DF">npm</span><span class="token plain"> run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#8250DF">npm</span><span class="token plain"> run myCustomScript -- --some-arg</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_pnkT" hidden=""><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">yarn</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#8250DF">yarn</span><span class="token plain"> build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#8250DF">yarn</span><span class="token plain"> myCustomScript --some-arg</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_pnkT" hidden=""><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#8250DF">pnpm</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#8250DF">pnpm</span><span class="token plain"> run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#8250DF">pnpm</span><span class="token plain"> run myCustomScript --some-arg</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_pnkT" hidden=""><div class="language-bash codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-bash codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">bun </span><span class="token function" style="color:#8250DF">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">bun run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">bun run myCustomScript --some-arg</span><br></div></code></pre></div></div></div></div></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="gtag-support-for-multiple-tracking-ids">gtag support for multiple tracking IDs<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#gtag-support-for-multiple-tracking-ids" class="hash-link" aria-label="链接到 gtag support for multiple tracking IDs" title="链接到 gtag support for multiple tracking IDs" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8620" target="_blank" rel="noopener noreferrer" class="">#8620</a> we added support for the <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-google-gtag">@docusaurus/plugin-google-gtag</a> plugin to declare multiple tracking IDs.</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">presets</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#C6105F">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#005CC5">gtag</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#005CC5">trackingID</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#C6105F">'G-&lt;YOUR-NEW-GA4-ID&gt;'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#C6105F">'UA-&lt;YOUR-OLD-UA-ID&gt;'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Google is sunsetting Universal Analytics</div><div class="admonitionContent_Knsx"><p><strong><a href="https://blog.google/products/marketingplatform/analytics/prepare-for-future-with-google-analytics-4/" target="_blank" rel="noopener noreferrer" class="">Google will sunset its Universal Analytics</a></strong> on <strong>July 1, 2023</strong>.</p><p>Docusaurus users should migrate to Google Analytics 4. Google <strong>does not permit to migrate your existing Universal Analytics data</strong> to your new Google Analytics 4 property.</p><p>To preserve the continuity of your analytics, we temporarily recommend that you report events to 2 tracking IDs at the same time: the old one (<code>UA-*</code>) and new one (<code>G-*</code>). Refer to the <strong><a href="https://github.com/facebook/docusaurus/issues/7221" target="_blank" rel="noopener noreferrer" class="">dedicated issue</a></strong> for details.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="developer-experience">Developer Experience<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#developer-experience" class="hash-link" aria-label="链接到 Developer Experience" title="链接到 Developer Experience" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8736" target="_blank" rel="noopener noreferrer" class="">#8736</a>, we improved how we render error messages and added initial support to render the full causal chain of an error (see <a href="https://h3manth.com/ES2022/#error-cause" target="_blank" rel="noopener noreferrer" class="">ES2022 Error Cause</a>).</p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>To see it in action, click here: <button class="button button--danger" type="button">Boom!</button></p></div></div>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8735" target="_blank" rel="noopener noreferrer" class="">#8735</a> we also made navbar-related error messages clearer to help users understand what they did wrong.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus navbar error message screenshot" src="https://docusaurus.io/zh-CN/assets/images/navbar-error-15eefab8e8d77aa4d605939956987164.jpg" width="1676" height="1614" class="img_vXGZ"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h3>
<p>We made it possible to translate some new elements:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8677" target="_blank" rel="noopener noreferrer" class="">#8677</a> introduces a new <code>process.env.DOCUSAURUS_CURRENT_LOCALE</code> (experimental) allowing you to localize your config file, including site title, tagline, announcement bar, baseUrl...</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8616" target="_blank" rel="noopener noreferrer" class="">#8616</a> allows to translate the navbar and footer logo alt text</li>
</ul>
<p>We added default theme translation support for multiple languages:</p>
<ul>
<li class="">🇭🇺 <a href="https://github.com/facebook/docusaurus/pull/8668" target="_blank" rel="noopener noreferrer" class="">#8668</a>: Hungarian</li>
<li class="">🇳🇴 <a href="https://github.com/facebook/docusaurus/pull/8631" target="_blank" rel="noopener noreferrer" class="">#8631</a>: Norwegian (Bokmål)</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>Completing theme translations is an <a href="https://github.com/facebook/docusaurus/issues/3526" target="_blank" rel="noopener noreferrer" class="">ongoing effort</a> and an easy way to contribute to Docusaurus. We add new theme features regularly, for which we often <a href="https://github.com/facebook/docusaurus/issues/3526" target="_blank" rel="noopener noreferrer" class="">need new translations</a>.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/2.4#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8674" target="_blank" rel="noopener noreferrer" class="">#8674</a>: respect <code>prefers-reduced-motion: reduce</code> media query</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8712" target="_blank" rel="noopener noreferrer" class="">#8712</a>: use a navbar item of type <code>docSidebar</code> in template</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8801" target="_blank" rel="noopener noreferrer" class="">#8801</a>: allow tabs children to be falsy</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8757" target="_blank" rel="noopener noreferrer" class="">#8757</a>: make search page react to external query-string changes</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8803" target="_blank" rel="noopener noreferrer" class="">#8803</a>: fix code block buttons position in RTL</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8615" target="_blank" rel="noopener noreferrer" class="">#8615</a>: fix color mode toggle when using dark navbar</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8699" target="_blank" rel="noopener noreferrer" class="">#8699</a>: fix navbar dropdown tab focus bug</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/2.4.0">2.4.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 2.3]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/2.3</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/2.3</guid>
            <pubDate>Fri, 27 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 2.3.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 2.3</strong>.</p>
<p>The upgrade should be easy: as explained in our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process documentation</a>, minor versions respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus 2.2 social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-7e038d19ea67c686e90e1f599f7256d0.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/2.3#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="google-tag-manager-plugin">Google Tag Manager plugin<a href="https://docusaurus.io/zh-CN/blog/releases/2.3#google-tag-manager-plugin" class="hash-link" aria-label="链接到 Google Tag Manager plugin" title="链接到 Google Tag Manager plugin" translate="no">​</a></h3>
<p>Google Tag Manager is a tag management system that allows great flexibility. It enables analytics and marketing teams to easily load other third-party trackers and fire analytics tags.</p>
<p>We now have a <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-google-tag-manager"><code>@docusaurus/plugin-google-tag-manager</code></a> package that you can use alongside or as an alternative to the existing <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-google-gtag">gtag.js plugin</a> (refer to <a href="https://support.google.com/tagmanager/answer/7582054" target="_blank" rel="noopener noreferrer" class="">this doc</a> to understand when to use which solution).</p>
<div class="theme-admonition theme-admonition-warning admonition_o5H7 alert alert--warning"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Google is sunsetting Universal Analytics</div><div class="admonitionContent_Knsx"><p><a href="https://blog.google/products/marketingplatform/analytics/prepare-for-future-with-google-analytics-4/" target="_blank" rel="noopener noreferrer" class="">Google will sunset its Universal Analytics</a> on <strong>July 1, 2023</strong>, and ask users to migrate to <strong>Google Analytics 4</strong>.</p><p>Therefore, we are also <strong>deprecating our existing <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-google-analytics"><code>@docusaurus/plugin-google-analytics</code></a></strong> package. Docusaurus users should create a new Google Analytics 4 property, and migrate to the <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-google-gtag">gtag.js plugin</a>, or the <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-google-tag-manager">Google Tag Manager plugin</a>. Refer to the <a href="https://github.com/facebook/docusaurus/issues/7221" target="_blank" rel="noopener noreferrer" class="">dedicated Docusaurus issue</a> for details and questions.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="tabs-query-string-support">Tabs Query String Support<a href="https://docusaurus.io/zh-CN/blog/releases/2.3#tabs-query-string-support" class="hash-link" aria-label="链接到 Tabs Query String Support" title="链接到 Tabs Query String Support" translate="no">​</a></h3>
<p>It is now possible to link a selected tab to a query string parameter. When a tab is selected, it will be stored in your browser URL as a <code>?qs-param=tab-value</code> search parameter.</p>
<p>This feature allows deep-linking to a specific documentation tab that will pre-selected on page load.</p>
<p>When used alongside the <code>groupId</code> prop, the query string tab value takes precedence over the <code>localStorage</code> value.</p>
<p>Make sure to check the <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/tabs#query-string">documentation</a> and the demo below to understand how it works:</p>
<!-- -->
<div class="language-tsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-tsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#116329">Tabs</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">groupId</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">current-os</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">queryString</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#116329">TabItem</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">value</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">android</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">Android</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    Android</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#116329">TabItem</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#116329">TabItem</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">value</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">ios</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">iOS</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    iOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#116329">TabItem</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#116329">Tabs</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<div class="browserWindow_my1Q"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">http://localhost:3000</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs"><div class="theme-tabs-container tabs-container tabList_Qoir"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_AQgk tabs__item--active">Android</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_AQgk">iOS</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_pnkT"><p>Android</p></div><div role="tabpanel" class="tabItem_pnkT" hidden=""><p>iOS</p></div></div></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="nested-admonitions">嵌套告示<a href="https://docusaurus.io/zh-CN/blog/releases/2.3#nested-admonitions" class="hash-link" aria-label="链接到 嵌套告示" title="链接到 嵌套告示" translate="no">​</a></h3>
<p>It is now possible to nest one admonition within another by adding extra colons for the outer/enclosing admonition:</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">::::tip[nested admonitions]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">You can now nest one admonition within another!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">:::danger</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Use this sparingly when it makes sense.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">:::</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">::::</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>nested admonitions</div><div class="admonitionContent_Knsx"><p>You can now nest one admonition within another!</p><div class="theme-admonition theme-admonition-danger admonition_o5H7 alert alert--danger"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>危险</div><div class="admonitionContent_Knsx"><p>Use this sparingly when it makes sense.</p></div></div></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="blog-createfeeditems">Blog <code>createFeedItems</code><a href="https://docusaurus.io/zh-CN/blog/releases/2.3#blog-createfeeditems" class="hash-link" aria-label="链接到 blog-createfeeditems" title="链接到 blog-createfeeditems" translate="no">​</a></h3>
<p>A new blog plugin option <a class="" href="https://docusaurus.io/zh-CN/docs/api/plugins/@docusaurus/plugin-content-blog#CreateFeedItemsFn"><code>feedOptions.createFeedItems</code></a> gives you more control over the RSS/Atom feed generation. It is now possible to transform/filter/limit feed items through a new callback.</p>
<div class="language-tsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-tsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#C6105F">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    blog</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      feedOptions</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token function-variable function" style="color:#8250DF">createFeedItems</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token keyword" style="color:#CF222E">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">params</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#D73A49">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">blogPosts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> defaultCreateFeedItems</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token spread operator" style="color:#D73A49">...</span><span class="token plain">rest</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#CF222E">return</span><span class="token plain"> </span><span class="token function" style="color:#8250DF">defaultCreateFeedItems</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#6B6B6B;font-style:italic">// keep only the 10 most recent blog posts in the feed</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            blogPosts</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> blogPosts</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#8250DF">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#D73A49">=&gt;</span><span class="token plain"> index </span><span class="token operator" style="color:#D73A49">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#005CC5">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token spread operator" style="color:#D73A49">...</span><span class="token plain">rest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/2.3#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h3>
<p>We added or completed the default theme translation support for multiple languages:</p>
<ul>
<li class="">🇸🇮 <a href="https://github.com/facebook/docusaurus/pull/8541" target="_blank" rel="noopener noreferrer" class="">#8541</a> Slovenian</li>
<li class="">🇹🇷 <a href="https://github.com/facebook/docusaurus/pull/8289" target="_blank" rel="noopener noreferrer" class="">#8289</a> Turkish</li>
<li class="">🇮🇷 <a href="https://github.com/facebook/docusaurus/pull/8406" target="_blank" rel="noopener noreferrer" class="">#8406</a> Farsi</li>
<li class="">🇵🇱 <a href="https://github.com/facebook/docusaurus/pull/8525" target="_blank" rel="noopener noreferrer" class="">#8525</a> Polish</li>
<li class="">🇨🇳 <a href="https://github.com/facebook/docusaurus/pull/8423" target="_blank" rel="noopener noreferrer" class="">#8423</a> Chinese</li>
<li class="">🇸🇪 <a href="https://github.com/facebook/docusaurus/pull/8312" target="_blank" rel="noopener noreferrer" class="">#8312</a> Swedish</li>
<li class="">🇻🇳 <a href="https://github.com/facebook/docusaurus/pull/8450" target="_blank" rel="noopener noreferrer" class="">#8450</a> Vietnamese</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>Completing theme translations is an <a href="https://github.com/facebook/docusaurus/issues/3526" target="_blank" rel="noopener noreferrer" class="">ongoing effort</a> and an easy way to contribute to Docusaurus. We add new theme features regularly, for which we often <a href="https://github.com/facebook/docusaurus/issues/3526" target="_blank" rel="noopener noreferrer" class="">need new translations</a>.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/2.3#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8463" target="_blank" rel="noopener noreferrer" class="">#8463</a> and <a href="https://github.com/facebook/docusaurus/pull/8328" target="_blank" rel="noopener noreferrer" class="">#8328</a>: fix some annoying Docusaurus layout issues</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8539" target="_blank" rel="noopener noreferrer" class="">#8539</a>: Algolia plugin <code>options.searchPagePath</code> should be correctly applied to search modal footer</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8462" target="_blank" rel="noopener noreferrer" class="">#8462</a>: Algolia plugin now makes it easier to transform displayed search results with custom logic</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8397" target="_blank" rel="noopener noreferrer" class="">#8397</a>: the <code>deploy</code> CLI now understands git url <code>insteadOf</code> config</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/2.3.0">2.3.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 2.2]]></title>
            <link>https://docusaurus.io/zh-CN/blog/releases/2.2</link>
            <guid>https://docusaurus.io/zh-CN/blog/releases/2.2</guid>
            <pubDate>Sat, 29 Oct 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 2.2.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 2.2</strong>.</p>
<p>The upgrade should be easy: as explained in our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process documentation</a>, minor versions respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus 2.2 social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-402517ac2205718a22585e627fe1351c.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/releases/2.2#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="mermaid-diagrams">Mermaid diagrams<a href="https://docusaurus.io/zh-CN/blog/releases/2.2#mermaid-diagrams" class="hash-link" aria-label="链接到 Mermaid diagrams" title="链接到 Mermaid diagrams" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/7490" target="_blank" rel="noopener noreferrer" class="">#7490</a>, we added support for Mermaid diagrams. This fills the gap between GitHub Flavored Markdown which also <a href="https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/" target="_blank" rel="noopener noreferrer" class="">added support recently</a>. You can create Mermaid diagrams using Markdown code blocks:</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token code punctuation" style="color:#393A34">```</span><span class="token code code-language">mermaid</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code code-block language-mermaid">sequenceDiagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    participant Alice</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    participant Bob</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    Alice-&gt;&gt;John: Hello John, how are you?</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    loop Health check</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">        John-&gt;&gt;John: Fight against hypochondria</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    end</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    Note right of John: Rational thoughts &lt;br/&gt;prevail!</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    John--&gt;&gt;Alice: Great!</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    John-&gt;&gt;Bob: How about you?</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">    Bob--&gt;&gt;John: Jolly good!</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code punctuation" style="color:#393A34">```</span><br></div></code></pre></div></div>
<!-- -->
<div class="browserWindow_my1Q"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">http://localhost:3000</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs"></div></div>
<p>Make sure to check the <a class="" href="https://docusaurus.io/zh-CN/docs/markdown-features/diagrams">documentation</a>, and the <a class="" href="https://docusaurus.io/zh-CN/tests/pages/diagrams">more advanced examples</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="config-headtags">Config <code>headTags</code><a href="https://docusaurus.io/zh-CN/blog/releases/2.2#config-headtags" class="hash-link" aria-label="链接到 config-headtags" title="链接到 config-headtags" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8151" target="_blank" rel="noopener noreferrer" class="">#8151</a>, we added the ability to apply arbitrary HTML <code>&lt;head&gt;</code> tags to all pages of your site.</p>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">headTags</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">tagName</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'link'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">attributes</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#005CC5">rel</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'icon'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#005CC5">href</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'/img/docusaurus.png'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="accessibility">Accessibility<a href="https://docusaurus.io/zh-CN/blog/releases/2.2#accessibility" class="hash-link" aria-label="链接到 Accessibility" title="链接到 Accessibility" translate="no">​</a></h3>
<p>We did several accessibility improvements:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8207" target="_blank" rel="noopener noreferrer" class="">#8207</a>: improves keyboard navigation for mobile drawer hamburger button</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8161" target="_blank" rel="noopener noreferrer" class="">#8161</a>: improves keyboard navigation for tabs</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8204" target="_blank" rel="noopener noreferrer" class="">#8204</a>: makes the skip to content button support progressive enhancement</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8174" target="_blank" rel="noopener noreferrer" class="">#8174</a>: improves screen reader announcement when toggling between light/dark mode</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="developer-experience">Developer Experience<a href="https://docusaurus.io/zh-CN/blog/releases/2.2#developer-experience" class="hash-link" aria-label="链接到 Developer Experience" title="链接到 Developer Experience" translate="no">​</a></h3>
<p>We made validation stricter and improved error messages:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8234" target="_blank" rel="noopener noreferrer" class="">#8234</a>: in case of doc processing failure, prints the problematic markdown file path in the error message</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8192" target="_blank" rel="noopener noreferrer" class="">#8192</a> and <a href="https://github.com/facebook/docusaurus/pull/8159" target="_blank" rel="noopener noreferrer" class="">#8159</a>: validates <code>siteConfig.url</code> more strictly and with better error message</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8066" target="_blank" rel="noopener noreferrer" class="">#8066</a>: makes config <code>url</code> and <code>baseUrl</code> fail-safe and less sensitive to the presence or absence of a leading or trailing slash</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="translations">Translations<a href="https://docusaurus.io/zh-CN/blog/releases/2.2#translations" class="hash-link" aria-label="链接到 Translations" title="链接到 Translations" translate="no">​</a></h3>
<p>We completed the default theme translation support for multiple languages:</p>
<ul>
<li class="">🇹🇷 <a href="https://github.com/facebook/docusaurus/pull/8105" target="_blank" rel="noopener noreferrer" class="">#8105</a>: completes Turkish translations</li>
<li class="">🇷🇺 <a href="https://github.com/facebook/docusaurus/pull/8253" target="_blank" rel="noopener noreferrer" class="">#8253</a>: completes Russian translations</li>
<li class="">🇫🇷 <a href="https://github.com/facebook/docusaurus/pull/8243" target="_blank" rel="noopener noreferrer" class="">#8243</a>: completes French translations</li>
<li class="">🇯🇵 <a href="https://github.com/facebook/docusaurus/pull/8075" target="_blank" rel="noopener noreferrer" class="">#8075</a>: completes Japanese translations</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>Completing theme translations is an <a href="https://github.com/facebook/docusaurus/issues/3526" target="_blank" rel="noopener noreferrer" class="">ongoing effort</a> and an easy way to contribute to Docusaurus. We add new theme features regularly, for which we often <a href="https://github.com/facebook/docusaurus/issues/3526" target="_blank" rel="noopener noreferrer" class="">need new translations</a>.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/releases/2.2#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Other notable changes include:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8210" target="_blank" rel="noopener noreferrer" class="">#8210</a>: the <code>docusaurus swizzle</code> CLI has a new <code>--config</code> option</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8109" target="_blank" rel="noopener noreferrer" class="">#8109</a>: mobile navigation performance optimizations, prefetch resources earlier</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8059" target="_blank" rel="noopener noreferrer" class="">#8059</a>: versions/locales navbar dropdowns preserve hash and querystring on navigation</li>
<li class=""><a href="https://github.com/facebook/docusaurus/pull/8227" target="_blank" rel="noopener noreferrer" class="">#8227</a>: the client redirect plugin preserves hash and querystring on redirect</li>
</ul>
<p>Check the <strong><a class="" href="https://docusaurus.io/zh-CN/changelog/2.2.0">2.2.0 changelog entry</a></strong> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 2.1]]></title>
            <link>https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1</link>
            <guid>https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1</guid>
            <pubDate>Thu, 01 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We are happy to announce Docusaurus 2.1, our very first minor version release.]]></description>
            <content:encoded><![CDATA[<p>We are happy to announce <strong>Docusaurus 2.1</strong>, our very first minor version release.</p>
<p>The upgrade should be easy: as explained in our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process documentation</a>, minor versions respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a>.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus 2.1 social card" src="https://docusaurus.io/zh-CN/assets/images/social-card-8dc2413b4f9e86328bf77575e91171d7.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="doccardlist-improvements">DocCardList improvements<a href="https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1#doccardlist-improvements" class="hash-link" aria-label="链接到 DocCardList improvements" title="链接到 DocCardList improvements" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/8008" target="_blank" rel="noopener noreferrer" class="">#8008</a>, we simplified the usage of the<code>&lt;DocCardList&gt;</code> component, that is notably used on sidebar category generated index pages.</p>
<p>The <code>items</code> prop is now optional, and will be automatically inferred from the content of the parent sidebar category:</p>
<div class="language-diff codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-diff codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token plain">import DocCardList from '@theme/DocCardList';</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49"> import {useCurrentSidebarCategory} from '@docusaurus/theme-common';</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49"> &lt;DocCardList items={useCurrentSidebarCategory().items}/&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa"> &lt;DocCardList/&gt;</span><br></div></code></pre></div></div>
<p>Also, we made it possible to use it on any document, including regular docs not linked to any sidebar category.</p>
<p><img decoding="async" loading="lazy" alt="simplified DocCardList component" src="https://docusaurus.io/zh-CN/assets/images/doc-card-list-e52d727eadceb3d21cfc0f851f09aa93.png" width="1062" height="489" class="img_vXGZ"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="noindex-improvements"><code>noindex</code> improvements<a href="https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1#noindex-improvements" class="hash-link" aria-label="链接到 noindex-improvements" title="链接到 noindex-improvements" translate="no">​</a></h3>
<p>We improved the support of the <a href="https://developers.google.com/search/docs/advanced/crawling/block-indexing" target="_blank" rel="noopener noreferrer" class=""><code>noindex</code> meta <code>robots</code> directive</a>, a way to signal search engines you don't want a specific page to be indexed.</p>
<p>In <a href="https://github.com/facebook/docusaurus/pull/7963" target="_blank" rel="noopener noreferrer" class="">#7963</a>, we allow <code>noindex</code> to be configured on a per-docs-version basis.</p>
<p>Use the following plugin options to tell crawlers you don't want the <code>1.0.0</code> version to be indexed:</p>
<div class="language-jsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-jsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> options </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">versions</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#005CC5">'1.0.0'</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">noIndex</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token boolean" style="color:#005CC5">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>In practice, Docusaurus will add the following meta to each page of that version:</p>
<div class="language-html codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-html codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">meta</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">robots</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">noindex, nofollow</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<p>In <a href="https://github.com/facebook/docusaurus/pull/7964" target="_blank" rel="noopener noreferrer" class="">#7964</a>, we also fixed a bug where the sitemap plugin would still contain pages that have a <code>noindex</code> directive. Now the sitemap plugin will reliably filter out all the pages containing <code>noindex</code> directives.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="overriding-default-meta-tags">Overriding default meta tags<a href="https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1#overriding-default-meta-tags" class="hash-link" aria-label="链接到 Overriding default meta tags" title="链接到 Overriding default meta tags" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/7952" target="_blank" rel="noopener noreferrer" class="">#7952</a>, it becomes possible to override default html meta tags you couldn't before:</p>
<div class="language-jsx codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-jsx codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">siteConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">noIndex</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">&amp;&amp;</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">meta</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">robots</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">nofollow, noindex</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">meta</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">viewport</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag attr-name" style="color:#0550AE">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#C6105F">width=device-width, initial-scale=1.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#22863A"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>It is now possible to use <code>&lt;Head&gt;</code> or <code>themeConfig.metadata</code>:</p>
<ul>
<li class="">to override the <code>viewport</code> meta</li>
<li class="">to override the <code>robots</code> meta: you could mark your site as <code>noIndex</code>, but except for specific pages that should be indexed</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="ukrainian-translations">乌克兰语翻译<a href="https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1#ukrainian-translations" class="hash-link" aria-label="链接到 乌克兰语翻译" title="链接到 乌克兰语翻译" translate="no">​</a></h3>
<p>In <a href="https://github.com/facebook/docusaurus/pull/7953" target="_blank" rel="noopener noreferrer" class="">#7953</a>, we added default classic theme translations for the Ukrainian language.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-changes">其他改变：<a href="https://docusaurus.io/zh-CN/blog/2022/09/01/docusaurus-2.1#other-changes" class="hash-link" aria-label="链接到 其他改变：" title="链接到 其他改变：" translate="no">​</a></h2>
<p>Check the <a class="" href="https://docusaurus.io/zh-CN/changelog/2.1.0">2.1.0 changelog entry</a> for an exhaustive list of changes.</p>]]></content:encoded>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 2.0 的发布]]></title>
            <link>https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0</link>
            <guid>https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0</guid>
            <pubDate>Mon, 01 Aug 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are extremely happy to finally announce Docusaurus 2.0! 🥳️]]></description>
            <content:encoded><![CDATA[<p>Today we are extremely happy to finally <strong>announce Docusaurus 2.0</strong>! 🥳️</p>
<p>At <a href="https://opensource.fb.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Meta Open Source</strong></a>, we believe Docusaurus will help you build the <strong>best documentation websites</strong> with <strong>minimal effort</strong>, letting you <strong>focus on what really matters</strong>: writing the content.</p>
<p>After <strong>4 years of work, <a href="https://github.com/facebook/docusaurus/releases/tag/v2.0.0-alpha.75" target="_blank" rel="noopener noreferrer" class="">75 alphas</a> and <a href="https://github.com/facebook/docusaurus/releases/tag/v2.0.0-beta.22" target="_blank" rel="noopener noreferrer" class="">22 betas</a></strong>, the next generation of Docusaurus is <strong>ready for prime time</strong>. From now on, we now plan to <strong>respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a></strong> and will release <strong>major versions more frequently</strong>.</p>
<p><img decoding="async" loading="lazy" alt="social-card image" src="https://docusaurus.io/zh-CN/assets/images/social-card-736cfe55fc7bba07204176852d67c0d5.png" width="1200" height="600" class="img_vXGZ"></p>
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>We are on <a href="https://www.producthunt.com/posts/docusaurus-2-0" target="_blank" rel="noopener noreferrer" class="">ProductHunt</a> and <a href="https://news.ycombinator.com/item?id=32303052" target="_blank" rel="noopener noreferrer" class="">Hacker News</a>!</div><div class="admonitionContent_Knsx"><p><strong>Now</strong> is the best time to show your love for Docusaurus!</p><div style="display:flex"><a href="https://www.producthunt.com/posts/docusaurus-2-0?utm_source=badge-featured&amp;utm_medium=badge&amp;utm_souce=badge-docusaurus-2-0" target="_blank" rel="noopener noreferrer" class="producthunt-badge-widget" style="display:block;width:250px;height:54px"><img class="producthunt-badge-widget" src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=353916&amp;theme=light" alt="Docusaurus 2.0 - Build optimized websites quickly, focus on your content. | Product Hunt" style="width:250px;height:54px;max-width:initial" width="250" height="54"></a><a href="https://news.ycombinator.com/item?id=32303052" target="_blank" rel="noopener noreferrer" style="display:block;width:54px;height:54px"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="54" height="54"><path fill="#FF6D00" d="M42 42H6V6h36v36z"></path><path fill="#FFF" d="M8 8v32h32V8H8zm30 30H10V10h28v28z"></path><path fill="#FFF" d="M23 32h2v-6l5.5-10h-2.1L24 24.1 19.6 16h-2.1L23 26z"></path></svg></a></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>搞快点？ Check <a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#whats-new-in-20" class="">what's new in Docusaurus 2.0</a>!</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="what-is-docusaurus-exactly">Docusaurus 到底是什么？ <a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#what-is-docusaurus-exactly" class="hash-link" aria-label="链接到 Docusaurus 到底是什么？ " title="链接到 Docusaurus 到底是什么？ " translate="no">​</a></h2>
<p>Docusaurus is a <strong>static site generator</strong> that helps you ship <strong>beautiful documentation websites</strong> in <strong>no time</strong>.</p>
<p>Focus on your content: just write <strong>Markdown files</strong>. Docusaurus will generate an optimized <strong>website</strong> for you that's easy to <strong>host anywhere</strong>.</p>
<p>Docusaurus is <strong>full-featured</strong> and very <strong>flexible</strong>: we ship with well-designed docs and blog layout, as well as out-of-the-box versioning, search, and internationalization functionalities, with a call to accessibility and search engine optimizations. Its flexible theming system permits to <strong>adapt the UI to match your branding</strong> so that it integrates nicely with your main website or documentation portal. Its usage of <strong>React</strong> enables a <strong>modern client-side navigation</strong>, and the ability to build an <strong>interactive documentation</strong>.</p>
<p><img decoding="async" loading="lazy" alt="Introducing Slash" src="https://docusaurus.io/zh-CN/assets/images/slash-introducing-411a16dd05086935b8e9ddae38ae9b45.svg" width="760" height="160" class="img_vXGZ"></p>
<p>The Docusaurus philosophy is akin to the <strong>Pareto principle</strong>: you can get <strong>80% of the results</strong> for <strong>20% of the effort</strong>. This enables you to compete with top-notch documentation sites with <strong>minimal effort</strong>.</p>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/rachelnabors/status/1452697991039660038" target="_blank" rel="noopener noreferrer"><p>Unless you're spinning up a documentation team with engineering resources, you
probably want Docusaurus!</p></a></blockquote><figcaption><a href="https://x.com/rachelnabors" target="_blank" rel="nofollow"><div class="avatar"><img alt="Rachel Nabors" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/rachelnabors"><div class="avatar__intro"><strong class="avatar__name"><cite>Rachel Nabors</cite></strong><small class="avatar__subtitle" itemprop="description">Former ReactJS &amp; React-Native docs manager</small></div></div></a></figcaption></figure>
<p>Docusaurus aims to be the <strong>best documentation tool</strong>, but you can use it for <strong>other use-cases</strong> as well: a blog, a knowledge base, a developer portfolio, a second brain, or even to scaffold landing pages!</p>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/johnny_reilly/status/1551861926334025728" target="_blank" rel="noopener noreferrer"><p>Using Docusaurus for my tech blog has been a fantastic choice. It looks
tremendous out-of-the-box and the awesome DX means I write way more</p></a></blockquote><figcaption><a href="https://x.com/johnny_reilly" target="_blank" rel="nofollow"><div class="avatar"><img alt="Johnny Reilly" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/johnny_reilly"><div class="avatar__intro"><strong class="avatar__name"><cite>Johnny Reilly</cite></strong><small class="avatar__subtitle" itemprop="description">Group Principal Engineer at Investec</small></div></div></a></figcaption></figure>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>Try Docusaurus now with our <a class="" href="https://docusaurus.io/zh-CN/docs/playground">online playgrounds</a> and <a href="https://tutorial.docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">5 minutes tutorial</a> ⏱️</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="the-story-behind-docusaurus">Docusaurus 背后的故事<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#the-story-behind-docusaurus" class="hash-link" aria-label="链接到 Docusaurus 背后的故事" title="链接到 Docusaurus 背后的故事" translate="no">​</a></h2>
<p>Docusaurus was created at <strong>Facebook Open Source</strong> in <strong>2017</strong> (now <a href="https://opensource.fb.com/" target="_blank" rel="noopener noreferrer" class="">Meta Open Source</a>). We had a lot of internal and open source projects to document. It's <strong>complicated enough to write good documentation</strong>, let alone to create the HTML, CSS, and JavaScript for a good-looking website. We wanted project leaders to be able to <strong>focus on the content</strong>, and <strong>Markdown</strong> is great for that.</p>
<p>At that time, our solution was to <strong>copy/paste a Jekyll template</strong> over and over again. This naturally became <strong>hard to maintain</strong>, so we created a tool to <strong>solve our own pain</strong> once for all.</p>
<p><strong><a class="" href="https://docusaurus.io/zh-CN/blog/2017/12-14-introducing-docusaurus.mdx">Docusaurus v1 was born</a>!</strong></p>
<p><img decoding="async" loading="lazy" alt="Birth of Slash" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvgAAACgCAIAAAD2Ao8HAAAbm0lEQVR42u3dCVhV553HcbtMp31m2uk807TTaTvtzDx52sk002xNpjZeRBY3UMANRRQXQBQXFFEWAREBt2B2Y6IhNXFp0hhj1GhMYtQY9Rwu62WVXS67F3BFWeZ/uYYgIAIiXO798nwen8v1Luec9z3v++M97zln2Nb6OgAAAIs0jE0AAAAIOgAAAAQdAAAAgg4AAABBBwAAgKADAABA0AEAAAQdAAAAgg4AAABBBwAAgKADAABA0AEAACDoAAAAgg4AAABBBwAAgKADAABA0AEAACDoAAAAEHQAAABBBwAAgKADAABA0AEAACDoAEAXNhrKwiq0q/Vn5N/NtZVsEAAEHQBD25baquCyr+blveWUFqxRZ7cZqc6Zlrk5sjKNTQSAoANgKImvr42oTF1Q+NdJuuiRiXPb55sObFQvv8L32GIACDoAzN366rylJYfcs+Ltkvy6CTedkXUAEHQAmOm0m8DSE7NzXxubsrxX4abDuE5kZTobEwBBB4AZTLupqw4tP++dt2tCelhvM83/bLV7cu+Ezs+7Z25hwwIg6AAYNJFVuoVFf5ucEWubOL9vIzfPnvUcNmzYPz7yL10N6szdZChjIwMg6AAYODE1BQEXP56R/byDdmGfj0y197v1mv99bXSX/7VS/wUbHABBB0C/8S860DlebDSUBelPeeW+Pi41sM+B5vcv2f/gNz96/K3xPX/L7NztlAgAgg6A+xKk/2JpyWF5EFJ2zpQwJO48V3cprCLRJ3+3S3q4jep1/yM3v103Yth3vnW3wZsujU1ZQekAIOgA6LWIylRJM1vqquMMJaYcMzv3tbl5O9tChm2id78cmeowI6fnL16QGRVYfCC+vpbCAkDQAXBvEhqeqzeYHo9OXiZhYnJGzNKSw+1P6u73cNNbvplr95YfKW+obmlp+ez6NUoNAEEHQI9SzrjUQPukhf5FByKrdO1Pbhr0cCO8MyN2lx8qa6hqafeTe/MmBQeAoAPg3uIMJQ/0sFTfzM8If6fsI31DZUtXPzeam/0/OvhcrYHiA0DQAdBt0LlUYibhRszLCN9VdvDijYqWbn/S09N/9+c/b67iruYACDoA7pJvXNLDRycvG528ZNDzzZyMsL+UfVhyo7zLWKPVanNzc9s/Ex0dHffeuxQiAIIOgK61nTE+mPlGF/aW/kDxjbJuBm8CAwPd3d3t7e23bt3a9qSdnV1qRQWFCICgA+Cuc5AnpIUOSr6ZrQtJ0H9QdF3fcq+f+vr6Z599Vh40NjZ6enrGxsbK4+vXrw8fPryxufklyhEAQQfA3QSUHOs+kYw45/nIZtv/Cnxa/PED1/vMN7N0wW/q9xdeL+0y0xgMBkdHx6eeemrevHkSZUxP7tmzJyYmxvS4qanJx8dnxowZzs7O27Ztk2f2X71KIQIg6ADoaEtdtdeFHd1fHefRlxy+/8sfDmv385DDb/582qNvU4yTL2d1P3gTFBS0Y8cOefD222+PGDGivLy8ubl53LhxOTk57V+mqqpWqzU9Tmy4QVECIOgA6GhR4f7uo8ljCeO+/f3vSLj50WM//fWCx/7N/b+/++O/l19//MzP+zCQc7Xpevuwkpyc7OnpOWfOnPz8/Nuni9+48cQTTzQ1NZl+PXPmzJNPPvnUU08FBAR0k42qGhspSgAEHQAdravOHpMS0E06+afHfyax5ldzH2175umPJn3vJz+QJx992aFXQefL2qQ70klV1R/+8IeTJ09+/vnnTz/9dEJCgqScqKiotkNUbQeqrl692v0g0JXGa1EViZsM5RQoAIIOgI5Hr3wL9nYZTZ75eIoEmu/+6HsdbkH1cNhwef4/ljzZ85Rjk+jV0HyzfTpZvnz5u+++a3p87dq1wMBAyT1+fn4Sd+45N/la042Uy9n7Kj5el7/NI32VfLh8xYrSzyhNAAQdAHeIr6/1yH6xy3Tyxw9cJdD8w8P/3Pm/Ht/lNOKcZ69GdG40NbQllTfeeMPW1ralxz/y3vQrue9VHFtfsH2WLnhk4pzOn++Z+wqlCYCgA+AOdxvOEcNPTP/W3337h7//Sb+cTK7UpZtSy82bN+Pi4mpqarpJNg3NN3VXLuyvPB5b+IaXLtS2q2TTwejkZZQmAIIOgDssKNjXTXp4Yo/zM4cm99ddxzscvWr/c7P5VtbVggNVn20o3Dk3Y82oxN7dSXRSimdMwYydtccpUAAEHQB3iKzS+eTvHoArBC7Mis6+WmBKNo3NjTnXig5Wndhc9Ob8jIhRifN6+2ljtLOCc2e8VzG18LpbS4uLOHN5FaUJgKAD4A6bDOUu6eEDdkFkt9RlU1KX22vn9+G9tursRVkeO0vd0y5PutXsYso3bSoaplGaAAg6AO4wN2+n+dy3vEue6TOfL57+pWHK1caO4aaDnZdzQqvO+Vx8K77+EiULgKADoC6w9MQora+5hRuX5Fnr8qcfqZ5a1eDafbhp75UK3zHZC+yzvOYVv7as7CCFC4CgA6Auvu7SspKjgx5uHLWzVubM2Fc+Le/apJ6Hm/ZO1k+RlGPilLOUkgVA0AFQt746zzF5yWDlm6mps7ZfdE+qn3yzybVv+aZNfaOrw9dBZ3S298zCLRQuAIIOYO1m524flIgzIdnzWM2U5maX+8w37S0qnNk2qDMtfz2FC4CgA1i7yMo0N906G3XuQKacGWkzKxpc+zHi3J6PXOneFnRmFG6kcAEQdAAYBelPDVjKGaOdVXrDreP54bfc9tS4NzTfO/1UVY3dt++P8+f/2t39Fx3+K/nqZFPKcciay4gOAIIOAKM1FUm2ib27tk2kOuOEMmV071POaHVWZaprS4Mxl9TcdDtaMyUk32NJwUyv/FkSUF6qmH6odlrncHP9uvMnnwxftephR8eHpk37xfbtjxUUOHR+2c1m1w9Tpi3WzXS5sJpiBUDQAaxcremB14UdvQor49VZlxS3FsWlSHHzVGf26r371anyxvpE18C0GfLryJTZbQebbg/GZHvVNhrHdZqbJ2q1IzdseMTZ+V+dnH4WF/eIqo6UJ7sb77np0qi6XkmcEl28nfIFQNABrNrpwncSqnPkwQbDxfl5uyakhfYwrBxSjGHF5KriGq7O6OEbfRSPpq/fWKW4zkz07JByxLis2XNPu0zz+JWDw0NBQQ8fOzb8+nXnuyWb2trxdzxTcvvDryR57azJbb+yr18qosQBgg4AK1KZurg0fWXbuI5/0YemODJd9ewmrCxVPdpSTps9yrSR6qx73sMhV5nU/l01itvcjFmds874dM+SqnHfxJeGO08jrx9/4MAzixf/p739Q76+v/nmvxpdWrTffHhtsndbuNlmKNWnB1LiAEEHgLXYUZNnCgRfFO6TX1eUfmaKI7Hq9Fuqy4uKe5dhxV6dXdJ60KqzRHXyhG4T0jbFvfO7DKqrd0bHcZ2AYs9bLV/PSja4tCS6NFZMOH16RETEb8eO/amr68+ff/7RjAy7jgM8+o4fXp2y6FVDqaxdcu6L8uubrcNXAAg6ACzfiaJ3TWngljo1oTrbt2CvZJG/KNNMTzYrLlFdHZB6W53WZcoxqVDcfO8yZWea6nlDce3yXXWq2wLdHVnHNXf29dbTr/LTHG6dm2hansMJf5Ksc+vWhK4PYzW5tCR38eFl6Sv2VGibWsOZrDLlDhB0AFiFYl1wWxrQpwe+WFuRnL6qfUS4pbqsUD3ahxUvdeatu6cck5uK6yZleuegc16d3M27Lquui3S3r/XnnD17x95nvLz+3WPKr+pPOd3xSn0Xp5ofOvR/xscVd/3wxq+/ukgXQrkDBB0Alu9Vg77pziNQV5K8OkeEa4qrz9cjNDbq7Iw7Z9h047Ayxb5dylmnTr/nW64orssT3e33jh5/yHnnm4+XFo9pSe/qlSXGU82PHRseFPSwg8ND7u6/SEh4whh0Uu+9VI3qpFcMZZQ+QNABYOEOlR7rYWQxqK4zWrPOCz0IK+1lq5Omtk5PdlI95UN68pZG+fdy61BNs0tL9l1fdnT7nzZseCQxsd2p5jU9XSpZcUofIOgAsHBJF17ueWQpU9z8VI9rimuvgo5x8o3iukL1OKJO7cW7tC4t9S4tBfd6WV5rGGo7hpXe089Pzn2R0gcIOgAsXFn6il5FlqZeRpz7eWNzD1+ZY8w6dXXjv/pY0/MPL09bRukDBB0AluzFuupGdVJLX7OL+Uh7b5TH9F+Wfjam52+RFZfVpw4ABB0AFmtfhWoBKee21F6/RVafOgAQdABYrJOF+ywn6PSe6QKJAAg6ACxTTma0NQed7KxY6gBA0AFgsS6lLLDmoGNI8aUOAAQdAJaqtrHbixRbvEZ10vP1BmoCQNABYIF21ORbc8ox2VGTR00ACDoALNB75WcJOrIRqAkAQQeABfqk5CBBRzYCNQEg6ACwQOfzdhB0zuXtoCYABB0AFigrK46gk5W9gZoAEHQAWKDCjDUEnSJdKDUBIOgAsECl6YEEHX16IDUBIOgAsECVqYsJOlWp/tQEgKADwAIZUnwJOrXJPtQEgKADwHzF11VtMZRuMRRtupS3sTozrjotrkobU3F+fcWZ9eUn1umPR+mPRJZ+GFHyfnjJvjXFb68pTAgtfD2k4NV6dSpB53LiNNkask1ky8j2ka0k20q2mGw32XqyDWVLyvaUrSrbVrawbGfZ2rLNqXgAQQfAXaJJ/SXpLKXX3FCti61U11eclm51belHkSV/Cy/ebQwiBa8F57+4Om9zUG5MYE7EiqzggMzlS3X+S3Te/mmzF6a6+yW7+SaN90m0n69q+uyGMpGgIxuhzxtQtr+UgpSFlIiUi5SOlJGUlJSXlJqUnZSglKOUppSplKyUr5SyMUJVnJZyl9JvTU6lUh/YKQCCDmBuYaV2i0G/qebChurUmMqz0WWfRpZ+GF6yL6wwIaRg26q8+NaMEr48c+XSjMVL0uf7p870S5ks/aJ3ot39pJN+1GT1KUfIRjCHspBaYcxMKZOlnkhtkTojNUfqj9QiqUtSo6ReSe2SOiY1Teqb1Dqpe1IDpR6yMwIEHaBHB4A2XSqMq05bX3EmSn8s8uIH4cXvhBZuX533vHQ2K7LDAjIDluh8jHkl2c1HO8ZMwsp9jeiojOi4yEYY6uUotVHqpDEh6XyklkpdbR1Mel5qr9RhqclSn6VWS92WGs5BNxB02AqwsEGX0o3VWbGVanTZibWlH4UX75HWX/5EDsyNMo616PwWpXr6Jbve5zGgIapenUDQkY1gbeUutV3qvNR8qf/GcaPcKNkjWlPRHtlHZE+R/UX2mtZjagwXgaADDJLnjAMwebGVWmmXIy8eWFO0Kzj/ZflDdnnW6tb44rFA6+St2lhhfOm5aoKO4lJtfUGnFwfUVBvZj2RvMkairNWyf8leJvua7HGteUgr++BzDBGBoAP0nmGzoTCuKnld2ecRF/eHFe1cnfdcYE5EQGbA4vR5C1Om+Ggd6YTun151JujIRqAm3PexM0fZK2XflD1U9lPZW2WflT1X9l/Zi2Vflj2aZg0EHViXLYaSDdWp0eVfGAdjChOC87dK+7g0Y+mitFkLkpwZiRkYhQQdxaWQoDMwI0NJzrJ3yz4ue7rs77LXG4eFyr+QdkBaA5pEEHQwFKNMaVx1WnTZiYiS90MLtwflxi3PXCl/8y1IdvFWbWn6zUGmOp6gIxuBmmAGSchWWgZpH6SVkLZCWgxpN6T1kDZEWhKaUxB0MFinKdVsrMmJqTwbVXoorGjX6vz4FdnhS3ULF6a6W+fc3iHnS3UcQUc2AjXB7GdPO0irIm2LtDDSzkhrI22OtDzS/kgrRFMMgg7u12ZDSWylNkp/dE3R26vy4ldkhSxJn++XNJH2d6j7UBlN0JGNQE0Y0qQtkhZJ2iVpnaSNkpZK2qvNHA4DQQedhmeqN1ZnRpefiih5P6Rg28qcdcYZM6nTGZuxYG+qDgQd2QjUBEs9i15aMGnHpDWTNs14LKz8lLRy0tbR4BN0YOE2XcqPqfgq4uL+kIJXV+ZELtX5+SW70Sxaoc2qHUFHNgI1weoGgZLdpN2T1k/aQGkJpT2UVpGugaCDoTgdWB9XpY3SHwkrTAi6sGFZZoD8fWM+9x/AoAtWRxJ0ZCNQE2C6C4e0kNJOSmspbaa0nNJ+SitKV0LQgbmc4hRbqay9eED+QAnMCV+cPt83iSmWuOepLprr1n1fT1l9b2oCuiVtqbSo0q5K6yptrLS0nAhG0MEDviJwbbn8nbG29KPQwu2BOZFLdD4LtE40RuAMc84tx4CRVlfaXmmBpR2W1ljaZGmZ6Z4IOuj9BOH62o01OdFln64pTDDODtb5LeBcJ/SrI6pVn3glq08dQL+ln6SJrVN/1kmLLe228ex3bhZG0EGHy9LEVaet1R8OLXgtMHvN4jQvznjCg/aKam/NQUdWnzqAB3rml7Tk0p5Lqy5tu7TwXPiHoGNVR6AqYiuViIv7V+e9sDxz5aJU9/lMisSAW2nd85FXstNhoI2U1l7afGn5pf2XXkD6AjpEgo5lMGyozpBEH1Lw6vKsVQuNsYYdHmahXLHSO17JilP6MAfSI0i/YJzsrD8sPQX3QCXoDJXToIrWl58IK3prZe5a//S5HISC2TpqrdN0jjJBB+Z6wEt6Dek7pAeRfkR6E7pUgo6ZDNikth6H2rwsw983idOgMGRsUEdZZ9DZwKUCMWROcXeSnkX6F+llpK9hyIegM0A3TIitTAwv+WtQbuyS9PkM2GBIX03nsvVdTecyV9DBUB7ykX5Heh/pg6Qn4qYWBJ1+mzscU3EuvPidwNwo/7TZ3qotOxsshhXexpyblsOC/laxlV5J+ibpoaSfYnYzQafnYzaXjGM2xXsCcyIXpXp4qzbsTrBUG63v6JWsMuUOC809NtJnSc8l/VfreM8lOnSCzjc21uSsLT24Km/LEp2PN0ejYE1Krencq1LOt4L15J5Ee+nRpF+T3k36OIKO1QWdLYbS6LIToQWvBWStYAYxrNk7ioP1BB1ZWUocVjuvWfo76fWk77POm3YNs5Zhm4sHgnJjFqV6UOkBE3/V5oZ1TEmW1fTnSDTQSvpB6Q2lT7SewR7LDDrx9bVxVclrinevyA7zS3alZgNdOq6OsYagI6tJWQOdSf8ovaT0ldJjWvBduoZZ0FTiqvUVZ0ILXw/IDPDVjqUGA/cUoI60+EEdWcEAbvsA3PMIl3as9J7Sh0pPKv0pQceMzpOKqTwbUrBtqW6hdyKnVAC9dtDSB3UOMpwD9Ho68yjpVaVvlR7WAs7hGjY0D0tpwwoTJHv6aLmgO3C/M3Us+OKBl5mdA9wf6Welt5U+V3reIXp4a8gEnQ3VuvDi3cuzVvsmjafmAf1ot+JoqUFHVo3yBfrvBK7x0gtLXyw9MkGnv04F10fpj6zMWceEYuABDlOrmhzVyfJSjqwU93wAHtxEZumdpY+Wnpqg02txVSmhRTuM02646wIwIEJU2wbLSjmyOiE0IMBA/KVkK/219NrSdxN0ur+xVHmU/uOVOdEM3gCDYq9qUQewZHUoU2AwhnmipTeXPp2g882l/MKKdi3VLWLwBhj0A1hpynjLSDmpyngOWgGDPczjL/27OVyWcHCCTlx1Wkjhdv+0OdQGwHwsVm306pC/AZaswmLOtALM59TOtDnS40u/bxVBJ7ZSCc57YVGqOwUPmKdg1fbKUD7bXBY+mOFhwCxJ7y8ZQJKApQWd+Pra9RWngy5sZPINMCRsVkfdGpopRxZbFp4SBMx/Ko+kAskGA3NhnmEP8uQp7er8ePINMORsVe1uDrVxHVlgWWzKDhhaiUdygqSFIRZ0NtbkhBZu5z7hwJC2RbFrGFInk8sCU2rAkD2q5SHJ4QHNXB7Wfxf3K1lTvHuJzocCAyzDJtXu+lAY15GF3MRYDmARJEVIlpBEYVZBx7BOfzwgK5DzwwHLE6bamvl5WLJ4YTQ+gGWRRCG5QtKFZIzBDDqbLuWFFGzzS3ajSABLHlJWbRKVceaZcmTBFnEmOWDJk3jcJGlI3hjgoGOI0h8LyFzuTfsCWI19iuMN1YwOY8nC7OOGnYC1DPDYSOqQ7NG3AZ5hvRrCCc5/hbOoAOu0Wh1pJpdOlsWQhaFEACs8S0tySG8HeHoUdGKrklbkhDMLB8B2xb5GmTBYEUe+WhaAUgCsfAaPZBJJJv0TdNaVfbY0YzGbFUAbX1WzS3GoHti4I18nX+rL9gfwNcknklL6GHTi66ojSt7zT53JdgTQxue8xu+sxv8rzZIvNctPaf76pcPFs04POuKUnnV697RD0EnNslPG75Vvl2WQJaE4AAjJKpJYJLf0NOg8V1sZVrRzQdJEth1gpcPCijFJSKRYcVKz6jNN6HFNxFFN1MeamMOamEMjOtt+dORXX4yuP9fPAzzygfKx8uFdfqnRYeNSybLJEspyytLKMsuSy/JTiIC1kdwi6UUyTHdBR9LQmuK3iTiA2QpRbcMfxFQ5xThMIkEh5FPN2qN3DTT39OYx208/d7zw5fiG8308P0veKG+XD5GP6tsymAKQrIWsi6yRrNd8cg9gTXFHkkyH0Z1hrffdvBRR8i5XxAHMbSrMWnXUTtXhuDomR3UyXaRYfu23kZvzmoDTmrDjEg40fU8VXYk9rHnj6Mj3j9ud+Nwx9dTYkjNOlV85156bcO3cxEbFRcgD+VWelP+SF8jL5MXyltjD/bwkrYzrKGvqzdEuwFpOznKTVCPZ5nbQWXvxwMKUaWwXYNAtUm1ilVHvKA6nlLFFilPnW4g3Ky4B/XT9qqWnNeuOPIhUYb5kfWWtqWaAlZBsIwknvr52GNsCGPxpMapmp+pQod5jmku+6txf3xhtZSnHRNa6JxtnrTrqA3V0juokcbMbqeq4vaojN6AAzHuq8iyCDmBGYtRRx9UxdXc5c3u/Orq/vogRnXsf7Fdt4lW7T5Wx7U+kb2i9XOE+xTGcfAMMEQQdwBwHeLYodqeVsVfvvOvCWnVUf37LA5ujY2b6YY5OhDpqj+oohbKAW98ABB0A/XYGgWrzsmqvqOMaFBeDMuFBfVE/nXVlLjjrCgBBBxhy85SjFdv7eftmdVQPLyvc5XV0jMe5zC0AHTYuFdfRAUDQAazRMnXkS6r9UXVMvuLUqEw8qI65/8/0Pa/xO3f7ysgBpzWBJzUrT2hWf64J/nRE6PERa45rwj/RRBzTRLZeYHDdx8YgEt1q/WFjLhGmE8hjWx8Led70AnmlvF7eJe+VT5DPkU+Tz5RPls+Xb5Hvkm+8fWXkc8YloYgBEHQAa7RQtTmtjG1uN7knW3HyZssAIOgAsBhbVbt81dl4LwV1QqA6kg0CgKADwOLijmK/SbVjOwAg6AAAABB0AAAACDoAAAAEHQAAAIIOAAAAQQcAAICgAwAACDoAAAAEHQAAAIIOAAAAQQcAAICgAwAAQNABAADW4v8BIMkHbXsCeUgAAAAASUVORK5CYII=" width="760" height="160" class="img_vXGZ"></p>
<p>It quickly built momentum at Facebook and in the frontend ecosystem, adopted by many popular projects such as <a href="https://prettier.io/" target="_blank" rel="noopener noreferrer" class="">Prettier</a>, <a href="https://babeljs.io/" target="_blank" rel="noopener noreferrer" class="">Babel</a>, <a href="https://archive.reactnative.dev/" target="_blank" rel="noopener noreferrer" class="">React-Native</a>, <a href="https://katex.org/docs/" target="_blank" rel="noopener noreferrer" class="">KaTeX</a>, and of course <a href="http://v1.docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">Docusaurus v1</a> itself.</p>
<div class="cssCarousel_j1gU" style="aspect-ratio:1.8356164383561644"><div class="cssCarouselSlider_sGiq" style="aspect-ratio:1.8356164383561644"><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAvklEQVR4nDXCzwvBUBwA8PcHO6yWQktIK0kcnJRc5OIosZ1wkXKRNjYchmbzY794tnnv7SsHnz6IGy6rfbnWkyqdkViXxJJULspCYcyXB6naDM23Bvac4+mk69rFNv2n6z9dx7uzOJiuTaQYNwCGo4gwBn+MJQCwUm2kGVegJMD4FYaUEEbp74cAwHm+QfrBihnx8Nt6uO4Le/gdhHFEaALgTJZIaS+UVldrNlQxqxbTmzy/zXG7DLcXeDOV/gIPyZWv09LiSwAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="355"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/prettier.0987194.640.png srcset="/zh-CN/assets/ideal-img/prettier.0987194.640.png 640w,/zh-CN/assets/ideal-img/prettier.ac62bde.1030.png 1030w" alt=Prettier width=640 height=355 /></noscript></div><a href="https://prettier.io/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Prettier</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxUlEQVR4nAG6AEX/AHW3yo+qtZWouZOjuZCTupGGu4yEuoKCt3yHsnCOwQDI2OD07urj4uHc29ns6+fy8+3y8+3s7Oj18enC0+UA1ODq/vz78vP06+vu8PDz9PT38/P39/f5////0dbpANjf6f/9/Pj28fDs4PXy6P767/757v359P///+TH1wDb3ej4/Pv1+PPw8eb1+O31+Oz1+ez4+/b+///vwMwA1p7J1Zuk2JSQ1oZ71IB01Htx1nhv23lw3Xxy5m11yK+UrA2JDh4AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="355"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/babel.cbc364a.640.png srcset="/zh-CN/assets/ideal-img/babel.cbc364a.640.png 640w,/zh-CN/assets/ideal-img/babel.3669cfa.1030.png 1030w" alt=Babel width=640 height=355 /></noscript></div><a href="https://babeljs.io/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Babel</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxUlEQVR4nAG6AEX/AGisw32brIaZrYCSqn2EroB1rX52r5eYzoGMumSBtwC8ztfm4uHZ2dnLy8rP0c/i49/q6+f4+fX/+/S7zN8Az9zl+/n38vP04uTm6enq7O3u7Ovt9vb3////0NXpANDY4vXz8vHx8efm5+zr6vPy8vTz8vv4+f///+PG1wDY2+b3+/ni6OnO1djY3d/d4uTb4OPu8fL////uwMwA1p7J1pylzYiFvW5iu2dcu2NZulxUz2tk33505mx04r2PDpDiiAMAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="355"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/react-native.e8025ec.640.png srcset="/zh-CN/assets/ideal-img/react-native.e8025ec.640.png 640w,/zh-CN/assets/ideal-img/react-native.8cebf9a.1030.png 1030w" alt=React-Native width=640 height=355 /></noscript></div><a href="https://archive.reactnative.dev/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->React-Native</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAv0lEQVR4nAXB3wrBUBwA4PPAaiHSduOGG4UiV0rIC3gCNwqToraz5d8K46zNzraznbMxP9+HqqrV3eiDldFfmp252Z4arQluTLA83UnjA1pfbJFxQv2n51LOaMbiXPgiiri/wARplgP5N04S50VCSlkY8ThJRQYAe40gwyIAOWPMth9vzw0CGoZBygUA3FYYna4kB6Asvr8c4r1dGkQiFZ/vD8BfbBEeqfpwZva6elPW6mVNKeKadKxJZ6VkFyp/r/+XglW08JQAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="355"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/katex.2b3ecc9.640.png srcset="/zh-CN/assets/ideal-img/katex.2b3ecc9.640.png 640w,/zh-CN/assets/ideal-img/katex.91ac937.1030.png 1030w" alt=Katex width=640 height=355 /></noscript></div><a href="https://katex.org/docs/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Katex</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwUlEQVR4nBXJPQuCQBgA4PvBQWE4CEFBSwQhRG1KU1M/oYYCzaCGCLIPjb4uQ++6pNOztHqjZ32QPFk0LbM1MtW+0eiZDX1c18ZV3VD0QV63kLU7xSL0yPnkbRn3aHQJxZVGPhdkaF/Q8kgAIIkfd4pf4p4m4Tfjn3cKAPOlj1zM/p1wEhzYDYcMC+5/MwEA2Fqhw/nf4skD4gTUpbd9FOPsHX0A2HCGVp2prXU3bXVdU+yKtC5LTqngKnm3VPRy8g+/UpX4n6rSEgAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="355"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/docusaurus.2ad1782.640.png srcset="/zh-CN/assets/ideal-img/docusaurus.2ad1782.640.png 640w,/zh-CN/assets/ideal-img/docusaurus.ba4280f.1030.png 1030w" alt=Docusaurus width=640 height=355 /></noscript></div><a href="https://v1.docusaurus.io/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Docusaurus</a></div></div><button class="navButton_TmqB navButtonPrev_H9Ah" type="button">&lt;</button><button class="navButton_TmqB navButtonNext_yXWb" type="button">&gt;</button></div></div>
<br>
<div class="theme-admonition theme-admonition-note admonition_o5H7 alert alert--secondary"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>备注</div><div class="admonitionContent_Knsx"><p>Notice that the sample sites above use different colors, but still look quite the same.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="toward-docusaurus-20">迈向 Docusaurus 2.0<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#toward-docusaurus-20" class="hash-link" aria-label="链接到 迈向 Docusaurus 2.0" title="链接到 迈向 Docusaurus 2.0" translate="no">​</a></h2>
<p><a href="http://v1.docusaurus.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Docusaurus v1</strong></a> has been very successful, but we started to <strong>question some architectural choices</strong>:</p>
<ul>
<li class="">React was only used as a <strong>server-side templating language</strong>, and not used on the client</li>
<li class=""><strong>Theming system was pretty limited</strong>, and apart from changing a few colors with CSS, it was difficult to do more advanced customizations</li>
<li class="">The <strong>docs versioning system was confusing</strong>, since it was based on a diff algorithm</li>
<li class="">The codebase was <strong>monolithic</strong>, neither well-tested nor easy to extend</li>
</ul>
<p><a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Docusaurus v2</strong></a> was <strong>rebuilt</strong> from the ground up with a new <strong>modular architecture</strong>:</p>
<ul>
<li class="">React is now also used on the client, enabling a <strong>modern Single Page Application navigation</strong></li>
<li class=""><strong>Plugins</strong> empower the community to contribute useful features as third-party packages</li>
<li class=""><strong>Theming</strong> is more <strong>flexible</strong> than ever</li>
<li class="">Docs versioning is now based on snapshot copies, much easier to understand</li>
<li class="">We kept <strong>everything good from v1</strong>: docs, blog, pages, versioning, i18n...</li>
<li class="">We implemented <strong>several new features</strong></li>
</ul>
<p>More details in the <a class="" href="https://docusaurus.io/zh-CN/blog/2018/09-11-Towards-Docusaurus-2.mdx">Docusaurus 2 project announcement</a> and <a href="https://docusaurus.io/docs/migration" target="_blank" rel="noopener noreferrer" class="">v1 to v2 migration guide</a></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="who-uses-docusaurus-20">Who uses Docusaurus 2.0? <a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#who-uses-docusaurus-20" class="hash-link" aria-label="链接到 Who uses Docusaurus 2.0? " title="链接到 Who uses Docusaurus 2.0? " translate="no">​</a></h2>
<p>Despite being in pre-release, it didn't take long for <strong>Docusaurus v2 to outgrow Docusaurus v1</strong> in terms of NPM downloads:</p>
<p><a href="https://npmtrends.com/docusaurus-vs-@docusaurus/core" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="NPM downloads: v2 outgrows v1" src="https://docusaurus.io/zh-CN/assets/images/npm-downloads-f9d754a81ff372a5bae83c8751195e2b.png" width="1200" height="645" class="img_vXGZ"></a></p>
<p>Our GitHub star trend is very positive, competing with major frameworks:</p>
<p><a href="https://star-history.com/#facebook/docusaurus&amp;vercel/next.js&amp;gatsbyjs/gatsby&amp;hexojs/hexo&amp;nuxt/nuxt.js&amp;vuejs/vuepress&amp;11ty/eleventy&amp;gohugoio/hugo&amp;remix-run/remix&amp;mkdocs/mkdocs&amp;Timeline" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="GitHub stars: Docusaurus is well-positioned" src="https://docusaurus.io/zh-CN/assets/images/star-history-72ae014f60d05445753e9f690e41d347.png" width="1200" height="759" class="img_vXGZ"></a></p>
<p>Today, Docusaurus v2 has already been a great success even before its launch:</p>
<ul>
<li class="">We received so many <a href="https://x.com/sebastienlorber/timelines/1392048416872706049" target="_blank" rel="noopener noreferrer" class="">lovely testimonials</a></li>
<li class="">Companies like <a href="https://blog.1password.com/docusaurus-documentation-framework/" target="_blank" rel="noopener noreferrer" class="">1Password</a> and <a href="https://www.courier.com/blog/how-we-built-our-documentation/" target="_blank" rel="noopener noreferrer" class="">Courier</a> are writing down their positive experience</li>
<li class="">Our <a class="" href="https://docusaurus.io/zh-CN/showcase">site showcase</a> references hundreds of sites, and this is only the tip of the iceberg.</li>
</ul>
<div class="cssCarousel_j1gU" style="aspect-ratio:1.7989949748743719"><div class="cssCarouselSlider_sGiq" style="aspect-ratio:1.7989949748743719"><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFucsWV/jXCCk2h4kGBljmFXjl9Yk1tbkVBbiFV0qgBFWWMTEhIYGxwuLyQ4ODM0NzMuKhoxNjczNDI5SFcAQ1lmSkM2UUxELTk4S0pKR0hLPzcnQEpYPUpbR0dSAEhWY0ZEOE1HPh4fJTc4PDQ0NyIkKSomIyYmG1w9SwBNUl0PHB4YIicaHyEwNjg0Oz0YHiAkKCcaJyFbLTkAtXypqGt0rWZirVxPpVBDqE1CrExCrUlAqEc+xUlStsQ1Jd2lGVkAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/tauri.7d284be.640.png srcset="/zh-CN/assets/ideal-img/tauri.7d284be.640.png 640w,/zh-CN/assets/ideal-img/tauri.4852075.1030.png 1030w" alt=Tauri width=640 height=356 /></noscript></div><a href="https://tauri.app/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Tauri</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AHCswX+aqIearISVrH6Cq4F3rn93r3V1rG54pmeFuQDC09zu6ebp5+fl5OTo6OXu7+rx8ezr7Ojz7+e8zuEA0d7o///++fn65+fo9fX1+Pj5+Pj5/Pz9////0NToANXd5/z6+Pf39+Xk4+Ph5ePi5urp6vv5+f///+PF1QDe4ez////z+Pnf4+rg5O7m6/Hr8fP5/Pz9///uvssA157K1pqk2ZOO1YN50nxz1Xtw2Hdu3Hdv3Hpw52pyiw2SNplStDwAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/figma.e023b25.640.png srcset="/zh-CN/assets/ideal-img/figma.e023b25.640.png 640w,/zh-CN/assets/ideal-img/figma.4b79b06.1030.png 1030w" alt=Figma width=640 height=356 /></noscript></div><a href="https://www.figma.com/plugin-docs/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Figma</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AHGztIijj5GjlYydlIqNkYqAk4Z9lYCAlnJ9iGiGpQDQ2Er96gDz5wP26QDv5RHw5xD47QD26wP/7wDAykgAr7dRwbcEvrcSwLYLvLMWurQWv7gQv7cQxLsFpqZLAD9IY19YEVtVGxUiNy0oMDQ0LTA+PxwZIhkeI1E0SgBITFs2OB44OiggLC8mLSovLSwoLSskKSwbKytaLDkAuH2ppGl3q2ZlrlxPqlRJqE9Fq0pDsk1ErkxDx0pT21lMrI2uNt0AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/snapchat.5f28663.640.png srcset="/zh-CN/assets/ideal-img/snapchat.5f28663.640.png 640w,/zh-CN/assets/ideal-img/snapchat.39e00a7.1030.png 1030w" alt=Snapchat width=640 height=356 /></noscript></div><a href="https://docs.snap.com/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Snapchat</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFOYtVZ2j111kl1zlFpilVtVl09LjkhLjEJSi05uqgA0TWYSGC8lLkQTGzELFy0IFCknOEsoOk4FDSAmQmUAO1BoGyU7NURYHTJIEh83DBQsZJGpbJeuBQ8lSUZpAEBPZwYRJw8qPRVDUwwWLR4sQUpvkUhoihAhNFQxUQA7Rl8ABx0DESgADSUCEigNHjQRJkIVJ0MAGCxJITwAs3uqnWNypmNjpFZOpVJKo0xFoUI8pEE8oUJAxEhVk18yaV+3uG0AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/iota.95754da.640.png srcset="/zh-CN/assets/ideal-img/iota.95754da.640.png 640w,/zh-CN/assets/ideal-img/iota.117672c.1030.png 1030w" alt=Iota width=640 height=356 /></noscript></div><a href="https://wiki.iota.org/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Iota</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJjT3Mzc1NLa1tDW2M7F186318i12MG217q50Zas1ADUrU3/pgD8pwv+rBD/uC//uTD/rxH9rQ3/rQDHokwA2bRi/7Ie/bkx/7Yq9rxT9rtS/7Yt/bUx/7QezqJbANzk7P///8XHyN7g4f//+f///dLPyNzZz////+PF1ADf4+7////N2NzW5Ob7///5/v/U3dTV2sr6///uvssA153K0JWe15CK14R2035y1Hlu1HRs1nJr13Vr52pyn7CEdE5qo0kAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/sap-cloud.f57d7fa.640.png srcset="/zh-CN/assets/ideal-img/sap-cloud.f57d7fa.640.png 640w,/zh-CN/assets/ideal-img/sap-cloud.312bf29.1030.png 1030w" alt="SAP Cloud" width=640 height=356 /></noscript></div><a href="https://sap.github.io/cloud-sdk/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->SAP Cloud</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFibsGF8iWx/kGd4jmFljWFWjFxUjFhYjU5ZhVRypgBGWGAXEg4jIiEnJiQcHBgZGhUaGhUcHRkZFQ0yRFcAUV5nHx0cKiorLS0tKSkqJyYoKSgpKCgqHx4cPkNXAFdfaB8dGywsLDIxMS0rKyknJzEvLzAuLyMmI1Y4SABVWWMTFxUiJicnLC0hJicdIiMlKywkKCkTISBbLTkAuX+so2dxqmVgqllMp1FFp01Cqkk/rEc+qEY9xkpSZqAv5L+d0r8AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/supabase.e96fd5f.640.png srcset="/zh-CN/assets/ideal-img/supabase.e96fd5f.640.png 640w,/zh-CN/assets/ideal-img/supabase.f37ca60.1030.png 1030w" alt=Supabase width=640 height=356 /></noscript></div><a href="https://supabase.com/docs" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Supabase</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AGmswn6ZqIibrISUq4CDrH90qntyqXNzqGl1omaEuADK2+Tx6+ns6unv7evr6+j4+fT5+vXz8/D//fW+z+IA2ebv/v37+Pr79v7/8vX3ysrMv8DDur3B0tbXzdLmAN3m7////fj5+ff//9bv9SEmKwUIDgYNFR0sM9W5yQDLz9nd4uDZ3d7a4ePE1txxen5kbHBka29oeXnRpLEAv4azsHR/uHJuuGdbuGFUwWdbxGNaxmFZw2JY0FRd0wl8G5D7uNgAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/stackblitz.3a585ac.640.png srcset="/zh-CN/assets/ideal-img/stackblitz.3a585ac.640.png 640w,/zh-CN/assets/ideal-img/stackblitz.786829d.1030.png 1030w" alt=StackBlitz width=640 height=356 /></noscript></div><a href="https://developer.stackblitz.com/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->StackBlitz</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AIzU7rnd78Te8cHa8b7I87+69ri19ayx8qCy7oao5wCd1eWz3eO94OTI5eXM6/K43/+bw/6Bqfxji/xTgOoAt93q1/b53PX65fr83/T7zuT8vdT8rMT6nrj/hpzmAN3k7vTw8PLw8Pv6+vHv8P/+/Pn29fXw7P///uTH1gDe4ezx9/bx9vj2+/zw9vj3/f7x9/nq7/Pz///pu8kA153J0JWf1pCN2IZ60ntv1ntw13dt1G9n13Vr52pzffeTuLcnN78AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/lacework.dfc8aa5.640.png srcset="/zh-CN/assets/ideal-img/lacework.dfc8aa5.640.png 640w,/zh-CN/assets/ideal-img/lacework.33303f9.1030.png 1030w" alt=Lacework width=640 height=356 /></noscript></div><a href="https://docs.lacework.com/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Lacework</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJna8c3n9tLl99Hh+c3Q+czC+cjA+L+/9bfC8JWz6QDN3u728Pjw7/j29Pz19fv09fr29/zz8/n69vjC1O4Aydfr3dzu2Nrp19fkzc7gzs/g29znxMXitbbevsTiAMzU6c/O7NHR5+Xk7c/O3aWkt+bl7bOy2Kyx29W30wDKzujQ1fHR1vHb4PXZ3/LT1+za4PXP1O/R4Pnaq8gA0pjHz5Oi1I6P1YR71H901Xtz1HNv1XFu1HNv4mVyADiS2eC63VAAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/react-navigation.1b40364.640.png srcset="/zh-CN/assets/ideal-img/react-navigation.1b40364.640.png 640w,/zh-CN/assets/ideal-img/react-navigation.a6b28c6.1030.png 1030w" alt=React-Navigation width=640 height=356 /></noscript></div><a href="https://reactnavigation.org/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->React-Navigation</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJfa783n9dXo+c/g9szP98zB98i/98C+9LfC7pa06QDS5e3+/Pj7+/r8/Pr2+vX7/vr8/fr2+/b///vH2e4A1eLs9Pb08fT09PX26/Dw9vb38vL06/Dx/f38zNHlAN3l7v////z+/v7+//3+/v////7//v39/f///+PG1wCcoKuWmZiVmZqWm5yXm5yVmZqWm5yWmZuRnp2qfIgAsXejmF1noFlUolBDnkk8nUM4oUA3oj41njwywENMFZ6NFBzee74AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/solana.8bcac78.640.png srcset="/zh-CN/assets/ideal-img/solana.8bcac78.640.png 640w,/zh-CN/assets/ideal-img/solana.e7c1e4f.1030.png 1030w" alt=Solana width=640 height=356 /></noscript></div><a href="https://docs.solana.com/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Solana</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJG2zL6ls8OmuMGiubuLs7x9tLd7s7F+taR/rIeGugDU3eb/8/D97+7/8e/97en45N/76eX57On/6+PBx9oA0N/o8fPz7fDy7fDx8fT1/P7++fT189/i////ztLmANHY4u/r6vDu7+/t7fXz8//+/vrt7vXY2v///+PE1QDg4+7////9/v7+///8/v729/j3+/v2+fr4///ru8gA153J1pqj25SQ2ol82IF12X5z2npw3Hdu3Hpw52py1S6WZvfndWMAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/gulp.645374a.640.png srcset="/zh-CN/assets/ideal-img/gulp.645374a.640.png 640w,/zh-CN/assets/ideal-img/gulp.f298c97.1030.png 1030w" alt=Gulp width=640 height=356 /></noscript></div><a href="https://gulpjs.com/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Gulp</a></div></div><button class="navButton_TmqB navButtonPrev_H9Ah" type="button">&lt;</button><button class="navButton_TmqB navButtonNext_yXWb" type="button">&gt;</button></div></div>
<br>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>Please add your site to our <a class="" href="https://docusaurus.io/zh-CN/showcase">site showcase</a>! It only takes a few seconds: just <a href="https://github.com/facebook/docusaurus/discussions/7826" target="_blank" rel="noopener noreferrer" class="">post a comment here</a>.</p></div></div>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/maxlynch/status/1549415692704825346" target="_blank" rel="noopener noreferrer"><p>We use Docusaurus everywhere now and love it</p></a></blockquote><figcaption><a href="https://x.com/maxlynch" target="_blank" rel="nofollow"><div class="avatar"><img alt="Max Lynch" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/maxlynch"><div class="avatar__intro"><strong class="avatar__name"><cite>Max Lynch</cite></strong><small class="avatar__subtitle" itemprop="description">Ionic co-founder and CEO</small></div></div></a></figcaption></figure>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/supabase/status/1328960757149671425" target="_blank" rel="noopener noreferrer"><p>We've been using V2 since January and it has been great</p></a></blockquote><figcaption><a href="https://x.com/supabase" target="_blank" rel="nofollow"><div class="avatar"><img alt="Supabase" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/supabase"><div class="avatar__intro"><strong class="avatar__name"><cite>Supabase</cite></strong><small class="avatar__subtitle" itemprop="description">Open Source Firebase alternative</small></div></div></a></figcaption></figure>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/gabrielcsapo/status/1415061312917233665" target="_blank" rel="noopener noreferrer"><p>Docusaurus is next level easy for literally everything you would need for
documentation in your project.</p></a></blockquote><figcaption><a href="https://x.com/gabrielcsapo" target="_blank" rel="nofollow"><div class="avatar"><img alt="Gabriel Csapo" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/gabrielcsapo"><div class="avatar__intro"><strong class="avatar__name"><cite>Gabriel Csapo</cite></strong><small class="avatar__subtitle" itemprop="description">Staff Software Engineer at LinkedIn</small></div></div></a></figcaption></figure>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/ItWasMattGregg/status/1526682295075102721" target="_blank" rel="noopener noreferrer"><p>Docusaurus is awesome. We use it</p></a></blockquote><figcaption><a href="https://x.com/ItWasMattGregg" target="_blank" rel="nofollow"><div class="avatar"><img alt="Matt Gregg" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/ItWasMattGregg"><div class="avatar__intro"><strong class="avatar__name"><cite>Matt Gregg</cite></strong><small class="avatar__subtitle" itemprop="description">Senior Front End Developer at Shopify</small></div></div></a></figcaption></figure>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="whats-new-in-20">What's New in 2.0? <a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#whats-new-in-20" class="hash-link" aria-label="链接到 What's New in 2.0? " title="链接到 What's New in 2.0? " translate="no">​</a></h2>
<p>It would be difficult to describe every single new feature coming with Docusaurus v2. Let's focus on the features we believe are the <strong>most impactful</strong>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="mdx">MDX<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#mdx" class="hash-link" aria-label="链接到 MDX" title="链接到 MDX" translate="no">​</a></h3>
<p><a href="https://github.com/mdx-js/mdx" target="_blank" rel="noopener noreferrer" class="">MDX</a> allows you to <strong>interleave React components</strong> in Markdown. This enables you to build top-notch <strong>interactive documentation experiences</strong> very easily.</p>
<p>A demo is worth a thousand words:</p>
<div class="language-md codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docs/my-document.mdx</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-md codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34;font-weight:bold">###</span><span class="token title important" style="color:#0550AE;font-weight:bold"> Give it a try: press that button!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">import ColorModeToggle from '@theme/ColorModeToggle';</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#22863A">ColorModeToggle</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<div class="browserWindow_my1Q"><div class="browserWindowHeader_jXSR"><div class="buttons_uHc7"><span class="dot_giz1" style="background:#f25f58"></span><span class="dot_giz1" style="background:#fbbe3c"></span><span class="dot_giz1" style="background:#58cb42"></span></div><div class="browserWindowAddressBar_Pd8y text--truncate">http://localhost:3000</div><div class="browserWindowMenuIcon_Vhuh"><div><span class="bar_rrRL"></span><span class="bar_rrRL"></span><span class="bar_rrRL"></span></div></div></div><div class="browserWindowBody_Idgs"><h3>Give it a try: press that button!</h3><div class="toggle_bT41"><button class="clean-btn toggleButton_x9TT toggleButtonDisabled_Dj8q" type="button" disabled="" title="系统模式" aria-label="切换浅色/暗黑模式（当前为系统模式）"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_nCQi lightToggleIcon_dnYY"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_nCQi darkToggleIcon_OBbf"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_nCQi systemToggleIcon_IWwm"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_Knsx"><p>MDX has its own <a href="https://mdxjs.com/docs/extending-mdx/" target="_blank" rel="noopener noreferrer" class="">plugin system</a>. You to customize your Markdown authoring experience, and even create your own Markdown syntax.</p></div></div>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/HamelHusain/status/1551962275250053123" target="_blank" rel="noopener noreferrer"><p>Docusaurus + MDX is great: we were able to implement a beautiful two-pane
layout and give the author fine-grained control on the placement of code and
corresponding prose.</p></a></blockquote><figcaption><a href="https://x.com/HamelHusain" target="_blank" rel="nofollow"><div class="avatar"><img alt="Hamel Husain" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/HamelHusain"><div class="avatar__intro"><strong class="avatar__name"><cite>Hamel Husain</cite></strong><small class="avatar__subtitle" itemprop="description">Head Of Data Science at Outerbounds</small></div></div></a></figcaption></figure>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="file-system-conventions">File system conventions<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#file-system-conventions" class="hash-link" aria-label="链接到 File system conventions" title="链接到 File system conventions" translate="no">​</a></h3>
<p>Our goal is to make Docusaurus very <strong>intuitive</strong> to use. We added file system conventions, and adding a doc page is as easy as creating one Markdown file.</p>
<!-- --><article class="yt-lite " data-title="Explain Like I'm 5: Docusaurus" style="background-image:url(https://i.ytimg.com/vi_webp/T3S8GyFIXjo/maxresdefault.webp);--aspect-ratio:56.25%"><button type="button" class="lty-playbtn" aria-label="Watch Explain Like I'm 5: Docusaurus"></button></article>
<br>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/paularmstrong/status/1552005085168865281" target="_blank" rel="noopener noreferrer"><p>Using the auto-generated sidebars makes it so simple to just create a page and
not worry about any other configuration.</p></a></blockquote><figcaption><a href="https://x.com/paularmstrong" target="_blank" rel="nofollow"><div class="avatar"><img alt="Paul Armstrong" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/paularmstrong"><div class="avatar__intro"><strong class="avatar__name"><cite>Paul Armstrong</cite></strong><small class="avatar__subtitle" itemprop="description">Principal Engineer at Microsoft</small></div></div></a></figcaption></figure>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="plugins">插件<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#plugins" class="hash-link" aria-label="链接到 插件" title="链接到 插件" translate="no">​</a></h3>
<p>Docusaurus now has a <strong>modular architecture</strong> with a plugin system — our <strong>core features</strong> like docs, blog, pages, and search are all powered by individual plugins.</p>
<p>More importantly, it enables our community to <strong>enhance Docusaurus</strong> with additional features.</p>
<p>Let's highlight some examples:</p>
<ul>
<li class=""><a href="https://github.com/rohit-gohri/redocusaurus" target="_blank" rel="noopener noreferrer" class="">redocusaurus</a>: seamless integration with <a href="https://www.openapis.org/" target="_blank" rel="noopener noreferrer" class="">OpenAPI</a> and <a href="https://github.com/Redocly/redoc" target="_blank" rel="noopener noreferrer" class="">Redoc</a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="redocusaurus plugin example" src="https://docusaurus.io/zh-CN/assets/images/redocusaurus-5cf08a76be6f85090544417b82986cfb.png" width="1200" height="667" class="img_vXGZ"></p>
<ul>
<li class=""><a href="https://www.npmjs.com/package/docusaurus-preset-shiki-twoslash" target="_blank" rel="noopener noreferrer" class="">docusaurus-preset-shiki-twoslash</a>: use <a href="https://github.com/shikijs/shiki" target="_blank" rel="noopener noreferrer" class="">Shiki</a> code block syntax highlighting with <a href="https://shikijs.github.io/twoslash/" target="_blank" rel="noopener noreferrer" class="">TwoSlash</a> TypeScript compiler hints</li>
</ul>
<p><img decoding="async" loading="lazy" alt="shiki-twoslash plugin example" src="https://docusaurus.io/zh-CN/assets/images/shiki-twoslash-b74271684fa819a0175595409b2f323b.png" width="1200" height="667" class="img_vXGZ"></p>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/orta" target="_blank" rel="noopener noreferrer"><p>The plugin API was a breeze to use, and powerful enough that I could port the
code sample renderer from the TypeScript website site in a couple of hours.</p></a></blockquote><figcaption><a href="https://x.com/orta" target="_blank" rel="nofollow"><div class="avatar"><img alt="Orta Therox" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/orta"><div class="avatar__intro"><strong class="avatar__name"><cite>Orta Therox</cite></strong><small class="avatar__subtitle" itemprop="description">Former TypeScript core team at Microsoft</small></div></div></a></figcaption></figure>
<ul>
<li class=""><a href="https://github.com/easyops-cn/docusaurus-search-local" target="_blank" rel="noopener noreferrer" class="">docusaurus-search-local</a>: one of the various local search alternatives to the built-in Algolia plugin</li>
</ul>
<p><img decoding="async" loading="lazy" alt="local search plugin example" src="https://docusaurus.io/zh-CN/assets/images/search-848f1f1b9eb0d1b710e1d1dec50fb84a.png" width="1200" height="627" class="img_vXGZ"></p>
<div class="theme-admonition theme-admonition-tip admonition_o5H7 alert alert--success"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_Knsx"><p>We have a curated list of outstanding plugins in our <a class="" href="https://docusaurus.io/zh-CN/community/resources">community resources</a> page.</p></div></div>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/jodyheavener/status/1551974535452311552" target="_blank" rel="noopener noreferrer"><p>The plugin system in Docusaurus v2 has made expanding 1Password's developer
portal so easy and fun. Super excited to show you what we've got cooking up.</p></a></blockquote><figcaption><a href="https://x.com/jodyheavener" target="_blank" rel="nofollow"><div class="avatar"><img alt="Jody Heavener" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/jodyheavener"><div class="avatar__intro"><strong class="avatar__name"><cite>Jody Heavener</cite></strong><small class="avatar__subtitle" itemprop="description">Senior Developer at 1Password</small></div></div></a></figcaption></figure>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="theming">高亮主题<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#theming" class="hash-link" aria-label="链接到 高亮主题" title="链接到 高亮主题" translate="no">​</a></h3>
<p>Theming is one of the most important features of Docusaurus: we believe a professional documentation site should <strong>respect your company's branding</strong> and create a consistent experience.</p>
<p>Docusaurus theming gives a lot of <strong>flexibility</strong> on multiple levels:</p>
<ul>
<li class="">Customize CSS variables to adjust colors, fonts, and more</li>
<li class="">Provide your own CSS stylesheets</li>
<li class="">Implement your own theme from scratch</li>
<li class=""><strong>Override any React component</strong> provided by our default theme: we call this <a href="https://docusaurus.io/docs/swizzling" target="_blank" rel="noopener noreferrer" class="">swizzling</a></li>
</ul>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/hung_dev/status/1546918275065741312" target="_blank" rel="noopener noreferrer"><p>I love Docusaurus Swizzling feature. It’s opinionated and flexible at the same
time. This is super cool since a framework usually needs to sacrifice one for
the other.</p></a></blockquote><figcaption><a href="https://x.com/hung_dev" target="_blank" rel="nofollow"><div class="avatar"><img alt="
Hung Viet Nguyen" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/hung_dev"><div class="avatar__intro"><strong class="avatar__name"><cite>
Hung Viet Nguyen</cite></strong><small class="avatar__subtitle" itemprop="description">Creator of JestPreview</small></div></div></a></figcaption></figure>
<p>This enables users willing to invest a bit more time on <strong>customizations</strong> to build sites that <strong>look different</strong> from others.</p>
<div class="cssCarousel_j1gU" style="aspect-ratio:1.7989949748743719"><div class="cssCarouselSlider_sGiq" style="aspect-ratio:1.7989949748743719"><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AJbY7s3o99Xo+tPk+8DK/MbA+ci/98HB98DM+Ji26gDK3ej//Pzy8vLs6+rn6u74+vn////x8u/w7OXE1uoA0d7p////7u/w4uPm6Ojq7e7z8/T309PW19fWub7UANTd6P/+/vj4+Pj4+fr6/Pr7/fb3+tve5/3//tCzxADZ3en8///0+Pn1+vv2+/v2+/vz+fvO2ef3///crLoA1ZzJ1Zqj2ZSP2ol814F12H1z2Hhv1HFq23lw42ZvKQ2aZPs/3GIAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/ionic.7f10b53.640.png srcset="/zh-CN/assets/ideal-img/ionic.7f10b53.640.png 640w,/zh-CN/assets/ideal-img/ionic.cd19b49.1030.png 1030w" alt=Ionic width=640 height=356 /></noscript></div><a href="https://ionicframework.com/docs/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Ionic</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAwklEQVR4nAXBPWvCQBgA4Pu7UhQsUh2Kk2sXF8Ghkz/BqdqCIBkUbf1Ag5GKaFsjyZ2X+3ovd+bt85BuxD9jszip6T6bzPVsBMFQfLzzt/Gt0/8jy3OCWFCasvSaZdR7i17fnUSEIIzJ4vvi81xIBZAbcNY6kMIIgd5MZ0eyin6cBSU1ZTJOtFRWcXZLWYH5cfRFosO1QJQGuJBCG3COZYIybhGTQUDC18mm2wvbL5vW07pZ3T5Xw3p5V3vYNSq/pcd/0kecLyndd98AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/outerbounds.7fa8be7.640.png srcset="/zh-CN/assets/ideal-img/outerbounds.7fa8be7.640.png 640w,/zh-CN/assets/ideal-img/outerbounds.17abaf6.1030.png 1030w" alt=Outerbounds width=640 height=356 /></noscript></div><a href="https://outerbounds.com/docs/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Outerbounds</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AIyt27SXz7ud17eW2bGD269z3qhv3p5x3ZJw2X1+2gDIyeH52u/XwdTDq8LRu8/SvdLQu9Hm1+j/8//EzewAz9ro+/j+3dzizczR1NPY19XbxMHIxLzH49/hvb7XANTW5/ft+Pr3+//+/v39/f///8S+xUIjSS8XPIZdfwDW1ub39v3y9Pju8fTy9vj///+4uMImFDceEjeUVXkA1pzJ1Jej2JKO2IZ61oB024B1zGpjrUNDrERE11Vl8lGDEKxF5owAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/courier.e9b71f4.640.png srcset="/zh-CN/assets/ideal-img/courier.e9b71f4.640.png 640w,/zh-CN/assets/ideal-img/courier.f8addf0.1030.png 1030w" alt=Courier width=640 height=356 /></noscript></div><a href="https://www.courier.com/docs/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Courier</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFyguGaElrfL3djp/8zP+MvA98e99b7C97yt3pmd1QBLYG0jIii6u77x7+3s7On+//z+/fr8/vz/9/PHy+EAVWRzKCszvb/C6uvr4ODi7+7w8vHz8vL0////ztToAFxmdSkrM7/Bw/Ty8ujo6Ors6/T09P38/P///+PF1QBXXW0bIyu4vcDk7OzZ3+Dc4eLn7e72+fr9///uvssAuYCtpGl0zYeD2Ip70n1x13xy13du2XVs3Hpx52tzWcaFkyvPIw8AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/quickwit.aae4257.640.png srcset="/zh-CN/assets/ideal-img/quickwit.aae4257.640.png 640w,/zh-CN/assets/ideal-img/quickwit.e851c05.1030.png 1030w" alt=Quickwit width=640 height=356 /></noscript></div><a href="https://quickwit.io/docs/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Quickwit</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAvElEQVR4nCXJPQ/BQBgA4Pu9FqSDIBKjicFmEIPERmwkWCQkREvQpr4SJK7otb1DtXp3r4hnfVBhZrfmZHpg6uGpLkJt+BkP/H6PNjqs2LyhWmfZ7por82RZl3foCxBSSi4iABgaDlJ3FucCM/9IGKYv2/+QgLNAAIC2xEjfYwBJXM/1vIj/CcF/fR7paLO3JIBD6eVuXx2XsAd9B2H0e2cwRUZ1olfqZrlkFrLrvGLklE06sUvFt5kkjilfulmaxNksu3AAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/dyte.b411d0a.640.png srcset="/zh-CN/assets/ideal-img/dyte.b411d0a.640.png 640w,/zh-CN/assets/ideal-img/dyte.9d967ec.1030.png 1030w" alt=Dyte width=640 height=356 /></noscript></div><a href="https://docs.dyte.io/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Dyte</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AGaqwXuXqIWWqoKSqoKEroN1rYF2rXVzq32Jt22MwAC/0drp4uDF0NSpvcS+0dTI3N6909nQ3N789+++0eQA0+Dp///90urysdjlttrmuN3rpsXg0+Xw////ztPoANTc5vv5+PTy8ejk5O3p6fn19fz39f36+f///+PG1QDZ3Of09/bv8/Xq7/Hz+Pr0+vv0+vz5/Pz9///uvssA1p3J05eh1Y+L1IN22YN32X9023px3Hhv23pw52pzwqeO97QIzhcAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/react-native.9ad7a23.640.png srcset="/zh-CN/assets/ideal-img/react-native.9ad7a23.640.png 640w,/zh-CN/assets/ideal-img/react-native.02f5343.1030.png 1030w" alt=React-Native width=640 height=356 /></noscript></div><a href="https://reactnative.dev/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->React-Native</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxUlEQVR4nAG6AEX/AFqhu2SFmW2FnGR7l2Bpl2Fcl1pXk1dblk1lm1N7tgBGXm0VGyImLjUhKC0cJCgdJykbJSYWHyERHB0sSGIASl1sGSIqJi81KzI4KDA1JCsxJSwyISkvGiAiOUJZAFJgbxwkLCYuNiUtNR8nLiIqMh8mLiQqMhooLk42TABOWWkPHSUbKTMgMkEcLTsjNEEdMD4hMD4XNEFYMUUAtn6soWhzqmZjqFpPplJIqFBHqElCq0lCp0hAxUpUim0yiR9LFnEAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/hasura.e4f3ebd.640.png srcset="/zh-CN/assets/ideal-img/hasura.e4f3ebd.640.png 640w,/zh-CN/assets/ideal-img/hasura.226d6d3.1030.png 1030w" alt=Hasura width=640 height=356 /></noscript></div><a href="https://hasura.io/docs/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Hasura</a></div></div><div class="cssCarouselItem_PFbz"><div class="cssCarouselContent_SJG_"><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAtElEQVR4nB3MSwtBQRiH8fm+SkoSycLOykI2ZOUb2CqxILlEJ5dDlFyaFIccnZk5877zF+un3yMah3B+UytpvJOZLsykb0Y90+urzjCstaVYyhcAdg6Ati6M6RFGlhiIB/5d+JcnAGMptsTETKyUUTomsjNPisP1l91fR5rfEQdvzUQAzsO1OJ4DAIqcIheR+1j3+Gj9vwfdidg0x+t6a1ut7MoFv5Txi+ldLrXPJvf5lEykv9L2nupSFk8xAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="356"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/zh-CN/assets/ideal-img/datagit.98630dd.640.png srcset="/zh-CN/assets/ideal-img/datagit.98630dd.640.png 640w,/zh-CN/assets/ideal-img/datagit.afeea1f.1030.png 1030w" alt=Datagit width=640 height=356 /></noscript></div><a href="https://www.datagit.ir/" target="_blank" rel="noopener noreferrer" class="siteLink_p_T_">🔗 <!-- -->Datagit</a></div></div><button class="navButton_TmqB navButtonPrev_H9Ah" type="button">&lt;</button><button class="navButton_TmqB navButtonNext_yXWb" type="button">&gt;</button></div></div>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/dabit3/status/1382855449813389315" target="_blank" rel="noopener noreferrer"><p>So far it’s working out really nicely. It’s been really easy to style up the
way that we wanted it to look. No blockers at all.</p></a></blockquote><figcaption><a href="https://x.com/dabit3" target="_blank" rel="nofollow"><div class="avatar"><img alt="Nader Dabit" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/dabit3"><div class="avatar__intro"><strong class="avatar__name"><cite>Nader Dabit</cite></strong><small class="avatar__subtitle" itemprop="description">Web3 developer, Developer DAO founder</small></div></div></a></figcaption></figure>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="other-features">Other features<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#other-features" class="hash-link" aria-label="链接到 Other features" title="链接到 Other features" translate="no">​</a></h3>
<p>Docusaurus 2 comes with a very long list of useful features:</p>
<ul>
<li class="">Theme: dark mode, better UI and UX, flexible <code>themeConfig</code> options...</li>
<li class="">Docs versioning: flexible plugin options to adapt to your workflow</li>
<li class="">Docs sidebar: collapsible category, category index pages...</li>
<li class="">Blog: multiple authors, authors map, archive page...</li>
<li class="">Markdown: tabs, math equations, live code blocks, linking, flexible front matter...</li>
<li class="">Search: use the new Algolia DocSearch 3 experience</li>
<li class="">Assets: make it easy to incorporate images and other kinds of files</li>
<li class="">Internationalization: config options, default theme translations...</li>
<li class="">Accessibility: aria labels, color contrasts, skip-to-content, keyboard navigation, progressive enhancement...</li>
<li class="">SEO: sensible defaults, easy to customize, canonical url, social card, no-index, sitemap, microdata, hreflang...</li>
<li class="">PWA: add offline support to your site, and make it installable</li>
<li class="">Fail-fast: strict config validation, detect broken links, and prevent bad production deployments</li>
<li class="">TypeScript support for config files, plugins, custom pages and theme authors</li>
<li class="">Playgrounds: assess Docusaurus easily from your browser with <a href="https://docusaurus.new/" target="_blank" rel="noopener noreferrer" class="">docusaurus.new</a></li>
<li class="">Canary releases: use the @canary npm tag to use the upcoming release before anyone else</li>
<li class="">Tests: Docusaurus is well-tested, we dogfood features and ensure they keep working</li>
</ul>
<figure class="tweetQuote_h8Rz"><blockquote><a href="https://x.com/alexbdebrie/status/1540010328335032320" target="_blank" rel="noopener noreferrer"><p>Recently, I was shocked at how good Docusaurus is out of the box. Super solid,
a good bit of configuration without being overwhelming, and the ability to
really customize the styling if you're braver than I am.</p></a></blockquote><figcaption><a href="https://x.com/alexbdebrie" target="_blank" rel="nofollow"><div class="avatar"><img alt="Alex DeBrie" class="avatar__photo avatarImg_b51M" src="https://unavatar.io/x/alexbdebrie"><div class="avatar__intro"><strong class="avatar__name"><cite>Alex DeBrie</cite></strong><small class="avatar__subtitle" itemprop="description">AWS Data Hero, author of The DynamoDB Book</small></div></div></a></figcaption></figure>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="why-20-now">Why 2.0 now? <a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#why-20-now" class="hash-link" aria-label="链接到 Why 2.0 now? " title="链接到 Why 2.0 now? " translate="no">​</a></h2>
<p>Many enthusiastic followers of ours have been curious <strong>why it took us 4 years to release Docusaurus 2.0</strong>, considering the beta is already successful and <strong>widely used in production</strong>.</p>
<p>The reason is that we aim to <strong>respect <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">Semantic Versioning</a></strong>, which means we will be incrementing the major version number whenever we release a <strong>breaking change</strong>.</p>
<p>It is important for multiple reasons:</p>
<ul>
<li class="">It <strong>guarantees simple minor version upgrades</strong>, as long as you only use the <a class="" href="https://docusaurus.io/zh-CN/community/release-process#public-api-surface">public API</a></li>
<li class="">符合前端生态的传统</li>
<li class="">发布新的大版本时，有机会完整地记录破坏性变更</li>
<li class="">发布新的大版本/小版本时，有机会通过博客介绍新功能</li>
</ul>
<p>The problem is that our flexible theming system inherently creates a very <strong>implicit API surface</strong> on which it is <strong>hard to know what is a breaking change</strong> in the first place. Highly customized Docusaurus sites sometimes have a hard time upgrading Docusaurus because they achieve customizations using internal APIs. We dedicated time to extensive theme refactors and clearly defining our <a class="" href="https://docusaurus.io/zh-CN/community/release-process#public-api-surface">public API</a>, so that future code changes can be made more safely. We will continue to expand this public theming API so that the most common site customizations do not need to use any internal API.</p>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_Knsx"><p>From now on, Docusaurus will <strong>release new major versions more frequently</strong>. In practice, you can expect a <strong>new major version every 2 to 4 months</strong>.</p><p><a href="https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html" target="_blank" rel="noopener noreferrer" class="">Major version numbers are not sacred</a>, but we still group breaking changes together and avoid releasing major versions too often.</p><p>Check our <a class="" href="https://docusaurus.io/zh-CN/community/release-process">release process</a> documentation for details.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="whats-next">What's Next? <a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#whats-next" class="hash-link" aria-label="链接到 What's Next? " title="链接到 What's Next? " translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Slash Up and Running" src="https://docusaurus.io/zh-CN/assets/images/slash-up-and-running-1c1f83f3064dcd56be41632c51be62ac.png" width="760" height="160" class="img_vXGZ"></p>
<p>The work on Docusaurus 3.0 has started, and this next version will be released only in a few months. We will <strong>backport retro-compatible changes in Docusaurus 2.x</strong> minor versions to make them available as soon as possible to the community on a stable channel.</p>
<p>A sample of the features on our roadmap for the upcoming major versions of Docusaurus:</p>
<ul>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/4029" target="_blank" rel="noopener noreferrer" class="">Upgrade to MDX 2.0</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/4625" target="_blank" rel="noopener noreferrer" class="">Improve Markdown infrastructure</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/6114" target="_blank" rel="noopener noreferrer" class="">Improve theming and swizzle</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/2961" target="_blank" rel="noopener noreferrer" class="">TailwindCSS theme</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/7227" target="_blank" rel="noopener noreferrer" class="">Theme; support custom item types for navbar, doc sidebar, blog sidebar, footer</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/4389" target="_blank" rel="noopener noreferrer" class="">Dynamic navbar: navbar item activation strategies</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/2968" target="_blank" rel="noopener noreferrer" class="">Custom Social Cards</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/3236" target="_blank" rel="noopener noreferrer" class="">CSS-in-JS support</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/6520" target="_blank" rel="noopener noreferrer" class="">Use Node.js ES Modules</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/4765" target="_blank" rel="noopener noreferrer" class="">Improve build time performance</a></li>
<li class=""><a href="https://github.com/facebook/docusaurus/issues/4138" target="_blank" rel="noopener noreferrer" class="">Extend Docusaurus plugins, CMS integration</a></li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="thank-you">Thank You<a href="https://docusaurus.io/zh-CN/blog/2022/08/01/announcing-docusaurus-2.0#thank-you" class="hash-link" aria-label="链接到 Thank You" title="链接到 Thank You" translate="no">​</a></h2>
<p>We'd like to express our gratitude to <a href="https://github.com/facebook/docusaurus/graphs/contributors" target="_blank" rel="noopener noreferrer" class="">all our contributors</a>, including:</p>
<ul>
<li class="">The Docusaurus core team: <a href="https://github.com/lex111" target="_blank" rel="noopener noreferrer" class="">Alexey Pyltsyn</a>, <a href="https://github.com/Josh-Cena" target="_blank" rel="noopener noreferrer" class="">Joshua Chen</a>, <a href="https://github.com/slorber" target="_blank" rel="noopener noreferrer" class="">Sébastien Lorber</a>, <a href="https://github.com/yangshun" target="_blank" rel="noopener noreferrer" class="">Yangshun Tay</a> and all our <a href="https://docusaurus.io/community/team" target="_blank" rel="noopener noreferrer" class="">former team members</a></li>
<li class=""><a href="https://github.com/JoelMarcey" target="_blank" rel="noopener noreferrer" class="">Joel Marcey</a> for creating Docusaurus 1.0 and supporting the Docusaurus 2.0 project at Meta Open Source</li>
<li class=""><a href="https://github.com/zpao" target="_blank" rel="noopener noreferrer" class="">Paul O’Shannessy</a> for supporting the development of all the next versions of Docusaurus at Meta Open Source</li>
<li class=""><a href="https://github.com/ericnakagawa" target="_blank" rel="noopener noreferrer" class="">Eric Nakagawa</a> for creating our cutest mascot Slash</li>
<li class=""><a href="https://github.com/endiliey" target="_blank" rel="noopener noreferrer" class="">Endilie Yacop Sucipto</a> for his significant <a class="" href="https://docusaurus.io/zh-CN/blog/2020/01-07-tribute-to-endi.mdx">initial work on Docusaurus v2</a></li>
<li class=""><a href="https://github.com/shortcuts" target="_blank" rel="noopener noreferrer" class="">Clément Vannicatte</a>, <a href="https://github.com/Shipow" target="_blank" rel="noopener noreferrer" class="">Kevin Granger</a> and the whole Algolia team for their support</li>
<li class="">All the community members for making valuable code contributions, improving our documentation, and answering questions on <a href="https://discordapp.com/invite/docusaurus" target="_blank" rel="noopener noreferrer" class="">Discord</a></li>
</ul>
<p>We'd like to thank in particular all our <strong>Docusaurus 2.0 early adopters</strong> for assessing its alpha, beta and canary releases, providing a ton of <strong>invaluable feedback</strong>. We sincerely hope you had a great experience using it, and that you will continue to provide feedback on the upcoming pre-releases of Docusaurus 3.0.</p>
<p>At <a href="https://opensource.fb.com/" target="_blank" rel="noopener noreferrer" class="">Meta Open Source</a>, Docusaurus is one of our <strong>most successful projects</strong>. We can't wait to see all the outstanding documentation websites that you will create! Don't forget to <strong>submit them to our <a class="" href="https://docusaurus.io/zh-CN/showcase">site showcase</a></strong>!</p>
<p><strong>Now, let your imagination run wild 🤪!</strong></p>
<p>— Slash</p>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>We are on <a href="https://www.producthunt.com/posts/docusaurus-2-0" target="_blank" rel="noopener noreferrer" class="">ProductHunt</a> and <a href="https://news.ycombinator.com/item?id=32303052" target="_blank" rel="noopener noreferrer" class="">Hacker News</a>!</div><div class="admonitionContent_Knsx"><p>🙏 Share your experience using Docusaurus with the community!</p><div style="display:flex"><a href="https://www.producthunt.com/posts/docusaurus-2-0?utm_source=badge-featured&amp;utm_medium=badge&amp;utm_souce=badge-docusaurus-2-0" target="_blank" rel="noopener noreferrer" class="producthunt-badge-widget" style="display:block;width:250px;height:54px"><img class="producthunt-badge-widget" src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=353916&amp;theme=light" alt="Docusaurus 2.0 - Build optimized websites quickly, focus on your content. | Product Hunt" style="width:250px;height:54px;max-width:initial" width="250" height="54"></a><a href="https://news.ycombinator.com/item?id=32303052" target="_blank" rel="noopener noreferrer" style="display:block;width:54px;height:54px"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="54" height="54"><path fill="#FF6D00" d="M42 42H6V6h36v36z"></path><path fill="#FFF" d="M8 8v32h32V8H8zm30 30H10V10h28v28z"></path><path fill="#FFF" d="M23 32h2v-6l5.5-10h-2.1L24 24.1 19.6 16h-2.1L23 26z"></path></svg></a></div></div></div>
<p><img decoding="async" loading="lazy" alt="Slash plushies" src="https://docusaurus.io/zh-CN/assets/images/slash-plushies-71b7a47477442dfcf890627669aba97d.jpg" width="1332" height="1331" class="img_vXGZ"></p>]]></content:encoded>
            <author>sidachen2003@gmail.com (陈思达)</author>
            <author>lex@php.net (Alexey Pyltsyn)</author>
            <category>发布</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus 2021 回顾]]></title>
            <link>https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap</link>
            <guid>https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap</guid>
            <pubDate>Mon, 24 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Docusaurus 在 2021 一年中进展神速！ We've seen a lot of traction and just crossed 30k stars on GitHub!]]></description>
            <content:encoded><![CDATA[<p>Docusaurus 在 2021 一年中进展神速！ We've seen a lot of traction and just crossed <strong>30k stars on GitHub</strong>!</p>
<p>We've <strong>reached full feature parity</strong> with v1 after <a class="" href="https://docusaurus.io/zh-CN/blog/2021/03-09-releasing-docusaurus-i18n.mdx">the release of internationalization</a>, <a class="" href="https://docusaurus.io/zh-CN/blog/2021/05-12-announcing-docusaurus-two-beta/index.mdx">announced our <strong>first beta</strong></a>, and welcomed <strong>significantly more users</strong> this year.</p>
<p>The <strong>official v2 release</strong> is just around the corner! Follow the <a href="https://github.com/facebook/docusaurus/issues/6113" target="_blank" rel="noopener noreferrer" class="">roadmap issue</a> for any latest news.</p>
<p><img decoding="async" loading="lazy" src="https://docusaurus.io/zh-CN/assets/images/thumbnail-dbb46fec970f4431a6846603224dd2fe.png" width="1000" height="562" class="img_vXGZ"></p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="highlights">精彩内容<a href="https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap#highlights" class="hash-link" aria-label="链接到 精彩内容" title="链接到 精彩内容" translate="no">​</a></h2>
<p>我们首先回顾一下今年的几个亮点时刻。 Remember the <a class="" href="https://docusaurus.io/zh-CN/blog/2021/05-12-announcing-docusaurus-two-beta/index.mdx#whats-next">todo-list</a> from half a year ago? 是时候再把它拿出来了，看看我们走了多远！</p>
<ul>
<li class=""><strong>Internationalization</strong>: officially released four months after its initial landing in late 2020. Seen great success in <a class="" href="https://docusaurus.io/zh-CN/showcase?tags=i18n">many projects</a></li>
<li class=""><strong>Autogenerated sidebars</strong>: no need to maintain a big <code>sidebars.js</code> anymore</li>
<li class=""><strong>Webpack 5</strong>: significantly improved build performance</li>
<li class=""><strong>Trailing slash config</strong>: seamless integration with any content hosting provider</li>
<li class=""><strong>Redesigned mobile navigation</strong>: mobile users now enjoy all navigation features as on desktop</li>
<li class=""><strong>UI improvements</strong>: more accessible quotes, better admonitions, back-to-top button...</li>
<li class=""><strong>Blog multi-authors</strong>: credit all the amazing contributors that collaborated on one blog post!</li>
<li class=""><strong>More blog features</strong>: archive page, structured data for SEO, full post content in feeds – empowering you to ship a fully-featured blog in no time</li>
<li class=""><strong>Asset collocation</strong>: no need for a bloated static folder anymore: colocate your images with Markdown files</li>
<li class=""><strong>Sidebar category index pages</strong>: category labels can now be associated with pages, enabling better doc organization</li>
</ul>
<p>我们的代码库也在今年被逐渐打磨完善。 我们提高了测试覆盖率，把所有包都迁移到了 TypeScript，并把我们发布的包的大小减少了最多 60%！</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="trends">趋势<a href="https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap#trends" class="hash-link" aria-label="链接到 趋势" title="链接到 趋势" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="npm">npm<a href="https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap#npm" class="hash-link" aria-label="链接到 npm" title="链接到 npm" translate="no">​</a></h3>
<p>Docusaurus v2 继续稳步增长。 V2 的安装量已经达到了 v1 的 8 倍。 就每周下载量而言，增长又翻了三番（+209.4%），从 1 月初的 28,066 次增加到了 12 月中旬的 86,846 次。</p>
<p><a href="https://www.npmtrends.com/docusaurus-vs-@docusaurus/core" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Docusaurus v1 vs. v2 npm trends of the year 2021. The installations of Docusaurus v2 is constantly rising, while v1 is almost constant. V1 stays at 10000, while v2 grows from 30000 to almost 90000. There&amp;#39;s a sharp drop from 90000 to 40000 just before the Jan 2022 line." src="https://docusaurus.io/zh-CN/assets/images/npm-trend-1e69b5c9e35be8bd6d9ac6fbaaf313d7.png" width="800" height="483" class="img_vXGZ"></a></p>
<p>（啊，这经典的圣诞节骤降啊……）</p>
<p>We released 18 versions, going from <code>2.0.0-alpha.71</code> to <code>2.0.0-beta.14</code>. 那就是每 20 天发布一个版本！</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="github">GitHub<a href="https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap#github" class="hash-link" aria-label="链接到 GitHub" title="链接到 GitHub" translate="no">​</a></h3>
<ul>
<li class=""><strong>Stars</strong>: 20,460 → 29,679 (+45.1% y/y). 并且，就在这篇文章发布之前，我们刚刚达到了 3 万星！</li>
<li class=""><strong>Total contributors</strong>: 512 → 773 (+51.0% y/y)</li>
<li class=""><strong>Dependents</strong>: 5,039 → 14,579 (+189.3% y/y) for v2, and 6,311 → 7,581 (+20.1% y/y) for v1</li>
<li class=""><strong>Commits</strong>: 1,187 commits in the past year, averaging 23 commits every week</li>
<li class=""><strong>Issues</strong>: 619 issues opened, 505 of them eventually resolved</li>
<li class="">A <a href="https://github.com/Josh-Cena" target="_blank" rel="noopener noreferrer" class=""><strong>new core team member</strong></a> (yep, that's me 😝)</li>
</ul>
<p>我们的星星趋势也很乐观。 Compared to similar projects, we are <strong>growing at a faster rate</strong>:</p>
<p><img decoding="async" loading="lazy" alt="Stars trend by year of 9 static site generators. Next.js grows the fastest, with Docusaurus at the 4th place in terms of growth rate." src="https://docusaurus.io/zh-CN/assets/images/star-history-c7ba492b822fed1336d08fe449f87840.png" width="800" height="550" class="img_vXGZ"></p>
<p>With an 8.4k increase in stars, we are ranked number 3 in this year's <a href="https://risingstars.js.org/2021/en#section-ssg" target="_blank" rel="noopener noreferrer" class="">JavaScript rising stars of static site generators</a>, preceded only by Next.js and Astro.</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus placing 3rd in the &amp;quot;Static Sites&amp;quot; ranking list" src="https://docusaurus.io/zh-CN/assets/images/rising-stars-56326450d25b95f221f56db3b352c724.png" width="600" height="412" class="img_vXGZ"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="featured-adoptions">亮眼用户<a href="https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap#featured-adoptions" class="hash-link" aria-label="链接到 亮眼用户" title="链接到 亮眼用户" translate="no">​</a></h2>
<p>Our showcase has welcomed a few new <a class="" href="https://docusaurus.io/zh-CN/showcase?tags=favorite">"favorite" sites</a> that showcase the true potential of Docusaurus 2's pluggable architecture.</p>
<ul>
<li class=""><a href="https://wiki.iota.org/" target="_blank" rel="noopener noreferrer" class=""><strong>IOTA-wiki</strong></a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Iota wiki light mode" src="https://docusaurus.io/zh-CN/assets/images/iota-light-d899be0c1eb939a5ad13e2ecca4eb951.png#gh-light-mode-only" width="800" height="456" class="img_vXGZ"><img decoding="async" loading="lazy" alt="Iota wiki dark mode" src="https://docusaurus.io/zh-CN/assets/images/iota-dark-986d9518ba0e03583d734212ba93539d.png#gh-dark-mode-only" width="800" height="456" class="img_vXGZ"></p>
<ul>
<li class=""><a href="https://docs.dyte.io/docs/home/introduction/" target="_blank" rel="noopener noreferrer" class=""><strong>Dyte</strong></a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Dyte light mode" src="https://docusaurus.io/zh-CN/assets/images/dyte-light-24caa76f96400453386185ae6bc06b8a.png#gh-light-mode-only" width="800" height="454" class="img_vXGZ"><img decoding="async" loading="lazy" alt="Dyte dark mode" src="https://docusaurus.io/zh-CN/assets/images/dyte-dark-b9748e4bcb4281880ff1856519d58b38.png#gh-dark-mode-only" width="800" height="454" class="img_vXGZ"></p>
<ul>
<li class=""><a href="https://ionicframework.com/docs" target="_blank" rel="noopener noreferrer" class=""><strong>Ionic</strong></a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Ionic light mode" src="https://docusaurus.io/zh-CN/assets/images/ionic-light-b8a9c77c71a99f4c71a16584dac8ccf3.png#gh-light-mode-only" width="800" height="456" class="img_vXGZ"><img decoding="async" loading="lazy" alt="Ionic dark mode" src="https://docusaurus.io/zh-CN/assets/images/ionic-dark-17086f816052f02e84054fe002256ed9.png#gh-dark-mode-only" width="800" height="456" class="img_vXGZ"></p>
<ul>
<li class=""><a href="https://www.courier.com/docs/" target="_blank" rel="noopener noreferrer" class=""><strong>Courier</strong></a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Courier" src="https://docusaurus.io/zh-CN/assets/images/courier-624bbae7cbef3b4e7533d1976e35f842.png" width="800" height="454" class="img_vXGZ"></p>
<p>Docusaurus 用户的创造力远超我们所想 🤩 我们期待着越来越多的使用者在利用 Docusaurus 的内容功能时，积极探索独创的主题设计！ If your site uses Docusaurus, we would love to <a href="https://github.com/facebook/docusaurus/edit/main/website/src/data/users.tsx" target="_blank" rel="noopener noreferrer" class="">have it in our showcase</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="community">社区<a href="https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap#community" class="hash-link" aria-label="链接到 社区" title="链接到 社区" translate="no">​</a></h2>
<p>As an active moderator on <a href="https://discord.gg/docusaurus" target="_blank" rel="noopener noreferrer" class="">Discord</a>, I can clearly see the community thriving. 许多常见问题现在已经被纳入了文档，一些功能建议也已被实现。 项目和社区之间始终保持互惠互利的关系——我自己在成为维护者之前，就曾是社区贡献者。</p>
<p>We are constantly mentioned on X with inspirational feedback:</p>
<blockquote>
<p><strong>@docusaurus</strong> is amazing! 难以想象它用起来这么简单。</p>
</blockquote>
<blockquote>
<p>没有额外的插件、工具或者编译步骤。 它安装完就能工作了。</p>
</blockquote>
<blockquote>
<p>I love <strong>@docusaurus</strong>. 没有 Docusaurus，我完全没法如此高效而漂亮地搭建我网站上的 API、教程和博客。</p>
</blockquote>
<p>And we keep every one of them in <a href="https://x.com/sebastienlorber/timelines/1392048416872706049" target="_blank" rel="noopener noreferrer" class="">our little box</a> 😄 If you enjoy Docusaurus yourself, keep tagging us with your comments!</p>
<p>As we approach the official release, we are interested in knowing more about what people are doing out there: <a href="https://github.com/facebook/docusaurus/discussions/4025" target="_blank" rel="noopener noreferrer" class="">plugin authors</a>, <a href="https://github.com/facebook/docusaurus/discussions/5468" target="_blank" rel="noopener noreferrer" class="">creators of customized sites</a>, and <a href="https://github.com/facebook/docusaurus/discussions/4610" target="_blank" rel="noopener noreferrer" class="">all new users</a> – please keep us posted about your achievements so we can steer our development to better serve your needs.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="going-forward">前瞻<a href="https://docusaurus.io/zh-CN/blog/2022/01/24/docusaurus-2021-recap#going-forward" class="hash-link" aria-label="链接到 前瞻" title="链接到 前瞻" translate="no">​</a></h2>
<p>在过去几个月里，我们一直不断提及 Docusaurus 的发布候选阶段——是的，马上就到了。 We have created a dedicated <a href="https://github.com/facebook/docusaurus/milestone/15" target="_blank" rel="noopener noreferrer" class="">milestone</a> to keep track of all issues to solve before we can confidently progress to the next stage. In short, we want to build a <strong>more robust theming workflow</strong>, empowering creative site creators to customize our default theme without fearing breaking changes as they upgrade. 这将包括：</p>
<ul>
<li class="">Guidelines on <strong>component organization</strong>. 我们希望主题组件具有适当的粒度，最好是当你想要自定义你的网站的某部分时，总是能找到一个正好负责那个部分的组件。</li>
<li class="">Improvements to the <strong>swizzle CLI</strong>. 我们希望用户能快乐地使用它，让它引导你完成所有的 swizzle 场景。</li>
<li class="">Refactoring our <strong>theme APIs</strong>. 我们希望所有可以被 swizzle 的组件都真的适合被 swizzle，所以我们会移走所有非 UI 的组件。</li>
<li class=""><strong>Docs</strong>. 我们希望我们的文档对所有用户都同样可读——无论是初次接触编程还是有经验的 web 开发者。 我们会把它组织成一个渐进式的教程，使得各种技术水平的读者都可以从中受益。</li>
</ul>
<p>Read more about plans for Docusaurus 2.0 in this <a href="https://github.com/facebook/docusaurus/issues/6113" target="_blank" rel="noopener noreferrer" class="">roadmap issue</a>. 有了社区的帮助，2.0 版本才能变得更好，所以请在任何里程碑 issue 下面畅所欲言，分享你的意见与建议！</p>
<p>因为核心团队正忙于完成正式版本发布，所以我们会在 2.0 之后的小版本中发布其他有用的功能。 We have even made further plans for <a href="https://github.com/facebook/docusaurus/milestone/16" target="_blank" rel="noopener noreferrer" class="">architectural changes in 3.0</a>!</p>
<p>Docusaurus 2.0 正式版发布之后，我们有信心看到更多的用户加入，以及从 v1 迁移而来。</p>
<p>We'd like to express our gratitude to <a href="https://github.com/facebook/docusaurus/graphs/contributors?from=2021-01-01&amp;to=2022-01-01&amp;type=c" target="_blank" rel="noopener noreferrer" class="">all the contributors in 2021</a>, including:</p>
<ul>
<li class="">The core team: <a href="https://github.com/lex111" target="_blank" rel="noopener noreferrer" class="">Alexey Pyltsyn</a>, <a href="https://github.com/slorber" target="_blank" rel="noopener noreferrer" class="">Sébastien Lorber</a>, <a href="https://github.com/Josh-Cena" target="_blank" rel="noopener noreferrer" class="">Joshua Chen</a>, and <a href="https://github.com/yangshun" target="_blank" rel="noopener noreferrer" class="">Yangshun Tay</a> for moderating the community, publicizing Docusaurus, triaging issues, and implementing new features</li>
<li class=""><a href="https://github.com/JoelMarcey" target="_blank" rel="noopener noreferrer" class="">Joel Marcey</a> for creating Docusaurus and supporting its development all along</li>
<li class="">The Algolia team for helping Docusaurus users <a class="" href="https://docusaurus.io/zh-CN/blog/2021/11-21-algolia-docsearch-migration/index.mdx">migrate to the new DocSearch</a> and answering search-related questions</li>
<li class="">所有活跃的社区成员，感谢他们所做的代码贡献、文档改进，以及在 Discord 上回答问题</li>
</ul>
<p>别了，2021，让我们向光明的 2022 年问好吧！</p>]]></content:encoded>
            <author>sidachen2003@gmail.com (陈思达)</author>
            <category>回顾</category>
        </item>
        <item>
            <title><![CDATA[DocSearch 迁移]]></title>
            <link>https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration</link>
            <guid>https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration</guid>
            <pubDate>Sun, 21 Nov 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[DocSearch is migrating to a new, more powerful system, which gives users their own Algolia application and new credentials.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docsearch.algolia.com/" target="_blank" rel="noopener noreferrer" class="">DocSearch</a> is migrating to a new, more powerful system, which gives users their own Algolia application and new credentials.</p>
<p>Docusaurus site owners should upgrade their configuration with their new credentials <strong>by February 1, 2022</strong>, existing search indexes will be frozen and become read-only after this date.</p>
<!-- -->
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="upgrading-your-docusaurus-site">升级你的 Docusaurus 网站<a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#upgrading-your-docusaurus-site" class="hash-link" aria-label="链接到 升级你的 Docusaurus 网站" title="链接到 升级你的 Docusaurus 网站" translate="no">​</a></h2>
<p>在接下来的几周，Docusaurus 网站所有者将收到一封电子邮件，邀请您加入 Algolia 个人应用。</p>
<p>This email will include a new <code>appId</code> and <code>apiKey</code> to use in your Docusaurus configuration.</p>
<p>您只需要：</p>
<ul>
<li class="">加入 Algolia 应用程序（必要时创建一个新的 Algolia 账户）</li>
<li class="">更新您的站点配置。</li>
</ul>
<div class="language-js codeBlockContainer_jDV4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_U6Q0">docusaurus.config.js</div><div class="codeBlockContent_cKMj"><pre tabindex="0" class="prism-code language-js codeBlock_Gebt thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_FJaf"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#CF222E">const</span><span class="token plain"> config </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#005CC5">themeConfig</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#005CC5">algolia</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">appId</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'&lt;NEW_APP_ID&gt;'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#005CC5">apiKey</span><span class="token operator" style="color:#D73A49">:</span><span class="token plain"> </span><span class="token string" style="color:#C6105F">'&lt;NEW_SEARCH_API_KEY&gt;'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#D73A49">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_o5H7 alert alert--info"><div class="admonitionHeading_FzoX"><span class="admonitionIcon_rXq6"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_Knsx"><p><code>appId</code> is now <strong>required</strong>.</p><p>这些密钥不是机密，可以添加到您的 Git 仓库中。</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="docsearch-has-a-new-home">Docsearch 有一个新家了！ <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#docsearch-has-a-new-home" class="hash-link" aria-label="链接到 Docsearch 有一个新家了！ " title="链接到 Docsearch 有一个新家了！ " translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="what-is-docsearch">DocSearch 是什么？ <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#what-is-docsearch" class="hash-link" aria-label="链接到 DocSearch 是什么？ " title="链接到 DocSearch 是什么？ " translate="no">​</a></h3>
<p><a href="https://docsearch.algolia.com/" target="_blank" rel="noopener noreferrer" class="">DocSearch</a> is a program created by <a href="http://algolia.com/" target="_blank" rel="noopener noreferrer" class="">Algolia</a>, which offers search to technical documentation of Open Source projects and technical blogs <strong>for free</strong>.</p>
<p>You can <a href="https://docsearch.algolia.com/docs/what-is-docsearch/" target="_blank" rel="noopener noreferrer" class="">read more here</a>, and <a href="https://docsearch.algolia.com/apply" target="_blank" rel="noopener noreferrer" class="">apply</a> if you'd like to give it a try!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="what-is-this-migration-about">What is this migration about? <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#what-is-this-migration-about" class="hash-link" aria-label="链接到 What is this migration about? " title="链接到 What is this migration about? " translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="motivation">动机<a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#motivation" class="hash-link" aria-label="链接到 动机" title="链接到 动机" translate="no">​</a></h3>
<p>With the upcoming stable release of <a href="https://docsearch.algolia.com/docs/DocSearch-v3" target="_blank" rel="noopener noreferrer" class="">DocSearch UI</a>, we wanted to go further and provide better tooling for our users to improve their search, but also leverage the full potential of Algolia.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="whats-new">What's new? <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#whats-new" class="hash-link" aria-label="链接到 What's new? " title="链接到 What's new? " translate="no">​</a></h3>
<p>DocSearch now leverages the <a href="https://www.algolia.com/products/search-and-discovery/crawler/" target="_blank" rel="noopener noreferrer" class="">Algolia Crawler</a>, which includes a web interface that will allow you to:</p>
<ul>
<li class="">启动，规划和监视你的 crawl</li>
<li class="">使用在线编辑器编辑您的配置文件</li>
<li class="">借助于 DocSearch v3 测试您的结果</li>
</ul>
<p><img decoding="async" loading="lazy" alt="The Algolia crawler front page showing the project&amp;#39;s overview, such as last complete crawl and indices" src="https://docusaurus.io/zh-CN/assets/images/crawler-overview-6224cc4c7b20511010652f3f4ed5904e.png" width="3832" height="1882" class="img_vXGZ"></p>
<p><img decoding="async" loading="lazy" alt="The Algolia config editor opened to the docusaurus-2 config. The right pane shows the results for index and various facet filters." src="https://docusaurus.io/zh-CN/assets/images/editor-823e50dbed8e508bd5a69c708bab8928.png" width="3832" height="1880" class="img_vXGZ"></p>
<p>But also, more Algolia features in <strong>your own Algolia app</strong>:</p>
<ul>
<li class="">团队管理</li>
<li class="">浏览并查看您的记录是如何在Algolia进行索引的</li>
<li class="">免费试用其他Algolia功能</li>
</ul>
<p><img decoding="async" loading="lazy" alt="The Algolia index overview page, showing various filters and the details of every single index" src="https://docusaurus.io/zh-CN/assets/images/index-overview-ca216346e6eee6881443644b6d7d8fe8.png" width="3834" height="1882" class="img_vXGZ"></p>
<p><img decoding="async" loading="lazy" alt="The Algolia index analytics page, showing trends for total users, total searches, etc." src="https://docusaurus.io/zh-CN/assets/images/index-analytics-f9c27da3900de6206e949736b1cd8101.png" width="3810" height="1876" class="img_vXGZ"></p>
<p>And of course, <strong>a lot more, for free</strong>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="faq">FAQ<a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#faq" class="hash-link" aria-label="链接到 FAQ" title="链接到 FAQ" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="im-using-docusaurus-and-docsearch-can-i-migrate">I'm using Docusaurus and DocSearch, can I migrate? <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#im-using-docusaurus-and-docsearch-can-i-migrate" class="hash-link" aria-label="链接到 I'm using Docusaurus and DocSearch, can I migrate? " title="链接到 I'm using Docusaurus and DocSearch, can I migrate? " translate="no">​</a></h3>
<p>At the time we are writing this, we are still at an early stage of the migration. We are doing small batches every week but will increase the load shortly, so please be patient and keep an eye out in your mailbox, you'll be contacted as soon as your Algolia app is ready!</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="where-can-i-read-more-about-this">Where can I read more about this? <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#where-can-i-read-more-about-this" class="hash-link" aria-label="链接到 Where can I read more about this? " title="链接到 Where can I read more about this? " translate="no">​</a></h3>
<p>We wrote a small <a href="https://docsearch.algolia.com/docs/migrating-from-legacy" target="_blank" rel="noopener noreferrer" class="">migration guide</a> but you'll have more detailed information in the migration email.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="i-received-the-migration-email-but-the-invite-expired">I received the migration email but the invite expired<a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#i-received-the-migration-email-but-the-invite-expired" class="hash-link" aria-label="链接到 I received the migration email but the invite expired" title="链接到 I received the migration email but the invite expired" translate="no">​</a></h3>
<p>Please contact us via either <a href="mailto:docsearch@algolia.com" target="_blank" rel="noopener noreferrer" class="">email</a> or <a href="https://discord.gg/bRTacwYrfX" target="_blank" rel="noopener noreferrer" class="">DocSearch's Discord</a> or on <a href="https://discordapp.com/invite/docusaurus" target="_blank" rel="noopener noreferrer" class="">Docusaurus's Discord #algolia channel</a></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="i-have-feedback">I have feedback! <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#i-have-feedback" class="hash-link" aria-label="链接到 I have feedback! " title="链接到 I have feedback! " translate="no">​</a></h3>
<p>For any feedback regarding our documentation or the DocSearch UI component, you can open an issue <a href="https://github.com/algolia/docsearch/issues" target="_blank" rel="noopener noreferrer" class="">on our GitHub repository</a>, but also contact us via the methods above.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_qJOx" id="can-i-still-run-my-own-docsearch-instance">Can I still run my own DocSearch instance? <a href="https://docusaurus.io/zh-CN/blog/2021/11/21/algolia-docsearch-migration#can-i-still-run-my-own-docsearch-instance" class="hash-link" aria-label="链接到 Can I still run my own DocSearch instance? " title="链接到 Can I still run my own DocSearch instance? " translate="no">​</a></h3>
<p>In favor of the new infrastructure and DocSearch v3, we will no longer maintain our beloved <a href="https://github.com/algolia/docsearch-scraper" target="_blank" rel="noopener noreferrer" class="">DocSearch scraper</a> and <a href="https://github.com/algolia/docsearch/tree/master" target="_blank" rel="noopener noreferrer" class="">DocSearch v2</a>, but the repositories will still be available and open to pull requests.</p>
<p>The previous documentation (now called <code>legacy</code>) remains available as well as our <a href="https://docsearch.algolia.com/docs/legacy/run-your-own" target="_blank" rel="noopener noreferrer" class=""><code>run your own</code></a> guide.</p>]]></content:encoded>
            <category>搜索</category>
        </item>
    </channel>
</rss>