<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MDX</title><description>MDX 更新</description><link>https://mdx.ndjp.net/</link><lastBuildDate>Tue, 07 Jul 2026 16:54:04 GMT</lastBuildDate><dc:date>2026-07-07T16:54:04.929Z</dc:date><atom:link href="https://mdx.ndjp.net/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>zh</language><dc:language>zh</dc:language><copyright>© 2026 MDX 贡献者</copyright><dc:rights>© 2026 MDX 贡献者</dc:rights><category>mdx</category><category>markdown</category><category>jsx</category><category>oss</category><category>react</category><item><title>MDX 3</title><dc:creator>Titus Wormer</dc:creator><link>https://mdx.ndjp.net/blog/v3/</link><guid isPermaLink="false">https://mdx.ndjp.net/blog/v3/</guid><pubDate>Tue, 24 Oct 2023 00:00:00 GMT</pubDate><dc:date>2023-10-24T00:00:00.000Z</dc:date><dc:modified>2025-01-27T00:00:00.000Z</dc:modified><description>&#x3C;div>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：有关如何迁移的信息，请参阅我们的 &#x3C;a href="/migrating/v3/">版本 3 迁移指南&#x3C;/a>。&#x3C;/p>&#x3C;/div>&#x3C;h2 id="mdx-3">&#x3C;a href="#mdx-3" class="" aria-label="Link to this section">&#x3C;/a>MDX 3&#x3C;/h2>&#x3C;p>版本 3 来了！ 这个主版本包含了一些小的变更。 对于大多数人来说，只需要更新 Node.js 和插件即可！&#x3C;/p>&#x3C;h3 id="目录">&#x3C;a href="#目录" class="" aria-label="Link to this section">&#x3C;/a>目录&#x3C;/h3>&#x3C;ul>&#x3C;li>&#x3C;a href="#%E7%A0%B4%E5%9D%8F%E6%80%A7%E5%8F%98%E6%9B%B4">破坏性变更&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#mdx-%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%94%B9%E8%BF%9B">MDX 格式的改进&#x3C;/a>&#x3C;ul>&#x3C;li>&#x3C;a href="#mdx-%E4%B8%AD%E7%9B%B8%E9%82%BB%E7%9A%84%E5%9D%97%E7%BA%A7-jsx-%E5%92%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F">MDX 中相邻的块级 JSX 和表达式&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#mdx-%E4%B8%AD%E7%9A%84-await">MDX 中的 await&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#mdx-%E4%B8%AD%E7%9A%84-es2024">MDX 中的 ES2024&#x3C;/a>&#x3C;/li>&#x3C;/ul>&#x3C;/li>&#x3C;li>&#x3C;a href="#%E5%85%B6%E4%BB%96">其他&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#%E8%87%B4%E8%B0%A2">致谢&#x3C;/a>&#x3C;/li>&#x3C;/ul>&#x3C;h3 id="破坏性变更">&#x3C;a href="#破坏性变更" class="" aria-label="Link to this section">&#x3C;/a>破坏性变更&#x3C;/h3>&#x3C;p>主要的破坏性变更是 Node.js 16 现在是最低支持的版本。&#x3C;/p>&#x3C;p>在整个生态系统中，有几个小的内部破坏性变更。 所有内容都已经发布了。 你现在可以更新所有插件。 如果你之前遇到了问题，现在应该可以正常工作了。&#x3C;/p>&#x3C;p>我们还移除了一些不常用的已废弃 API。 你可能不会受到影响，但如果遇到错误，请查看 &#x3C;a href="/migrating/v3/">v3 迁移指南&#x3C;/a>。&#x3C;/p>&#x3C;p>需要注意的是，当你使用不太知名但强大的 &#x3C;code>evaluate&#x3C;/code>、&#x3C;code>run&#x3C;/code> 或 &#x3C;code>outputFormat: 'function-body'&#x3C;/code> API 时，请传递 &#x3C;code>baseUrl&#x3C;/code> 选项。 这样可以确保 &#x3C;code>import.meta.url&#x3C;/code>、&#x3C;code>import&#x3C;/code> 和 &#x3C;code>export&#x3C;/code> 正常工作。 否则，当使用这些功能时会收到运行时错误。&#x3C;/p>&#x3C;h3 id="mdx-格式的改进">&#x3C;a href="#mdx-格式的改进" class="" aria-label="Link to this section">&#x3C;/a>MDX 格式的改进&#x3C;/h3>&#x3C;p>MDX 格式还有一些小的改进，其中一些在技术上是破坏性的。&#x3C;/p>&#x3C;h4 id="mdx-中相邻的块级-jsx-和表达式">&#x3C;a href="#mdx-中相邻的块级-jsx-和表达式" class="" aria-label="Link to this section">&#x3C;/a>MDX 中相邻的块级 JSX 和表达式&#x3C;/h4>&#x3C;p>我们现在接受块级表达式紧挨着块级 JSX 标签：&#x3C;/p>&#x3C;pre>&#x3C;code class="language-mdx">&#x26;#x3C;&#x3C;span>style&#x3C;/span>>&#x3C;span>{&#x3C;span>`&#x3C;/span>&#x3C;/span>

  h1 &#x3C;span>{&#x3C;/span>
    &#x3C;span>color&#x3C;/span>: &#x3C;span>blue&#x3C;/span>;
  }

`}&#x26;#x3C;/&#x3C;span>style&#x3C;/span>>
&#x3C;/code>&#x3C;/pre>&#x3C;p>以前这会产生语法错误，你必须在尖括号和花括号之间添加换行符。&#x3C;/p>&#x3C;h4 id="mdx-中的-await">&#x3C;a href="#mdx-中的-await" class="" aria-label="Link to this section">&#x3C;/a>MDX 中的 await&#x3C;/h4>&#x3C;p>我们现在接受 &#x3C;code>await&#x3C;/code> 语法：&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>MDX&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="language-mdx">&#x3C;span>{&#x3C;/span>&#x3C;span>await&#x3C;/span> &#x3C;span>Promise&#x3C;/span>.&#x3C;span>resolve&#x3C;/span>(&#x3C;span>42&#x3C;/span>)&#x3C;span>}&#x3C;/span>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>大多数框架不支持 Promise。 这是否有效取决于框架本身。&#x3C;/p>&#x3C;p>以前，当在不允许的上下文中使用 &#x3C;code>await&#x3C;/code> 时会产生运行时错误。&#x3C;/p>&#x3C;h4 id="mdx-中的-es2024">&#x3C;a href="#mdx-中的-es2024" class="" aria-label="Link to this section">&#x3C;/a>MDX 中的 ES2024&#x3C;/h4>&#x3C;p>你现在可以在 MDX 中使用现代 JavaScript 语法。 内部使用的 Acorn 现在被指示使用 ES2024。&#x3C;/p>&#x3C;h3 id="其他">&#x3C;a href="#其他" class="" aria-label="Link to this section">&#x3C;/a>其他&#x3C;/h3>&#x3C;p>我重构了所有文档。 根据需要更新了每个使用示例。 我还写了一篇关于如何从任何地方注入组件的指南： &#x3C;a href="/guides/injecting-components/">§ 注入组件&#x3C;/a>。&#x3C;/p>&#x3C;p>网站速度快了很多。 还有一个改进的 playground：&#x3C;a href="/playground/">试试看！»&#x3C;/a>。 我们还在这里有了正确的语法高亮，感谢 &#x3C;a href="//github.com/wooorm/markdown-tm-language">&#x3C;code>wooorm/markdown-tm-language&#x3C;/code>&#x3C;/a> 和 &#x3C;a href="//github.com/wooorm/starry-night">&#x3C;code>wooorm/starry-night&#x3C;/code>&#x3C;/a>。&#x3C;/p>&#x3C;p>生成的 JS 代码更干净了（移除了 JSX pragma 注释，并在需要时对对象 进行排序），还使用了展开运算符代替 &#x3C;code>Object.assign&#x3C;/code>，在需要时添加了 &#x3C;code>'use strict'&#x3C;/code>，并且 &#x3C;code>MDXContent&#x3C;/code> 被立即导出。&#x3C;/p>&#x3C;h3 id="致谢">&#x3C;a href="#致谢" class="" aria-label="Link to this section">&#x3C;/a>致谢&#x3C;/h3>&#x3C;p>我们要感谢所有的贡献者和开心的用户。 特别感谢 北雁云依 (&#x3C;a href="//github.com/BeiyanYunyi">&#x3C;strong>@BeiyanYunyi&#x3C;/strong>&#x3C;/a>), Christian Murphy (&#x3C;a href="//github.com/ChristianMurphy">&#x3C;strong>@ChristianMurphy&#x3C;/strong>&#x3C;/a>), JokcyLou (&#x3C;a href="//github.com/Jokcy">&#x3C;strong>@Jokcy&#x3C;/strong>&#x3C;/a>), Maël Nison (&#x3C;a href="//github.com/arcanis">&#x3C;strong>@arcanis&#x3C;/strong>&#x3C;/a>), Andreas Deininger (&#x3C;a href="//github.com/deining">&#x3C;strong>@deining&#x3C;/strong>&#x3C;/a>), Remco Haszing (&#x3C;a href="//github.com/remcohaszing">&#x3C;strong>@remcohaszing&#x3C;/strong>&#x3C;/a>), Sébastien Lorber (&#x3C;a href="//github.com/slorber">&#x3C;strong>@slorber&#x3C;/strong>&#x3C;/a>), Víctor Fernández (&#x3C;a href="//github.com/victor23k">&#x3C;strong>@victor23k&#x3C;/strong>&#x3C;/a>), Titus Wormer (&#x3C;a href="//github.com/wooorm">&#x3C;strong>@wooorm&#x3C;/strong>&#x3C;/a>), 以及任何我们可能遗漏的人。&#x3C;/p>&#x3C;/div></description></item><item><title>MDX 2</title><dc:creator>Titus Wormer</dc:creator><link>https://mdx.ndjp.net/blog/v2/</link><guid isPermaLink="false">https://mdx.ndjp.net/blog/v2/</guid><pubDate>Tue, 01 Feb 2022 00:00:00 GMT</pubDate><dc:date>2022-02-01T00:00:00.000Z</dc:date><dc:modified>2025-01-27T00:00:00.000Z</dc:modified><description>&#x3C;div>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：这是一篇旧的博客文章。 以下内容为历史目的而保留原样。&#x3C;/p>&#x3C;/div>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：有关如何迁移的信息，请参阅我们的 &#x3C;a href="/migrating/v2/">版本 2 迁移指南&#x3C;/a>。&#x3C;/p>&#x3C;/div>&#x3C;h2 id="mdx-2">&#x3C;a href="#mdx-2" class="" aria-label="Link to this section">&#x3C;/a>MDX 2&#x3C;/h2>&#x3C;p>经过多年的努力，MDX 版本 2 发布了，包含了许多改进。 以下是亮点：&#x3C;/p>&#x3C;div>&#x3C;ul>&#x3C;li>📝 &#x3C;strong>改进的语法&#x3C;/strong> 让在 JSX 中使用 Markdown 更容易&#x3C;/li>&#x3C;li>🧑‍💻 &#x3C;strong>JavaScript 表达式&#x3C;/strong> 将 &#x3C;code>{2 * Math.PI}&#x3C;/code> 变成 6.283185307179586&#x3C;/li>&#x3C;li>🔌 新的 &#x3C;strong>esbuild&#x3C;/strong>、&#x3C;strong>Rollup&#x3C;/strong> 和 &#x3C;strong>Node.js&#x3C;/strong> 集成&#x3C;/li>&#x3C;li>⚛️ &#x3C;strong>任何 JSX 运行时&#x3C;/strong>：React、Preact、Vue、Emotion，你说的出来的都支持&#x3C;/li>&#x3C;li>🌳 &#x3C;strong>改进的 AST&#x3C;/strong> 暴露了更多更详细的信息&#x3C;/li>&#x3C;li>🏃‍♀️ 编译速度至少快了 &#x3C;strong>25%&#x3C;/strong>&#x3C;/li>&#x3C;li>🚴 生成的代码运行速度快了两倍（&#x3C;strong>快 100%&#x3C;/strong>）&#x3C;/li>&#x3C;li>🚄 &#x3C;code>@mdx-js/mdx&#x3C;/code> 的打包体积小了三倍多（&#x3C;strong>小 250%&#x3C;/strong>）&#x3C;/li>&#x3C;li>🧵 ……还有更多更多&#x3C;/li>&#x3C;/ul>&#x3C;/div>&#x3C;p>这个项目公布已经 4 年了。 距离我们发布稳定的版本 1 已经过了 2 年半。 &#x3C;strong>我们很自豪终于发布 v2！&#x3C;/strong> 让我们深入看看！&#x3C;/p>&#x3C;h3 id="目录">&#x3C;a href="#目录" class="" aria-label="Link to this section">&#x3C;/a>目录&#x3C;/h3>&#x3C;ul>&#x3C;li>&#x3C;a href="#mdx-%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%94%B9%E8%BF%9B">MDX 格式的改进&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#rollupesbuild-%E5%92%8C%E5%85%B6%E4%BB%96%E9%9B%86%E6%88%90">Rollup、esbuild 和其他集成&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#%E6%9E%B6%E6%9E%84%E6%94%B9%E8%BF%9B">架构改进&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#typescript">TypeScript&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#%E6%96%87%E6%A1%A3%E5%92%8C%E7%BD%91%E7%AB%99">文档和网站&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#%E7%A0%B4%E5%9D%8F%E6%80%A7%E5%8F%98%E6%9B%B4">破坏性变更&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="#%E8%87%B4%E8%B0%A2">致谢&#x3C;/a>&#x3C;/li>&#x3C;/ul>&#x3C;h3 id="mdx-格式的改进">&#x3C;a href="#mdx-格式的改进" class="" aria-label="Link to this section">&#x3C;/a>MDX 格式的改进&#x3C;/h3>&#x3C;p>我们花了很多时间思考和尝试不同的方式来改进格式。 最初，格式非常接近 Markdown 以及 Markdown 中 HTML 的工作方式。 我们发现旧行为经常产生意外的结果。 在版本 2 中，我们将格式稍微向 JS(X) 的工作方式靠拢。&#x3C;/p>&#x3C;p>以这个 MDX 文件为例：&#x3C;/p>&#x3C;pre>&#x3C;code class="language-mdx">&#x26;#x3C;&#x3C;span>div&#x3C;/span>>&#x3C;span>*&#x3C;/span>hi&#x3C;span>*&#x3C;/span>?&#x26;#x3C;/&#x3C;span>div&#x3C;/span>>

&#x26;#x3C;&#x3C;span>div&#x3C;/span>>
&#x3C;span>  # &#x3C;span>hi?&#x3C;/span>&#x3C;/span>
&#x26;#x3C;/&#x3C;span>div&#x3C;/span>>

&#x26;#x3C;&#x3C;span>main&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>div&#x3C;/span>>

&#x3C;span>    # &#x3C;span>hi?&#x3C;/span>&#x3C;/span>

  &#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
&#x26;#x3C;/&#x3C;span>main&#x3C;/span>>
&#x3C;/code>&#x3C;/pre>&#x3C;div>&#x3C;div>&#x3C;p>在版本 1 中，它等价于以下 JSX：&#x3C;/p>&#x3C;pre>&#x3C;code class="">&#x26;#x3C;>
  &#x26;#x3C;&#x3C;span>div&#x3C;/span>>*hi*?&#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>div&#x3C;/span>>
    # hi?
  &#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>main&#x3C;/span>>
    &#x26;#x3C;&#x3C;span>div&#x3C;/span>>
      &#x26;#x3C;&#x3C;span>pre&#x3C;/span>>&#x26;#x3C;&#x3C;span>code&#x3C;/span>># hi?&#x26;#x3C;/&#x3C;span>code&#x3C;/span>>&#x26;#x3C;/&#x3C;span>pre&#x3C;/span>>
    &#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
  &#x26;#x3C;/&#x3C;span>main&#x3C;/span>>
&#x26;#x3C;/>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;div>&#x3C;p>在版本 2 中，它等价于以下 JSX：&#x3C;/p>&#x3C;pre>&#x3C;code class="">&#x26;#x3C;>
  &#x26;#x3C;&#x3C;span>div&#x3C;/span>>&#x26;#x3C;&#x3C;span>em&#x3C;/span>>hi&#x26;#x3C;/&#x3C;span>em&#x3C;/span>>?&#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>div&#x3C;/span>>
    &#x26;#x3C;&#x3C;span>h1&#x3C;/span>>hi?&#x26;#x3C;/&#x3C;span>h1&#x3C;/span>>
  &#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>main&#x3C;/span>>
    &#x26;#x3C;&#x3C;span>div&#x3C;/span>>
      &#x26;#x3C;&#x3C;span>h1&#x3C;/span>>hi?&#x26;#x3C;/&#x3C;span>h1&#x3C;/span>>
    &#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
  &#x26;#x3C;/&#x3C;span>main&#x3C;/span>>
&#x26;#x3C;/>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;/div>&#x3C;p>我们认为以下行为更直观：同一行标签之间可以形成 Markdown "行内"语法 如强调（第一个 &#x3C;code>&#x26;#x3C;div>&#x3C;/code>），如果标题在自己的行上则可以形成"块" （第二个 &#x3C;code>&#x26;#x3C;div>&#x3C;/code>），并且允许缩进而不是形成代码（第三个 &#x3C;code>&#x26;#x3C;div>&#x3C;/code>）。&#x3C;/p>&#x3C;p>我们还添加了对 JavaScript 表达式的支持，例如：&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;div>&#x3C;div>&#x3C;span>expressions.mdx&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="language-mdx">&#x3C;span>export&#x3C;/span> &#x3C;span>const&#x3C;/span> &#x3C;span>authors&#x3C;/span> &#x3C;span>=&#x3C;/span> [
  {name: &#x3C;span>&#x3C;span>'&#x3C;/span>Jane&#x3C;span>'&#x3C;/span>&#x3C;/span>, email: &#x3C;span>&#x3C;span>'&#x3C;/span>hi@jane.com&#x3C;span>'&#x3C;/span>&#x3C;/span>},
  {name: &#x3C;span>&#x3C;span>'&#x3C;/span>John&#x3C;span>'&#x3C;/span>&#x3C;/span>, github: &#x3C;span>&#x3C;span>'&#x3C;/span>@johno&#x3C;span>'&#x3C;/span>&#x3C;/span>}
]
&#x3C;span>export&#x3C;/span> &#x3C;span>const&#x3C;/span> &#x3C;span>published&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>new&#x3C;/span> &#x3C;span>Date&#x3C;/span>(&#x3C;span>&#x3C;span>'&#x3C;/span>2022-02-01&#x3C;span>'&#x3C;/span>&#x3C;/span>)

Written by: &#x3C;span>{&#x3C;/span>&#x3C;span>new&#x3C;/span> &#x3C;span>Intl&#x3C;/span>.&#x3C;span>ListFormat&#x3C;/span>(&#x3C;span>&#x3C;span>'&#x3C;/span>en&#x3C;span>'&#x3C;/span>&#x3C;/span>).&#x3C;span>format&#x3C;/span>(&#x3C;span>authors&#x3C;/span>.&#x3C;span>map&#x3C;/span>(&#x3C;span>d&#x3C;/span> &#x3C;span>=>&#x3C;/span> &#x3C;span>d&#x3C;/span>.&#x3C;span>name&#x3C;/span>))&#x3C;span>}&#x3C;/span>.

Published on: &#x3C;span>{&#x3C;/span>&#x3C;span>new&#x3C;/span> &#x3C;span>Intl&#x3C;/span>.&#x3C;span>DateTimeFormat&#x3C;/span>(&#x3C;span>&#x3C;span>'&#x3C;/span>en&#x3C;span>'&#x3C;/span>&#x3C;/span>, {dateStyle: &#x3C;span>&#x3C;span>'&#x3C;/span>long&#x3C;span>'&#x3C;/span>&#x3C;/span>}).&#x3C;span>format&#x3C;/span>(&#x3C;span>published&#x3C;/span>)&#x3C;span>}&#x3C;/span>.
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;/div>&#x3C;div>&#x3C;div>&#x3C;div>&#x3C;span>equivalent.jsx&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x26;#x3C;>
  &#x26;#x3C;&#x3C;span>p&#x3C;/span>>Written by: Jane and John.&#x26;#x3C;/&#x3C;span>p&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>p&#x3C;/span>>Published on: February 1, 2022.&#x26;#x3C;/&#x3C;span>p&#x3C;/span>>
&#x26;#x3C;/>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;/div>&#x3C;/div>&#x3C;p>随着格式从 Markdown 稍微向 JSX 靠拢，我们添加了对加载不带我们语法扩展的 "普通" Markdown 的支持。 如果你使用我们的打包器集成 &#x3C;code>@mdx-js/loader&#x3C;/code>（或 &#x3C;code>@mdx-js/rollup&#x3C;/code>、 &#x3C;code>@mdx-js/esbuild&#x3C;/code> 或 &#x3C;code>@mdx-js/node-loader&#x3C;/code>，见下一节），那么它就能 直接工作：导入 &#x3C;code>readme.mdx&#x3C;/code> 会被视为 MDX 格式，导入 &#x3C;code>readme.md&#x3C;/code> 会被视为 Markdown，基于它们的扩展名。&#x3C;/p>&#x3C;p>MDX 格式在 &#x3C;a href="/docs/what-is-mdx/">§ 什么是 MDX&#x3C;/a> 中有描述。&#x3C;/p>&#x3C;h3 id="rollupesbuild-和其他集成">&#x3C;a href="#rollupesbuild-和其他集成" class="" aria-label="Link to this section">&#x3C;/a>Rollup、esbuild 和其他集成&#x3C;/h3>&#x3C;p>当我们开始时，Babel、webpack 和 React 在 JavaScript 生态系统中无处不在， 我们在它们之上构建了 MDX。 对于版本 2，我们努力使它们变为可选。 它们不再是必需的，MDX 可以更轻松地与其他工具一起使用。&#x3C;/p>&#x3C;p>在打包器方面，我们添加了新的集成：&#x3C;code>@mdx-js/esbuild&#x3C;/code> 用于 esbuild（一个极快的打包器）和 &#x3C;code>@mdx-js/rollup&#x3C;/code> 用于 Rollup（也用于 Vite 和 WMR 的打包器）。 你甚至可以使用我们新的 &#x3C;code>@mdx-js/node-loader&#x3C;/code> 在 Node.js 中直接导入 MDX 文件。&#x3C;/p>&#x3C;p>在运行时方面，我们现在可以将 JSX 编译为普通 JavaScript， 不再需要框架特定的代码来将它们与 MDX 粘合在一起。 现在支持任何 JSX 运行时，无论是 &#x3C;a href="//reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html">classic 还是 automatic&#x3C;/a>。 这意味着 MDX 可以与 React、Preact、Vue、Emotion、Theme UI、Ink 等 一起使用，还有未来发明的任何东西！&#x3C;/p>&#x3C;p>参见 &#x3C;a href="/docs/getting-started/">§ 快速开始&#x3C;/a> 了解快速入门以及如何将 MDX 与 许多不同工具集成的深入信息。&#x3C;/p>&#x3C;h3 id="架构改进">&#x3C;a href="#架构改进" class="" aria-label="Link to this section">&#x3C;/a>架构改进&#x3C;/h3>&#x3C;p>为了使 MDX 格式的语法更好，并允许新的集成和任意 JSX 运行时， 我们几乎重写了所有内容。 其中一部分工作是 &#x3C;a href="//github.com/micromark/micromark">micromark&#x3C;/a>，那是另一个故事，但这意味着我们 完全符合 CommonMark（和可选的 GFM），同时还能更好地理解 MDX 文件。&#x3C;/p>&#x3C;p>现在，当有拼写错误时，我们可以提前抛出错误并准确指向发生位置， 而不是让 webpack 等后续打包器抱怨一个中间的、不可识别的、 损坏的 JavaScript 字符串中的错误。 这也意味着我们有一个新的 AST，更详细地描述了 MDX 语法—— 我们甚至暴露了嵌入的 JavaScript。 这个详细的 AST 允许插件以强大的新方式增强 MDX。 它还帮助解决了以前 MDX 会崩溃的边缘情况。 并且它让我们可以放弃 Babel。&#x3C;/p>&#x3C;p>这种新架构带来了 &#x3C;strong>25% 更快&#x3C;/strong> 的编译速度，运行速度快两倍的 生成代码（&#x3C;strong>快 100%&#x3C;/strong>），以及 &#x3C;code>@mdx-js/mdx&#x3C;/code> 的打包体积小了三倍多 （&#x3C;strong>小 250%&#x3C;/strong>）。&#x3C;/p>&#x3C;p>参见 &#x3C;a href="/packages/mdx/#architecture">¶ &#x3C;code>@mdx-js/mdx&#x3C;/code> 中的架构&#x3C;/a> 了解更多关于编译器 工作原理的信息。 参见 &#x3C;a href="/docs/extending-mdx/">§ 扩展 MDX&#x3C;/a> 了解几个使用新树来增强 MDX 的插件、 如何使用它们和其他插件，以及如何创建插件。&#x3C;/p>&#x3C;h3 id="typescript">&#x3C;a href="#typescript" class="" aria-label="Link to this section">&#x3C;/a>TypeScript&#x3C;/h3>&#x3C;p>所有 &#x3C;a href="/packages/">&#x3C;code>@mdx-js/*&#x3C;/code> 包&#x3C;/a> 现在通过 JSDoc 注释完全使用 &#x3C;a href="//www.typescriptlang.org">TypeScript&#x3C;/a> 进行了类型标注。 这意味着我们的 API 以 TypeScript 类型暴露，而且我们的项目 内部也是类型安全的。&#x3C;/p>&#x3C;p>我们发布了 &#x3C;a href="//github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mdx">&#x3C;code>@types/mdx&#x3C;/code>&#x3C;/a>，一个仅包含类型的包，可以与 任何（社区）集成一起使用。 如果你导入 MDX 文件，你可以使用它来为那些导入的组件进行类型标注。&#x3C;/p>&#x3C;p>参见 &#x3C;a href="/docs/getting-started/#types">§ 快速开始中的 ¶ TypeScript&#x3C;/a> 了解更多关于如何配置 TypeScript 的信息。&#x3C;/p>&#x3C;h3 id="文档和网站">&#x3C;a href="#文档和网站" class="" aria-label="Link to this section">&#x3C;/a>文档和网站&#x3C;/h3>&#x3C;p>MDX 被大量使用和喜爱。 在版本 1 之前，我们累计了 &#x3C;strong>250 万次下载&#x3C;/strong>。 现在我们每周就达到这个数字。 我们的核心编译器 &#x3C;code>@mdx-js/mdx&#x3C;/code> 被 &#x3C;strong>6.1 万个项目&#x3C;/strong>使用。 我们的 GitHub 仓库有 &#x3C;strong>1.16 万 stars&#x3C;/strong>。&#x3C;/p>&#x3C;p>很多人帮忙，通常是帮忙改进文档。 自版本 1 以来，有 85 位贡献者提交了我们的仓库。 我们感谢这些贡献和所有个人见解， 但这些年来确实导致了一些不一致和重复内容。&#x3C;/p>&#x3C;p>对于版本 2，我们从头到尾重写了文档，为新用户、做复杂 AST 和 编译器的人以及介于两者之间的任何人讲述一个一致的故事。&#x3C;/p>&#x3C;p>我们还做了一个新网站。 它当然是用 MDX 构建的，&#x3C;a href="//unifiedjs.com">unified&#x3C;/a> 本身，以及 &#x3C;a href="//reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">React Server Components (RSC)&#x3C;/a>。 虽然我们在吃自己的狗粮（前两者是我们维护的项目），而后者 还非常实验性，但我们认为提前编译和混合模型， 与完全服务端网站或完全客户端应用相比，对我们和 Web 的未来是 明智的选择。&#x3C;/p>&#x3C;p>我们的新网站经过高度优化且快速，美观（主观的，但嘿）， 有丰富的元数据，在 Lighthouse 和 axe 等性能和可访问性审查工具中 得分很高。&#x3C;/p>&#x3C;p>参见 &#x3C;a href="/community/contribute/">§ 贡献&#x3C;/a> 了解更多关于如何帮助的信息。&#x3C;/p>&#x3C;h3 id="破坏性变更">&#x3C;a href="#破坏性变更" class="" aria-label="Link to this section">&#x3C;/a>破坏性变更&#x3C;/h3>&#x3C;p>当你准备好迁移时，请参阅 &#x3C;a href="/migrating/v2/">版本 2 迁移指南&#x3C;/a>。&#x3C;/p>&#x3C;h3 id="致谢">&#x3C;a href="#致谢" class="" aria-label="Link to this section">&#x3C;/a>致谢&#x3C;/h3>&#x3C;p>我们要感谢所有的贡献者和开心的用户。 特别感谢 John Otander (&#x3C;a href="//github.com/johno">&#x3C;strong>@johno&#x3C;/strong>&#x3C;/a>), Christian Murphy (&#x3C;a href="//github.com/ChristianMurphy">&#x3C;strong>@ChristianMurphy&#x3C;/strong>&#x3C;/a>), JounQin (&#x3C;a href="//github.com/JounQin">&#x3C;strong>@JounQin&#x3C;/strong>&#x3C;/a>), Jack Bates (&#x3C;a href="//github.com/jablko">&#x3C;strong>@jablko&#x3C;/strong>&#x3C;/a>), Sam Chen (&#x3C;a href="//github.com/chenxsan">&#x3C;strong>@chenxsan&#x3C;/strong>&#x3C;/a>), Sam Robbins (&#x3C;a href="//github.com/samrobbins85">&#x3C;strong>@samrobbins85&#x3C;/strong>&#x3C;/a>), Remco Haszing (&#x3C;a href="//github.com/remcohaszing">&#x3C;strong>@remcohaszing&#x3C;/strong>&#x3C;/a>), LB (&#x3C;a href="//github.com/laurieontech">&#x3C;strong>@laurieontech&#x3C;/strong>&#x3C;/a>), Gabriel Kirkley (&#x3C;a href="//github.com/gdgkirkley">&#x3C;strong>@gdgkirkley&#x3C;/strong>&#x3C;/a>>), Hung-I Wang (&#x3C;a href="//github.com/Gowee">&#x3C;strong>@Gowee&#x3C;/strong>&#x3C;/a>), Ilham Wahabi (&#x3C;a href="//github.com/iwgx">&#x3C;strong>@iwgx&#x3C;/strong>&#x3C;/a>), Kaito Sugimoto (&#x3C;a href="//github.com/HelloRusk">&#x3C;strong>@HelloRusk&#x3C;/strong>&#x3C;/a>), Karl Horky (&#x3C;a href="//github.com/karlhorky">&#x3C;strong>@karlhorky&#x3C;/strong>&#x3C;/a>), Katie Hughes (&#x3C;a href="//github.com/glitteringkatie">&#x3C;strong>@glitteringkatie&#x3C;/strong>&#x3C;/a>), Lachlan Campbell (&#x3C;a href="//github.com/lachlanjc">&#x3C;strong>@lachlanjc&#x3C;/strong>&#x3C;/a>), Marcy Sutton (&#x3C;a href="//github.com/marcysutton">&#x3C;strong>@marcysutton&#x3C;/strong>&#x3C;/a>), Marius Gundersen (&#x3C;a href="//github.com/mariusGundersen">&#x3C;strong>@mariusGundersen&#x3C;/strong>&#x3C;/a>), Marius-Remus Mate, Mark Skelton (&#x3C;a href="//github.com/mskelton">&#x3C;strong>@mskelton&#x3C;/strong>&#x3C;/a>), Martin V (&#x3C;a href="//github.com/ndresx">&#x3C;strong>@ndresx&#x3C;/strong>&#x3C;/a>), Matija Marohnić (&#x3C;a href="//github.com/silvenon">&#x3C;strong>@silvenon&#x3C;/strong>&#x3C;/a>), Michael Oliver (&#x3C;a href="//github.com/michaeloliverx">&#x3C;strong>@michaeloliverx&#x3C;/strong>&#x3C;/a>), Michaël De Boey (&#x3C;a href="//github.com/MichaelDeBoey">&#x3C;strong>@MichaelDeBoey&#x3C;/strong>&#x3C;/a>), Muescha (&#x3C;a href="//github.com/muescha">&#x3C;strong>@muescha&#x3C;/strong>&#x3C;/a>), Norviah (&#x3C;a href="//github.com/Norviah">&#x3C;strong>@Norviah&#x3C;/strong>&#x3C;/a>), Paul Scanlon (&#x3C;a href="//github.com/PaulieScanlon">&#x3C;strong>@PaulieScanlon&#x3C;/strong>&#x3C;/a>), Peter Mouland (&#x3C;a href="//github.com/peter-mouland">&#x3C;strong>@peter-mouland&#x3C;/strong>&#x3C;/a>), Prince Wilson (&#x3C;a href="//github.com/maxcell">&#x3C;strong>@maxcell&#x3C;/strong>&#x3C;/a>), Rafael Almeida (&#x3C;a href="//github.com/rafaelalmeidatk">&#x3C;strong>@rafaelalmeidatk&#x3C;/strong>&#x3C;/a>), Rodrez (&#x3C;a href="//github.com/rodrez">&#x3C;strong>@rodrez&#x3C;/strong>&#x3C;/a>), Rongjian Zhang (&#x3C;a href="//github.com/pd4d10">&#x3C;strong>@pd4d10&#x3C;/strong>&#x3C;/a>), Taeheon Kim (&#x3C;a href="//github.com/lonyele">&#x3C;strong>@lonyele&#x3C;/strong>&#x3C;/a>), Tom Parker-Shemilt (&#x3C;a href="//github.com/palfrey">&#x3C;strong>@palfrey&#x3C;/strong>&#x3C;/a>), Try Ajitiono (&#x3C;a href="//github.com/imballinst">&#x3C;strong>@imballinst&#x3C;/strong>&#x3C;/a>), Yamagishi Kazutoshi (&#x3C;a href="//github.com/ykzts">&#x3C;strong>@ykzts&#x3C;/strong>&#x3C;/a>), Yoav Kadosh (&#x3C;a href="//github.com/ykadosh">&#x3C;strong>@ykadosh&#x3C;/strong>&#x3C;/a>), Yordis Prieto (&#x3C;a href="//github.com/Yordis">&#x3C;strong>@Yordis&#x3C;/strong>&#x3C;/a>), Adrian Foong (&#x3C;a href="//github.com/adrfoong">&#x3C;strong>@adrfoong&#x3C;/strong>&#x3C;/a>), Dan Abramov (&#x3C;a href="//github.com/gaearon">&#x3C;strong>@gaearon&#x3C;/strong>&#x3C;/a>), &#x3C;a href="//github.com/ihupoo">&#x3C;strong>@ihupoo&#x3C;/strong>&#x3C;/a>, &#x3C;a href="//github.com/nikhog">&#x3C;strong>@nikhog&#x3C;/strong>&#x3C;/a>, &#x3C;a href="//github.com/redallen">&#x3C;strong>@redallen&#x3C;/strong>&#x3C;/a>, Akshay Kadam (&#x3C;a href="//github.com/deadcoder0904">&#x3C;strong>@deadcoder0904&#x3C;/strong>&#x3C;/a>), я котик пур-пур (&#x3C;a href="//github.com/mvasilkov">&#x3C;strong>@mvasilkov&#x3C;/strong>&#x3C;/a>), Anders D. Johnson (&#x3C;a href="//github.com/AndersDJohnson">&#x3C;strong>@AndersDJohnson&#x3C;/strong>&#x3C;/a>), Andrew Aylett (&#x3C;a href="//github.com/andrewaylett">&#x3C;strong>@andrewaylett&#x3C;/strong>&#x3C;/a>), Ankeet Maini (&#x3C;a href="//github.com/ankeetmaini">&#x3C;strong>@ankeetmaini&#x3C;/strong>&#x3C;/a>), Biswas Nandamuri (&#x3C;a href="//github.com/Biswas-N">&#x3C;strong>@Biswas-N&#x3C;/strong>&#x3C;/a>), Bret (&#x3C;a href="//github.com/bcomnes">&#x3C;strong>@bcomnes&#x3C;/strong>&#x3C;/a>), Chris Chinchilla (&#x3C;a href="//github.com/ChrisChinchilla">&#x3C;strong>@ChrisChinchilla&#x3C;/strong>&#x3C;/a>), Christopher Biscardi (&#x3C;a href="//github.com/ChristopherBiscardi">&#x3C;strong>@ChristopherBiscardi&#x3C;/strong>&#x3C;/a>), Dan Overton (&#x3C;a href="//github.com/dan-overton">&#x3C;strong>@dan-overton&#x3C;/strong>&#x3C;/a>), Domitrius (&#x3C;a href="//github.com/domitriusclark">&#x3C;strong>@domitriusclark&#x3C;/strong>&#x3C;/a>), Dovi Winberger (&#x3C;a href="//github.com/dowi">&#x3C;strong>@dowi&#x3C;/strong>&#x3C;/a>), Emmie Päivärinta (&#x3C;a href="//github.com/emmiep">&#x3C;strong>@emmiep&#x3C;/strong>&#x3C;/a>), Eugene Ghanizadeh (&#x3C;a href="//github.com/loreanvictor">&#x3C;strong>@loreanvictor&#x3C;/strong>&#x3C;/a>), 以及任何我们可能遗漏的人。&#x3C;/p>&#x3C;/div></description></item><item><title>MDXConf</title><dc:creator>John Otander</dc:creator><link>https://mdx.ndjp.net/blog/conf/</link><guid isPermaLink="false">https://mdx.ndjp.net/blog/conf/</guid><pubDate>Fri, 31 Jul 2020 00:00:00 GMT</pubDate><dc:date>2020-07-31T00:00:00.000Z</dc:date><dc:modified>2025-01-27T00:00:00.000Z</dc:modified><description>&#x3C;div>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：这是一篇旧的博客文章。 以下内容为历史目的而保留原样。&#x3C;/p>&#x3C;/div>&#x3C;h2 id="mdxconf">&#x3C;a href="#mdxconf" class="" aria-label="Link to this section">&#x3C;/a>MDXConf&#x3C;/h2>&#x3C;p>MDXConf 是为 MDX 社区举办的免费在线会议。 无论你刚开始了解 MDX 还是已经是专家，都会有适合你的内容！&#x3C;/p>&#x3C;p>2020 年 8 月 24 日，上午 8 点 PDT / 下午 3 点 UST&#x3C;br>在线 • 免费&#x3C;/p>&#x3C;h3 id="观看">&#x3C;a href="#观看" class="" aria-label="Link to this section">&#x3C;/a>观看&#x3C;/h3>&#x3C;p>会议现在已经结束，但你仍然可以观看录像！&#x3C;/p>&#x3C;p>&#x3C;a href="//egghead.io/playlists/mdx-conf-3fc2">观看演讲 →&#x3C;/a>&#x3C;/p>&#x3C;h3 id="关于">&#x3C;a href="#关于" class="" aria-label="Link to this section">&#x3C;/a>关于&#x3C;/h3>&#x3C;p>加入我们的首届 MDX 会议！ 我们将免费直接为你直播。&#x3C;/p>&#x3C;p>自两年半前的&#x3C;a href="//github.com/mdx-js/mdx/commit/dee47dc20b08d534132e3b966cdccf3b88c7bca5">第一次提交&#x3C;/a>以来，MDX 发展迅速。 我们想庆祝迄今为止的成就，并讨论未来的方向。 我们有很多计划。&#x3C;/p>&#x3C;p>了解 MDX 如何提高开发者生产力，改善教育内容创作， 甚至窥探幕后看看 MDX 是如何工作的。&#x3C;/p>&#x3C;h3 id="演讲者">&#x3C;a href="#演讲者" class="" aria-label="Link to this section">&#x3C;/a>演讲者&#x3C;/h3>&#x3C;h4 id="chris-biscardi">&#x3C;a href="#chris-biscardi" class="" aria-label="Link to this section">&#x3C;/a>Chris Biscardi&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/ChristopherBiscardi.png?size=200">]&#x3C;/p>&#x3C;p>主题演讲：MDX 的过去、现在和未来&#x3C;/p>&#x3C;h4 id="monica-powell">&#x3C;a href="#monica-powell" class="" aria-label="Link to this section">&#x3C;/a>Monica Powell&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/M0nica.png?size=200">&#x3C;/p>&#x3C;p>迁移到 MDX&#x3C;/p>&#x3C;h4 id="laurie-barth">&#x3C;a href="#laurie-barth" class="" aria-label="Link to this section">&#x3C;/a>Laurie Barth&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/laurieontech.png?size=200">&#x3C;/p>&#x3C;p>MDX v2 语法&#x3C;/p>&#x3C;h4 id="cole-bemis">&#x3C;a href="#cole-bemis" class="" aria-label="Link to this section">&#x3C;/a>Cole Bemis&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/colebemis.png?size=200">&#x3C;/p>&#x3C;p>揭秘 MDX&#x3C;/p>&#x3C;h4 id="prince-wilson">&#x3C;a href="#prince-wilson" class="" aria-label="Link to this section">&#x3C;/a>Prince Wilson&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/maxcell.png?size=200">&#x3C;/p>&#x3C;p>个人站点游乐场&#x3C;/p>&#x3C;h4 id="kathleen-mcmahon">&#x3C;a href="#kathleen-mcmahon" class="" aria-label="Link to this section">&#x3C;/a>Kathleen McMahon&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/resource11.png?size=200">&#x3C;/p>&#x3C;p>用 MDX 魔法打造数字花园&#x3C;/p>&#x3C;h4 id="rodrigo-pombo">&#x3C;a href="#rodrigo-pombo" class="" aria-label="Link to this section">&#x3C;/a>Rodrigo Pombo&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/pomber.png?size=200">&#x3C;/p>&#x3C;p>MDX 中的 X&#x3C;/p>&#x3C;h4 id="jonathan-bakebwa">&#x3C;a href="#jonathan-bakebwa" class="" aria-label="Link to this section">&#x3C;/a>Jonathan Bakebwa&#x3C;/h4>&#x3C;p>&#x3C;img alt="" src="//github.com/codebender828.png?size=200">&#x3C;/p>&#x3C;p>MDX 与 Vue/Nuxt&#x3C;/p>&#x3C;h3 id="注册">&#x3C;a href="#注册" class="" aria-label="Link to this section">&#x3C;/a>注册&#x3C;/h3>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：注册已关闭。&#x3C;/p>&#x3C;/div>&#x3C;h3 id="常见问题">&#x3C;a href="#常见问题" class="" aria-label="Link to this section">&#x3C;/a>常见问题&#x3C;/h3>&#x3C;h4 id="如果我-8-月-24-日不能参加怎么办">&#x3C;a href="#如果我-8-月-24-日不能参加怎么办" class="" aria-label="Link to this section">&#x3C;/a>如果我 8 月 24 日不能参加怎么办？&#x3C;/h4>&#x3C;p>我们会想你的，但你不会错过！ 所有演讲都将被录制并在会议当天发布。 你可以在方便的时候观看或重看。&#x3C;/p>&#x3C;h4 id="演讲会有文字记录吗">&#x3C;a href="#演讲会有文字记录吗" class="" aria-label="Link to this section">&#x3C;/a>演讲会有文字记录吗？&#x3C;/h4>&#x3C;p>会的。&#x3C;/p>&#x3C;h4 id="有行为准则吗">&#x3C;a href="#有行为准则吗" class="" aria-label="Link to this section">&#x3C;/a>有行为准则吗？&#x3C;/h4>&#x3C;p>当然有。 我们致力于为每个人提供无骚扰的体验。 我们不会容忍任何形式的参与者骚扰。 我们采用了 &#x3C;a href="//github.com/partycorgi/partycorgi/blob/corgi/CODE_OF_CONDUCT.md">Party Corgi Network 的行为准则&#x3C;/a>。 我们将有主持人确保行为准则得到遵守。&#x3C;/p>&#x3C;h4 id="还有其他问题吗">&#x3C;a href="#还有其他问题吗" class="" aria-label="Link to this section">&#x3C;/a>还有其他问题吗？&#x3C;/h4>&#x3C;p>请联系我们。&#x3C;/p>&#x3C;/div></description></item><item><title>Shortcodes</title><dc:creator>John Otander</dc:creator><link>https://mdx.ndjp.net/blog/shortcodes/</link><guid isPermaLink="false">https://mdx.ndjp.net/blog/shortcodes/</guid><pubDate>Tue, 14 May 2019 00:00:00 GMT</pubDate><dc:date>2019-05-14T00:00:00.000Z</dc:date><dc:modified>2021-11-01T00:00:00.000Z</dc:modified><description>&#x3C;div>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：这是一篇旧的博客文章。 其中描述的功能目前记录在 &#x3C;a href="/docs/using-mdx/#mdx-provider">§ MDX provider&#x3C;/a>。 以下内容为历史目的而保留原样。&#x3C;/p>&#x3C;/div>&#x3C;h2 id="shortcodes">&#x3C;a href="#shortcodes" class="" aria-label="Link to this section">&#x3C;/a>Shortcodes&#x3C;/h2>&#x3C;p>MDX v1 中一个令人兴奋的新功能是全局 shortcodes。 它允许你将组件暴露给你的应用或网站中的所有文档。 这对于常用组件（如 YouTube 嵌入、Twitter 卡片或在文档中频繁使用的 其他任何内容）是一个很有用的功能。&#x3C;/p>&#x3C;p>如果你有一个 MDX 文档的应用程序包装器， 你可以使用 &#x3C;code>MDXProvider&#x3C;/code> 添加组件：&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>src/App.js&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x3C;span>import&#x3C;/span> &#x3C;span>React&#x3C;/span> &#x3C;span>from&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>react&#x3C;span>'&#x3C;/span>&#x3C;/span>
&#x3C;span>import&#x3C;/span> {&#x3C;span>MDXProvider&#x3C;/span>} &#x3C;span>from&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>@mdx-js/react&#x3C;span>'&#x3C;/span>&#x3C;/span>
&#x3C;span>import&#x3C;/span> {&#x3C;span>TomatoBox&#x3C;/span>, &#x3C;span>Twitter&#x3C;/span>, &#x3C;span>YouTube&#x3C;/span>} &#x3C;span>from&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>./ui&#x3C;span>'&#x3C;/span>&#x3C;/span>

&#x3C;span>const&#x3C;/span> &#x3C;span>shortcodes&#x3C;/span> &#x3C;span>=&#x3C;/span> {&#x3C;span>TomatoBox&#x3C;/span>, &#x3C;span>Twitter&#x3C;/span>, &#x3C;span>YouTube&#x3C;/span>}

&#x3C;span>export&#x3C;/span> &#x3C;span>default&#x3C;/span> ({&#x3C;span>children&#x3C;/span>}) &#x3C;span>=>&#x3C;/span> (
  &#x26;#x3C;&#x3C;span>MDXProvider&#x3C;/span> &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>shortcodes&#x3C;/span>&#x3C;span>}&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>children&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>MDXProvider&#x3C;/span>>
)
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>然后，任何被 &#x3C;code>App&#x3C;/code> 包裹的 MDX 文档都可以访问 &#x3C;code>YouTube&#x3C;/code>、 &#x3C;code>Twitter&#x3C;/code> 和 &#x3C;code>TomatoBox&#x3C;/code>。 Shortcodes 只不过是组件，所以你可以在 MDX 文档的任何地方 用 JSX 引用它们。&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>example.mdx&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="language-mdx">&#x3C;span># &#x3C;span>Hello world!&#x3C;/span>&#x3C;/span>

Here's a YouTube shortcode:

&#x26;#x3C;&#x3C;span>YouTube&#x3C;/span> &#x3C;span>tweetId&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>1234&#x3C;span>"&#x3C;/span>&#x3C;/span> />

Here's a YouTube shortcode wrapped in TomatoBox:

&#x26;#x3C;&#x3C;span>TomatoBox&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>YouTube&#x3C;/span> &#x3C;span>videoId&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>1234&#x3C;span>"&#x3C;/span>&#x3C;/span> />
&#x26;#x3C;/&#x3C;span>TomatoBox&#x3C;/span>>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>就是这样。 🎉 🚀&#x3C;/p>&#x3C;p>非常感谢 &#x3C;a href="//christopherbiscardi.com">Chris Biscardi&#x3C;/a> 构建了这个功能的大部分。&#x3C;/p>&#x3C;/div></description></item><item><title>MDX 正式发布</title><dc:creator>John Otander</dc:creator><link>https://mdx.ndjp.net/blog/v1/</link><guid isPermaLink="false">https://mdx.ndjp.net/blog/v1/</guid><pubDate>Thu, 11 Apr 2019 00:00:00 GMT</pubDate><dc:date>2019-04-11T00:00:00.000Z</dc:date><dc:modified>2025-01-27T00:00:00.000Z</dc:modified><description>&#x3C;div>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：这是一篇旧的博客文章。 &#x3C;a href="//rauchg.com/2020/vercel">ZEIT 现在是 Vercel&#x3C;/a>。 不再需要 "&#x3C;code>@mdx&#x3C;/code> pragma"。 以下内容为历史目的而保留原样。&#x3C;/p>&#x3C;/div>&#x3C;h2 id="mdx-正式发布">&#x3C;a href="#mdx-正式发布" class="" aria-label="Link to this section">&#x3C;/a>MDX 正式发布&#x3C;/h2>&#x3C;p>距离第一次 MDX 提交已经一年半了，距离 MDX 在 ZEIT Day 上首次公布也一年了。 MDX 是对如何使用组件编写沉浸式内容的一次激进范式转变。 它是一种开放的、&#x3C;a href="//johno.com/authorable-format">可创作的格式&#x3C;/a>， 让写作再次变得&#x3C;em>有趣&#x3C;/em>。&#x3C;/p>&#x3C;p>自从公布 MDX 以来，我们一直在进行大量的 bug 修复、新功能开发、 更好的解析和集成测试。 现在，我们认为它已经准备好了。 &#x3C;strong>我们很高兴终于发布 v1！&#x3C;/strong>&#x3C;/p>&#x3C;h3 id="-有什么新内容">&#x3C;a href="#-有什么新内容" class="" aria-label="Link to this section">&#x3C;/a>🎉 有什么新内容？&#x3C;/h3>&#x3C;p>以下是我们所做工作的简要概述：&#x3C;/p>&#x3C;h4 id="解析">&#x3C;a href="#解析" class="" aria-label="Link to this section">&#x3C;/a>解析&#x3C;/h4>&#x3C;p>MDX 文档解析有了显著改进。 我们不会在这里深入细节，但我们看到了 MDX 在实际项目中的使用方式， 将遇到的边缘情况整合到测试套件中，现在更直观地处理 JSX、 import 和 export。 如果你发现我们没有覆盖的情况，请提交 issue！😸&#x3C;/p>&#x3C;h4 id="remark-mdx">&#x3C;a href="#remark-mdx" class="" aria-label="Link to this section">&#x3C;/a>remark-mdx&#x3C;/h4>&#x3C;p>&#x3C;code>remark-mdx&#x3C;/code> 是 remark 中 MDX 的语法扩展。 它作为 &#x3C;em>&#x3C;a href="//github.com/remarkjs/remark">remark&#x3C;/a> 插件&#x3C;/em>提供 MDX 的解析功能。 这听起来有点元。 它的意思是，以前语法解析部分在库&#x3C;em>内部&#x3C;/em>（无法从外部使用）， 现在它被外部化了（可以从外部使用）。 如果你想检查或转换 MDX 文档，这很有用。 例如，它允许 prettier 等工具使用与 MDX 核心完全相同的解析器。 或者你可以将 &#x3C;code>remark-mdx&#x3C;/code> 与 &#x3C;a href="//github.com/remarkjs/remark-lint">remark-lint&#x3C;/a> 结合使用来检查你的 MDX。&#x3C;/p>&#x3C;h4 id="自定义-pragma">&#x3C;a href="#自定义-pragma" class="" aria-label="Link to this section">&#x3C;/a>自定义 pragma&#x3C;/h4>&#x3C;p>在 v1 中，我们不再使用 &#x3C;code>MDXTag&#x3C;/code>，而是使用包裹 &#x3C;code>React.createElement&#x3C;/code> 的自定义 pragma。 我们决定更新这种方法，使 JSX 输出更易读、 更轻量、更可定制。 &#x3C;strong>这意味着 MDX 可以与任何 React、Vue、Preact 或任何其他支持 JSX 的库一起使用&#x3C;/strong>。&#x3C;/p>&#x3C;p>特别感谢 &#x3C;a href="//github.com/christopherbiscardi">@christopherbiscardi&#x3C;/a> 实现了这个功能。&#x3C;/p>&#x3C;p>&#x3C;a href="../custom-pragma/">阅读博客文章&#x3C;/a>&#x3C;/p>&#x3C;h4 id="-文档">&#x3C;a href="#-文档" class="" aria-label="Link to this section">&#x3C;/a>📚 文档&#x3C;/h4>&#x3C;p>&#x3C;strong>好的库需要好的文档&#x3C;/strong>，所以我们一直在添加内容并 改进整体文档网站体验。&#x3C;/p>&#x3C;ul>&#x3C;li>搜索（感谢 Algolia）&#x3C;/li>&#x3C;li>&#x3C;a href="/guides/">指南&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//zeit.co">通过 ZEIT 自动部署&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//gatsbyjs.org">自定义 Gatsby 主题&#x3C;/a>&#x3C;/li>&#x3C;li>文档重组以提高直觉性&#x3C;/li>&#x3C;li>全面重写页面以提高清晰度&#x3C;/li>&#x3C;/ul>&#x3C;p>特别感谢 &#x3C;a href="//github.com/jxnblks">@jxnblk&#x3C;/a> 和 &#x3C;a href="//github.com/wooorm">@wooorm&#x3C;/a> 帮助改进文档和 更新构建工具。&#x3C;/p>&#x3C;h3 id="破坏性变更">&#x3C;a href="#破坏性变更" class="" aria-label="Link to this section">&#x3C;/a>破坏性变更&#x3C;/h3>&#x3C;p>为了进行一些改进，我们不得不引入一些破坏性变更。 &#x3C;strong>这些是实际生产测试和反馈的结果&#x3C;/strong>。 社区在发展，在过去一年中我们想出了更新、更好的主意。 我们确保影响很小，并编写了完整的迁移指南。&#x3C;/p>&#x3C;ul>&#x3C;li>🚨&#x3C;code>@mdx-js/tag&#x3C;/code> 被 &#x3C;code>@mdx-js/react&#x3C;/code> 和 &#x3C;code>@mdx&#x3C;/code> pragma 取代 — &#x3C;a href="/migrating/v1#pragma">迁移指南&#x3C;/a>&#x3C;/li>&#x3C;li>MDXProvider 现在在嵌套时合并组件上下文 — &#x3C;a href="/migrating/v1#mdxprovider">迁移指南&#x3C;/a>&#x3C;/li>&#x3C;li>React 支持现在要求 &#x3C;code>@mdx-js/react&#x3C;/code> 中 &#x3C;code>>= 16.8&#x3C;/code> — &#x3C;a href="/migrating/v1#react">迁移指南&#x3C;/a>&#x3C;/li>&#x3C;/ul>&#x3C;p>&#x3C;a href="/migrating/v1">阅读完整的 v1 迁移指南&#x3C;/a>&#x3C;/p>&#x3C;h4 id="废弃">&#x3C;a href="#废弃" class="" aria-label="Link to this section">&#x3C;/a>废弃&#x3C;/h4>&#x3C;p>我们只需要引入一个废弃。 &#x3C;code>mdPlugins&#x3C;/code> 和 &#x3C;code>hastPlugins&#x3C;/code> 选项分别被重命名为 &#x3C;code>remarkPlugins&#x3C;/code> 和 &#x3C;code>rehypePlugins&#x3C;/code>。 目前，当使用旧选项时会发出警告。 在 v2 中，旧选项将被移除。&#x3C;/p>&#x3C;h3 id="-增长">&#x3C;a href="#-增长" class="" aria-label="Link to this section">&#x3C;/a>📈 增长&#x3C;/h3>&#x3C;p>每次主要发布都是退后一步反思增长和更大社区发展的好时机。 围绕 MDX 的生态系统已经增长到超出我们梦想的规模。 我们还看到了我们从未想象过的项目/产品/应用。&#x3C;/p>&#x3C;h4 id="数据">&#x3C;a href="#数据" class="" aria-label="Link to this section">&#x3C;/a>数据&#x3C;/h4>&#x3C;ul>&#x3C;li>&#x3C;strong>下载量&#x3C;/strong>：每周 125,000 次，总计 240 万次&#x3C;/li>&#x3C;li>&#x3C;strong>Stars&#x3C;/strong>：6,200&#x3C;/li>&#x3C;li>&#x3C;strong>贡献者&#x3C;/strong>：50&#x3C;/li>&#x3C;li>&#x3C;strong>Pull requests&#x3C;/strong>：281&#x3C;/li>&#x3C;li>&#x3C;strong>提交&#x3C;/strong>：670&#x3C;/li>&#x3C;/ul>&#x3C;p>贡献者的增长是这里最重要的方面之一，因为我们有众多 熟悉 MDX 内部原理的社区成员。 这使我们能够持续改进项目，并在不断增长的贡献者团队中分担工作。&#x3C;/p>&#x3C;p>&#x3C;a href="//github.com/mdx-js/mdx/graphs/contributors?from=2017-12-17&#x26;#x26;to=2019-04-11&#x26;#x26;type=c">查看贡献者图表&#x3C;/a>&#x3C;/p>&#x3C;h4 id="生态系统">&#x3C;a href="#生态系统" class="" aria-label="Link to this section">&#x3C;/a>生态系统&#x3C;/h4>&#x3C;ul>&#x3C;li>&#x3C;a href="//prettier.io">Prettier&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//github.com/pedronauck/docz">Docz&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//github.com/jxnblk/mdx-deck">MDX Deck&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//nextjs.org">Next.js&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//gatsbyjs.org">Gatsby&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//astexplorer.net">AST Explorer&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="/docs/getting-started/#vue">Vue 支持（alpha）&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="//frontarm.com/demoboard/">Demoboard&#x3C;/a>&#x3C;/li>&#x3C;li>&#x3C;a href="/docs/getting-started/#%E7%BC%96%E8%BE%91%E5%99%A8">编辑器&#x3C;/a>&#x3C;/li>&#x3C;/ul>&#x3C;h3 id="-路线图">&#x3C;a href="#-路线图" class="" aria-label="Link to this section">&#x3C;/a>🛣 路线图&#x3C;/h3>&#x3C;p>v1 发布后，我们制定了一个路线图，除了 bug 修复和可能遇到的 解析问题外，我们将在接下来的 6 个月左右继续努力。&#x3C;/p>&#x3C;ul>&#x3C;li>MDXs：&#x3C;a href="//github.com/mdx-js/mdx/issues/454">#454&#x3C;/a>&#x3C;/li>&#x3C;li>交错：&#x3C;a href="//github.com/mdx-js/mdx/issues/195">#195&#x3C;/a>&#x3C;/li>&#x3C;li>全局 shortcodes：&#x3C;a href="//github.com/mdx-js/mdx/pull/508">#508&#x3C;/a>&#x3C;/li>&#x3C;li>稳定的 Vue 支持：&#x3C;a href="//github.com/mdx-js/mdx/issues/238">#238&#x3C;/a>&#x3C;/li>&#x3C;li>Blocks：MDX WYSIWYG：&#x3C;a href="//github.com/blocks/blocks">blocks/blocks&#x3C;/a>&#x3C;/li>&#x3C;li>受 AST Explorer 启发的 MDX playground：&#x3C;a href="//github.com/mdx-js/mdx/issues/220">#220&#x3C;/a>&#x3C;/li>&#x3C;li>新的启动页面：&#x3C;a href="//github.com/mdx-js/mdx/issues/444">#444&#x3C;/a>&#x3C;/li>&#x3C;li>展示页面：&#x3C;a href="//github.com/mdx-js/mdx/issues/414">#414&#x3C;/a>&#x3C;/li>&#x3C;/ul>&#x3C;h4 id="vue-支持">&#x3C;a href="#vue-支持" class="" aria-label="Link to this section">&#x3C;/a>Vue 支持&#x3C;/h4>&#x3C;p>支持 Vue 是 MDX 的一个重要目标，也是我们重新架构 MDX 以使用 自定义 pragma 的主要原因之一。 我们很高兴&#x3C;strong>我们现在有一个可用的 Vue alpha 版本&#x3C;/strong>。 我们希望 Vue 社区的任何人都能尝试一下并提供反馈。&#x3C;/p>&#x3C;p>&#x3C;a href="//github.com/mdx-js/mdx/tree/36cb41b/examples/vue">查看 Vue 示例&#x3C;/a>&#x3C;/p>&#x3C;h4 id="blocks-项目">&#x3C;a href="#blocks-项目" class="" aria-label="Link to this section">&#x3C;/a>Blocks 项目&#x3C;/h4>&#x3C;p>编写 MDX 文档的一个关键缺失方面是编辑体验。 目前，除非你喜欢在文本编辑器中编写原始 Markdown/代码， 否则没有一种易于上手的方式来编写 MDX。 我们想解决这个问题，并已经开始开发一个 MDX "blocks 编辑器"， 它是一个&#x3C;strong>以内容为中心的 WYSIWYG&#x3C;/strong>。 不仅如此，我们将尽一切努力确保编辑器从一开始就尽可能地无障碍。&#x3C;/p>&#x3C;p>当我们准备好 beta 版本时，我们会将其开源并公布，敬请期待。&#x3C;/p>&#x3C;p>&#x3C;a href="//github.com/blocks/blocks">查看 Blocks 项目&#x3C;/a>&#x3C;/p>&#x3C;h3 id="unified-集体">&#x3C;a href="#unified-集体" class="" aria-label="Link to this section">&#x3C;/a>unified 集体&#x3C;/h3>&#x3C;p>MDX 是 unified 集体的一部分，这是一个处理多种内容来源的 开源生态系统。 unified 项目在整个网络中被使用，如果没有我们优秀的赞助商的 财务支持，这一切都不可能实现。&#x3C;/p>&#x3C;ul>&#x3C;li>&#x3C;a href="//zeit.co">ZEIT&#x3C;/a> 🥇&#x3C;/li>&#x3C;li>&#x3C;a href="//gatsbyjs.org">Gatsby&#x3C;/a> 🥇&#x3C;/li>&#x3C;li>&#x3C;a href="//www.holloway.com">Holloway&#x3C;/a> 🥉&#x3C;/li>&#x3C;li>&#x3C;a href="//opencollective.com/unified#budget">支持者&#x3C;/a> 🏆&#x3C;/li>&#x3C;li>&#x3C;a href="//opencollective.com/unified">你？&#x3C;/a>👤&#x3C;/li>&#x3C;/ul>&#x3C;h3 id="-致谢">&#x3C;a href="#-致谢" class="" aria-label="Link to this section">&#x3C;/a>🙏 致谢&#x3C;/h3>&#x3C;p>我们要感谢所有的贡献者和开心的用户。 特别感谢 &#x3C;a href="//github.com/wooorm">@wooorm&#x3C;/a>, &#x3C;a href="//github.com/silvenon">@silvenon&#x3C;/a>, &#x3C;a href="//github.com/timneutkens">@timneutkens&#x3C;/a>, &#x3C;a href="//github.com/christopherbiscardi">@ChristopherBiscardi&#x3C;/a>, &#x3C;a href="//github.com/jxnblk">@jxnblk&#x3C;/a>, &#x3C;a href="//github.com/alexandernanberg">@alexandernanberg&#x3C;/a>, &#x3C;a href="//github.com/jescalan">@jescalan&#x3C;/a>, &#x3C;a href="//github.com/Jarred-Sumner">@Jarred-Sumner&#x3C;/a>, &#x3C;a href="//github.com/leimonio">@leimonio&#x3C;/a>, &#x3C;a href="//github.com/ticky">@ticky&#x3C;/a>, &#x3C;a href="//github.com/jamesknelson">@jamesknelson&#x3C;/a>, &#x3C;a href="//github.com/pshrmn">@pshrmn&#x3C;/a>, &#x3C;a href="//github.com/rauchg">@rauchg&#x3C;/a>, &#x3C;a href="//github.com/joelhooks">@joelhooks&#x3C;/a>, &#x3C;a href="//github.com/jlengstorf">@jlengstorf&#x3C;/a>, &#x3C;a href="//github.com/johnlindquist">@johnlindquist&#x3C;/a>, &#x3C;a href="//github.com/kyleamathews">@kyleamathews&#x3C;/a>, &#x3C;a href="//github.com/kentcdodds">@kentcdodds&#x3C;/a>, &#x3C;a href="//github.com/wesbos">@wesbos&#x3C;/a>, &#x3C;a href="//github.com/rosew">@rosew&#x3C;/a>, &#x3C;a href="//github.com/pedronauck">@pedronauck&#x3C;/a>, &#x3C;a href="//github.com/tayiorbeii">@tayiorbeii&#x3C;/a>, &#x3C;a href="//github.com/nickbender">@nickbender&#x3C;/a>, &#x3C;a href="//github.com/ntaylor89">@ntaylor89&#x3C;/a>, &#x3C;a href="//github.com/mxstbr">@mxstbr&#x3C;/a>, &#x3C;a href="//github.com/manovotny">@manovotny&#x3C;/a>, &#x3C;a href="//github.com/xyc">@xyc&#x3C;/a>, &#x3C;a href="//github.com/filoxo">@filoxo&#x3C;/a>, &#x3C;a href="//github.com/millette">@millette&#x3C;/a>, &#x3C;a href="//github.com/hugmanrique">@hugmanrique&#x3C;/a>, &#x3C;a href="//github.com/johnsherrard">@johnsherrard&#x3C;/a>, &#x3C;a href="//github.com/sw-yx">@sw-yx&#x3C;/a>, 以及任何我们可能遗漏的人。&#x3C;/p>&#x3C;/div></description></item><item><title>自定义 pragma</title><dc:creator>Chris Biscardi</dc:creator><link>https://mdx.ndjp.net/blog/custom-pragma/</link><guid isPermaLink="false">https://mdx.ndjp.net/blog/custom-pragma/</guid><pubDate>Mon, 11 Mar 2019 00:00:00 GMT</pubDate><dc:date>2019-03-11T00:00:00.000Z</dc:date><dc:modified>2021-11-01T00:00:00.000Z</dc:modified><description>&#x3C;div>&#x3C;div>&#x3C;p>&#x3C;strong>注意&#x3C;/strong>：这是一篇旧的博客文章。 其中描述的步骤不再由 MDX 执行。 它现在首先使用 JavaScript AST，而不是生成 JSX 字符串。 也不再需要在客户端使用将 MDX 与特定框架结合的额外胶水代码。 更多信息请参见 &#x3C;a href="/docs/using-mdx/#mdx-%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86">§ MDX 的工作原理&#x3C;/a> 和 &#x3C;a href="/packages/mdx/#architecture">¶ 架构&#x3C;/a>。 以下内容为历史目的而保留原样。&#x3C;/p>&#x3C;/div>&#x3C;h2 id="自定义-pragma">&#x3C;a href="#自定义-pragma" class="" aria-label="Link to this section">&#x3C;/a>自定义 pragma&#x3C;/h2>&#x3C;p>&#x3C;code>MDXTag&#x3C;/code> 是 MDX 用自定义 React 组件替换 &#x3C;code>&#x26;#x3C;pre>&#x3C;/code> 和 &#x3C;code>&#x26;#x3C;h1>&#x3C;/code> 等 HTML 原语的关键部分，对于那些不了解的人来说。 &#x3C;a href="//www.christopherbiscardi.com/post/codeblocks-mdx-and-mdx-utils">我之前写过&#x3C;/a> 关于尝试用自定义代码组件替换 &#x3C;code>&#x26;#x3C;pre>&#x3C;/code> 标签时 &#x3C;code>MDXTag&#x3C;/code> 的工作方式。 &#x3C;a href="//github.com/ChristopherBiscardi/gatsby-mdx/blob/00769a1b72455f40843cd2f09ee34fd63b009fb2/packages/mdx-utils/index.js">mdx-utils&#x3C;/a> 包含了在 &#x3C;code>pre&#x3C;/code> 和 &#x3C;code>code&#x3C;/code> 之间的 &#x3C;code>MDXTag&#x3C;/code> 元素中适当传递 props 的方法论。&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>TypeScript&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x3C;span>exports&#x3C;/span>.&#x3C;span>preToCodeBlock&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>preProps&#x3C;/span> &#x3C;span>=>&#x3C;/span> {
  &#x3C;span>if&#x3C;/span> (
    &#x3C;span>// children is MDXTag&#x3C;/span>
    &#x3C;span>preProps&#x3C;/span>.&#x3C;span>children&#x3C;/span> &#x3C;span>&#x26;#x26;&#x26;#x26;&#x3C;/span>
    &#x3C;span>// MDXTag props&#x3C;/span>
    &#x3C;span>preProps&#x3C;/span>.&#x3C;span>children&#x3C;/span>.&#x3C;span>props&#x3C;/span> &#x3C;span>&#x26;#x26;&#x26;#x26;&#x3C;/span>
    &#x3C;span>// if MDXTag is going to render a &#x26;#x3C;code>&#x3C;/span>
    &#x3C;span>preProps&#x3C;/span>.&#x3C;span>children&#x3C;/span>.&#x3C;span>props&#x3C;/span>.&#x3C;span>name&#x3C;/span> &#x3C;span>===&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>code&#x3C;span>'&#x3C;/span>&#x3C;/span>
  ) {
    &#x3C;span>// we have a &#x26;#x3C;pre>&#x26;#x3C;code> situation&#x3C;/span>
    &#x3C;span>const&#x3C;/span> {
      &#x3C;span>children&#x3C;/span>: &#x3C;span>codeString&#x3C;/span>,
      &#x3C;span>props&#x3C;/span>: {&#x3C;span>className&#x3C;/span>, &#x3C;span>...&#x3C;/span>&#x3C;span>props&#x3C;/span>}
    } &#x3C;span>=&#x3C;/span> &#x3C;span>preProps&#x3C;/span>.&#x3C;span>children&#x3C;/span>.&#x3C;span>props&#x3C;/span>

    &#x3C;span>return&#x3C;/span> {
      codeString: &#x3C;span>codeString&#x3C;/span>.&#x3C;span>trim&#x3C;/span>(),
      language: &#x3C;span>className&#x3C;/span> &#x3C;span>&#x26;#x26;&#x26;#x26;&#x3C;/span> &#x3C;span>className&#x3C;/span>.&#x3C;span>split&#x3C;/span>(&#x3C;span>&#x3C;span>'&#x3C;/span>-&#x3C;span>'&#x3C;/span>&#x3C;/span>)[&#x3C;span>1&#x3C;/span>],
      &#x3C;span>...&#x3C;/span>&#x3C;span>props&#x3C;/span>
    }
  }
  &#x3C;span>return&#x3C;/span> &#x3C;span>undefined&#x3C;/span>
}
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>所以 &#x3C;code>MDXTag&#x3C;/code> 是所有其他 MDX 渲染元素中间的一个真实组件。 此处包含所有代码以供参考。&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>TypeScript&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x3C;span>import&#x3C;/span> &#x3C;span>React&#x3C;/span>, {&#x3C;span>Component&#x3C;/span>} &#x3C;span>from&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>react&#x3C;span>'&#x3C;/span>&#x3C;/span>

&#x3C;span>import&#x3C;/span> {&#x3C;span>withMDXComponents&#x3C;/span>} &#x3C;span>from&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>./mdx-provider&#x3C;span>'&#x3C;/span>&#x3C;/span>

&#x3C;span>const&#x3C;/span> &#x3C;span>defaults&#x3C;/span> &#x3C;span>=&#x3C;/span> {
  inlineCode: &#x3C;span>&#x3C;span>'&#x3C;/span>code&#x3C;span>'&#x3C;/span>&#x3C;/span>,
  wrapper: &#x3C;span>&#x3C;span>'&#x3C;/span>div&#x3C;span>'&#x3C;/span>&#x3C;/span>
}

&#x3C;span>class&#x3C;/span> &#x3C;span>MDXTag&#x3C;/span> &#x3C;span>extends&#x3C;/span> &#x3C;span>Component&#x3C;/span> {
  &#x3C;span>render&#x3C;/span>() {
    &#x3C;span>const&#x3C;/span> {
      &#x3C;span>name&#x3C;/span>,
      &#x3C;span>parentName&#x3C;/span>,
      &#x3C;span>props&#x3C;/span>: &#x3C;span>childProps&#x3C;/span> &#x3C;span>=&#x3C;/span> {},
      &#x3C;span>children&#x3C;/span>,
      &#x3C;span>components&#x3C;/span> &#x3C;span>=&#x3C;/span> {},
      &#x3C;span>Layout&#x3C;/span>,
      &#x3C;span>layoutProps&#x3C;/span>
    } &#x3C;span>=&#x3C;/span> &#x3C;span>this&#x3C;/span>.&#x3C;span>props&#x3C;/span>

    &#x3C;span>const&#x3C;/span> &#x3C;span>Component&#x3C;/span> &#x3C;span>=&#x3C;/span>
      &#x3C;span>components&#x3C;/span>[&#x3C;span>&#x3C;span>`&#x3C;/span>${&#x3C;span>parentName&#x3C;/span>}.${&#x3C;span>name&#x3C;/span>}&#x3C;span>`&#x3C;/span>&#x3C;/span>] &#x3C;span>||&#x3C;/span>
      &#x3C;span>components&#x3C;/span>[&#x3C;span>name&#x3C;/span>] &#x3C;span>||&#x3C;/span>
      &#x3C;span>defaults&#x3C;/span>[&#x3C;span>name&#x3C;/span>] &#x3C;span>||&#x3C;/span>
      &#x3C;span>name&#x3C;/span>

    &#x3C;span>if&#x3C;/span> (&#x3C;span>Layout&#x3C;/span>) {
      &#x3C;span>return&#x3C;/span> (
        &#x26;#x3C;&#x3C;span>Layout&#x3C;/span> &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>components&#x3C;/span>&#x3C;span>}&#x3C;/span> &#x3C;span>{&#x3C;/span>&#x3C;span>...&#x3C;/span>&#x3C;span>layoutProps&#x3C;/span>&#x3C;span>}&#x3C;/span>>
          &#x26;#x3C;&#x3C;span>Component&#x3C;/span> &#x3C;span>{&#x3C;/span>&#x3C;span>...&#x3C;/span>&#x3C;span>childProps&#x3C;/span>&#x3C;span>}&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>children&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>Component&#x3C;/span>>
        &#x26;#x3C;/&#x3C;span>Layout&#x3C;/span>>
      )
    }

    &#x3C;span>return&#x3C;/span> &#x26;#x3C;&#x3C;span>Component&#x3C;/span> &#x3C;span>{&#x3C;/span>&#x3C;span>...&#x3C;/span>&#x3C;span>childProps&#x3C;/span>&#x3C;span>}&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>children&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>Component&#x3C;/span>>
  }
}

&#x3C;span>export&#x3C;/span> &#x3C;span>default&#x3C;/span> &#x3C;span>withMDXComponents&#x3C;/span>(&#x3C;span>MDXTag&#x3C;/span>)
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>&#x3C;code>MDXTag&#x3C;/code> 用于 hast 到 estree 的转换， 这是 MDX AST 管道的最后一步。 每个可渲染元素都被包裹在 &#x3C;code>MDXTag&#x3C;/code> 中，&#x3C;code>MDXTag&#x3C;/code> 负责稍后渲染元素。&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>TypeScript&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x3C;span>return&#x3C;/span> &#x3C;span>&#x3C;span>`&#x3C;/span>&#x26;#x3C;MDXTag name="${&#x3C;span>node&#x3C;/span>.&#x3C;span>tagName&#x3C;/span>}" components={components}${&#x3C;/span>
&#x3C;span>  &#x3C;span>parentNode&#x3C;/span>.&#x3C;span>tagName&#x3C;/span> &#x3C;span>?&#x3C;/span> &#x3C;span>`&#x3C;/span> parentName="${&#x3C;span>parentNode&#x3C;/span>.&#x3C;span>tagName&#x3C;/span>}"&#x3C;span>`&#x3C;/span> &#x3C;span>:&#x3C;/span> &#x3C;span>''&#x3C;/span>&#x3C;/span>
&#x3C;span>}${&#x3C;span>props&#x3C;/span> &#x3C;span>?&#x3C;/span> &#x3C;span>`&#x3C;/span> props={${&#x3C;span>props&#x3C;/span>}}&#x3C;span>`&#x3C;/span> &#x3C;span>:&#x3C;/span> &#x3C;span>''&#x3C;/span>}>${&#x3C;span>children&#x3C;/span>}&#x26;#x3C;/MDXTag>&#x3C;span>`&#x3C;/span>&#x3C;/span>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;h3 id="具体示例">&#x3C;a href="#具体示例" class="" aria-label="Link to this section">&#x3C;/a>具体示例&#x3C;/h3>&#x3C;p>以下 MDX&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>MDX&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="language-mdx">&#x3C;span># &#x3C;span>a title&#x3C;/span>&#x3C;/span>

    and such

testing
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>转换为以下 React 代码&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>TypeScript&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x3C;span>export&#x3C;/span> &#x3C;span>default&#x3C;/span> ({&#x3C;span>components&#x3C;/span>, &#x3C;span>...&#x3C;/span>&#x3C;span>props&#x3C;/span>}) &#x3C;span>=>&#x3C;/span> (
  &#x26;#x3C;&#x3C;span>MDXTag&#x3C;/span> &#x3C;span>name&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>wrapper&#x3C;span>"&#x3C;/span>&#x3C;/span> &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>components&#x3C;/span>&#x3C;span>}&#x3C;/span>>
    &#x26;#x3C;&#x3C;span>MDXTag&#x3C;/span> &#x3C;span>name&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>h1&#x3C;span>"&#x3C;/span>&#x3C;/span> &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>components&#x3C;/span>&#x3C;span>}&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>`&#x3C;/span>a title&#x3C;span>`&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>MDXTag&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>'&#x3C;/span> &#x3C;span>'&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>
    &#x26;#x3C;&#x3C;span>MDXTag&#x3C;/span> &#x3C;span>name&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>pre&#x3C;span>"&#x3C;/span>&#x3C;/span> &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>components&#x3C;/span>&#x3C;span>}&#x3C;/span>>
      &#x26;#x3C;&#x3C;span>MDXTag&#x3C;/span>
        &#x3C;span>name&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>code&#x3C;span>"&#x3C;/span>&#x3C;/span>
        &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>components&#x3C;/span>&#x3C;span>}&#x3C;/span>
        &#x3C;span>parentName&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>pre&#x3C;span>"&#x3C;/span>&#x3C;/span>
        &#x3C;span>props&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>{metaString: &#x3C;span>null&#x3C;/span>}&#x3C;span>}&#x3C;/span>
      >&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>`&#x3C;/span>and such &#x3C;span>`&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>MDXTag&#x3C;/span>>
    &#x26;#x3C;/&#x3C;span>MDXTag&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>'&#x3C;/span> &#x3C;span>'&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>
    &#x26;#x3C;&#x3C;span>MDXTag&#x3C;/span> &#x3C;span>name&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>p&#x3C;span>"&#x3C;/span>&#x3C;/span> &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>components&#x3C;/span>&#x3C;span>}&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>`&#x3C;/span>testing&#x3C;span>`&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>MDXTag&#x3C;/span>>
  &#x26;#x3C;/&#x3C;span>MDXTag&#x3C;/span>>
)
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>生成以下 HTML&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>HTML&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="language-html">&#x26;#x3C;&#x3C;span>div&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>h1&#x3C;/span>>a title&#x26;#x3C;/&#x3C;span>h1&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>pre&#x3C;/span>>
    &#x26;#x3C;&#x3C;span>code&#x3C;/span>>and such&#x26;#x3C;/&#x3C;span>code&#x3C;/span>>
  &#x26;#x3C;/&#x3C;span>pre&#x3C;/span>>
  &#x26;#x3C;&#x3C;span>p&#x3C;/span>>testing&#x26;#x3C;/&#x3C;span>p&#x3C;/span>>
&#x26;#x3C;/&#x3C;span>div&#x3C;/span>>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;h3 id="createelement">&#x3C;a href="#createelement" class="" aria-label="Link to this section">&#x3C;/a>createElement&#x3C;/h3>&#x3C;p>使用新方法，上述 MDX 转换为这个新的 React 代码&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>TypeScript&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x3C;span>const&#x3C;/span> &#x3C;span>layoutProps&#x3C;/span> &#x3C;span>=&#x3C;/span> {}
&#x3C;span>export&#x3C;/span> &#x3C;span>default&#x3C;/span> &#x3C;span>function&#x3C;/span> &#x3C;span>MDXContent&#x3C;/span>({&#x3C;span>components&#x3C;/span>, &#x3C;span>...&#x3C;/span>&#x3C;span>props&#x3C;/span>}) {
  &#x3C;span>return&#x3C;/span> (
    &#x26;#x3C;&#x3C;span>MDXLayout&#x3C;/span>
      &#x3C;span>{&#x3C;/span>&#x3C;span>...&#x3C;/span>&#x3C;span>layoutProps&#x3C;/span>&#x3C;span>}&#x3C;/span>
      &#x3C;span>{&#x3C;/span>&#x3C;span>...&#x3C;/span>&#x3C;span>props&#x3C;/span>&#x3C;span>}&#x3C;/span>
      &#x3C;span>components&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>{&#x3C;/span>&#x3C;span>components&#x3C;/span>&#x3C;span>}&#x3C;/span>
      &#x3C;span>mdxType&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>MDXLayout&#x3C;span>"&#x3C;/span>&#x3C;/span>
    >
      &#x26;#x3C;&#x3C;span>h1&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>`&#x3C;/span>a title&#x3C;span>`&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>h1&#x3C;/span>>
      &#x26;#x3C;&#x3C;span>pre&#x3C;/span>>
        &#x26;#x3C;&#x3C;span>code&#x3C;/span> &#x3C;span>parentName&#x3C;/span>&#x3C;span>=&#x3C;/span>&#x3C;span>&#x3C;span>"&#x3C;/span>pre&#x3C;span>"&#x3C;/span>&#x3C;/span> &#x3C;span>{&#x3C;/span>&#x3C;span>...&#x3C;/span>{}&#x3C;span>}&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>`&#x3C;/span>and such&#x3C;/span>
&#x3C;span>&#x3C;span>`&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>code&#x3C;/span>>
      &#x26;#x3C;/&#x3C;span>pre&#x3C;/span>>
      &#x26;#x3C;&#x3C;span>p&#x3C;/span>>&#x3C;span>{&#x3C;/span>&#x3C;span>&#x3C;span>`&#x3C;/span>testing&#x3C;span>`&#x3C;/span>&#x3C;/span>&#x3C;span>}&#x3C;/span>&#x26;#x3C;/&#x3C;span>p&#x3C;/span>>
    &#x26;#x3C;/&#x3C;span>MDXLayout&#x3C;/span>>
  )
}

&#x3C;span>MDXContent&#x3C;/span>.&#x3C;span>isMDXComponent&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>true&#x3C;/span>
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;p>注意现在 React 元素可以直接阅读，不再包裹 &#x3C;code>MDXTag&#x3C;/code>。&#x3C;/p>&#x3C;p>现在我们清理了中间表示，需要确保具有与旧 &#x3C;code>MDXTag&#x3C;/code> 相同的功能。 这是通过自定义 &#x3C;code>createElement&#x3C;/code> 实现来完成的。 通常使用 React 时，我们使用 &#x3C;code>React.createElement&#x3C;/code> 来渲染屏幕上的元素。 即使你使用 JSX 也是如此，因为像 &#x3C;code>&#x26;#x3C;div>&#x3C;/code> 这样的 JSX 标签会编译为 &#x3C;code>createElement&#x3C;/code> 调用。 所以这次我们不再使用 &#x3C;code>React.createElement&#x3C;/code>，而是使用我们自己的。&#x3C;/p>&#x3C;p>这里重现了我们的 &#x3C;code>createElement&#x3C;/code> 函数以及我们如何决定 MDX 是否应该接管 &#x3C;code>createElement&#x3C;/code> 调用的渲染逻辑。&#x3C;/p>&#x3C;div>&#x3C;div>&#x3C;span>TypeScript&#x3C;/span>&#x3C;/div>&#x3C;pre>&#x3C;code class="">&#x3C;span>export&#x3C;/span> &#x3C;span>default&#x3C;/span> &#x3C;span>function&#x3C;/span> (&#x3C;span>type&#x3C;/span>, &#x3C;span>props&#x3C;/span>) {
  &#x3C;span>const&#x3C;/span> &#x3C;span>args&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>arguments&#x3C;/span>
  &#x3C;span>const&#x3C;/span> &#x3C;span>mdxType&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>props&#x3C;/span> &#x3C;span>&#x26;#x26;&#x26;#x26;&#x3C;/span> &#x3C;span>props&#x3C;/span>.&#x3C;span>mdxType&#x3C;/span>

  &#x3C;span>if&#x3C;/span> (&#x3C;span>typeof&#x3C;/span> &#x3C;span>type&#x3C;/span> &#x3C;span>===&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>string&#x3C;span>'&#x3C;/span>&#x3C;/span> &#x3C;span>||&#x3C;/span> &#x3C;span>mdxType&#x3C;/span>) {
    &#x3C;span>const&#x3C;/span> &#x3C;span>argsLength&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>args&#x3C;/span>.&#x3C;span>length&#x3C;/span>

    &#x3C;span>const&#x3C;/span> &#x3C;span>createElementArgArray&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>new&#x3C;/span> &#x3C;span>Array&#x3C;/span>(&#x3C;span>argsLength&#x3C;/span>)
    &#x3C;span>createElementArgArray&#x3C;/span>[&#x3C;span>0&#x3C;/span>] &#x3C;span>=&#x3C;/span> &#x3C;span>MDXCreateElement&#x3C;/span>

    &#x3C;span>const&#x3C;/span> &#x3C;span>newProps&#x3C;/span> &#x3C;span>=&#x3C;/span> {}
    &#x3C;span>for&#x3C;/span> (&#x3C;span>let&#x3C;/span> &#x3C;span>key&#x3C;/span> &#x3C;span>in&#x3C;/span> &#x3C;span>props&#x3C;/span>) {
      &#x3C;span>if&#x3C;/span> (&#x3C;span>hasOwnProperty&#x3C;/span>.&#x3C;span>call&#x3C;/span>(&#x3C;span>props&#x3C;/span>, &#x3C;span>key&#x3C;/span>)) {
        &#x3C;span>newProps&#x3C;/span>[&#x3C;span>key&#x3C;/span>] &#x3C;span>=&#x3C;/span> &#x3C;span>props&#x3C;/span>[&#x3C;span>key&#x3C;/span>]
      }
    }
    &#x3C;span>newProps&#x3C;/span>.&#x3C;span>originalType&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>type&#x3C;/span>
    &#x3C;span>newProps&#x3C;/span>[&#x3C;span>TYPE_PROP_NAME&#x3C;/span>] &#x3C;span>=&#x3C;/span> &#x3C;span>typeof&#x3C;/span> &#x3C;span>type&#x3C;/span> &#x3C;span>===&#x3C;/span> &#x3C;span>&#x3C;span>'&#x3C;/span>string&#x3C;span>'&#x3C;/span>&#x3C;/span> &#x3C;span>?&#x3C;/span> &#x3C;span>type&#x3C;/span> &#x3C;span>:&#x3C;/span> &#x3C;span>mdxType&#x3C;/span>

    &#x3C;span>createElementArgArray&#x3C;/span>[&#x3C;span>1&#x3C;/span>] &#x3C;span>=&#x3C;/span> &#x3C;span>newProps&#x3C;/span>

    &#x3C;span>for&#x3C;/span> (&#x3C;span>let&#x3C;/span> &#x3C;span>i&#x3C;/span> &#x3C;span>=&#x3C;/span> &#x3C;span>2&#x3C;/span>; &#x3C;span>i&#x3C;/span> &#x3C;span>&#x26;#x3C;&#x3C;/span> &#x3C;span>argsLength&#x3C;/span>; &#x3C;span>i&#x3C;/span>&#x3C;span>++&#x3C;/span>) {
      &#x3C;span>createElementArgArray&#x3C;/span>[&#x3C;span>i&#x3C;/span>] &#x3C;span>=&#x3C;/span> &#x3C;span>args&#x3C;/span>[&#x3C;span>i&#x3C;/span>]
    }

    &#x3C;span>return&#x3C;/span> &#x3C;span>React&#x3C;/span>.&#x3C;span>createElement&#x3C;/span>.&#x3C;span>apply&#x3C;/span>(&#x3C;span>null&#x3C;/span>, &#x3C;span>createElementArgArray&#x3C;/span>)
  }

  &#x3C;span>return&#x3C;/span> &#x3C;span>React&#x3C;/span>.&#x3C;span>createElement&#x3C;/span>.&#x3C;span>apply&#x3C;/span>(&#x3C;span>null&#x3C;/span>, &#x3C;span>args&#x3C;/span>)
}
&#x3C;/code>&#x3C;/pre>&#x3C;/div>&#x3C;h3 id="vue">&#x3C;a href="#vue" class="" aria-label="Link to this section">&#x3C;/a>Vue&#x3C;/h3>&#x3C;p>使用自定义 &#x3C;code>createElement&#x3C;/code> 的新输出格式的一个很酷的应用是， 我们现在可以为 Vue 和其他框架编写它的版本。 由于 pragma 插入是 webpack（或其他打包器）加载器的责任， 只要我们有一个 Vue &#x3C;code>createElement&#x3C;/code> 可以指向，在 mdx-loader 中 切换 pragma 可以作为一个选项。&#x3C;/p>&#x3C;/div></description></item></channel></rss>
