入门
¥Getting started
本文介绍如何将 MDX 集成到你的项目中。它展示了如何将 MDX 与你选择的打包器和 JSX 运行时结合使用。 要了解 MDX 格式的工作原理,我们建议你从 § 什么是 MDX 开始。当你完成设置并准备好使用 MDX 时,请参阅 § 使用 MDX。
¥This article explains how to integrate MDX into your project. It shows how to use MDX with your bundler and JSX runtime of choice. To understand how the MDX format works, we recommend that you start with § What is MDX. See § Using MDX when you’re all set up and ready to use MDX.
内容
¥Contents
先决条件
¥Prerequisites
MDX 依赖于 JSX,因此你的项目也需要支持 JSX。任何 JSX 运行时(React、Preact、Vue 等)都可以。请注意,我们确实为你将 JSX 编译为 JavaScript,因此你无需进行设置。
¥MDX relies on JSX, so it’s required that your project supports JSX as well. Any JSX runtime (React, Preact, Vue, etc.) will do. Note that we do compile JSX to JavaScript for you so you don’t have to set that up.
所有 @mdx-js/*
包都是用现代 JavaScript 编写的。需要 Node.js 16 或更高版本才能使用它们。我们的软件包也是 仅限 ESM。
¥All @mdx-js/*
packages are written in modern JavaScript. A Node.js version of 16 or later is needed to use them. Our packages are also ESM only.
快速开始
¥Quick start
打包器
¥Bundler
MDX 是一种编译为 JavaScript 的语言。(我们还将常规 Markdown 编译为 JavaScript。)最简单的入门方法是使用打包器的集成(如果你有的话):
¥MDX is a language that’s compiled to JavaScript. (We also compile regular markdown to JavaScript.) The easiest way to get started is to use an integration for your bundler if you have one:
如果你使用 esbuild(或 Bun),请安装并配置
@mdx-js/esbuild
¥if you use esbuild (or Bun), install and configure
@mdx-js/esbuild
如果你使用 Rollup(或 Vite),请安装并配置
@mdx-js/rollup
¥if you use Rollup (or Vite), install and configure
@mdx-js/rollup
如果你使用 webpack(或 Next.js),请安装并配置
@mdx-js/loader
¥if you use webpack (or Next.js), install and configure
@mdx-js/loader
你还可以在没有打包程序的情况下使用 MDX:
¥You can also use MDX without bundlers:
你可以使用
@mdx-js/node-loader
在 Node.js 中导入 MDX 文件¥you can import MDX files in Node.js with
@mdx-js/node-loader
你可以使用我们的核心编译器
@mdx-js/mdx
来编译 MDX 文件¥you can use our core compiler
@mdx-js/mdx
to compile MDX files你可以使用我们的核心编译器
@mdx-js/mdx
到 evaluate(编译并运行)MDX 文件¥you can use our core compiler
@mdx-js/mdx
to evaluate (compile and run) MDX files
有关这些工具的更多信息,请参阅其专用部分:¶ Next.js、¶ Node.js、¶ Rollup、¶ Vite、¶ esbuild 和 ¶ Webpack。
¥For more info on these tools, see their dedicated sections: ¶ Next.js, ¶ Node.js, ¶ Rollup, ¶ Vite, ¶ esbuild, and ¶ webpack.
JSX
现在你已经设置了集成或 @mdx-js/mdx
本身,是时候配置 JSX 运行时了。
¥Now you’ve set up an integration or @mdx-js/mdx
itself, it’s time to configure your JSX runtime.
如果你使用 React,这是默认的;可选择安装和配置
@mdx-js/react
¥if you use React, that’s the default; optionally install and configure
@mdx-js/react
如果使用 Preact,请将
jsxImportSource
于ProcessorOptions
设置为'preact'
;可选择安装和配置@mdx-js/preact
¥if you use Preact, set
jsxImportSource
inProcessorOptions
to'preact'
; optionally install and configure@mdx-js/preact
如果你使用 Svelte,请安装
svelte-jsx
,并将jsxImportSource
于ProcessorOptions
设置为'svelte-jsx'
¥if you use Svelte, install
svelte-jsx
, and setjsxImportSource
inProcessorOptions
to'svelte-jsx'
如果使用 Vue,请将
jsxImportSource
于ProcessorOptions
设置为'vue'
;可选择安装和配置@mdx-js/vue
¥if you use Vue, set
jsxImportSource
inProcessorOptions
to'vue'
; optionally install and configure@mdx-js/vue
如果使用 Solid,请将
jsxImportSource
于ProcessorOptions
设置为'solid-js/h'
¥if you use Solid, set
jsxImportSource
inProcessorOptions
to'solid-js/h'
如果你使用 Emotion,请将
jsxImportSource
于ProcessorOptions
设置为'@emotion/react'
¥if you use Emotion, set
jsxImportSource
inProcessorOptions
to'@emotion/react'
如果你使用主题 UI,请安装并配置
@mdx-js/react
,然后将 MDX 内容封装在<ThemeProvider />
中¥if you use Theme UI, install and configure
@mdx-js/react
, then wrap your MDX content in a<ThemeProvider />
通过设置 jsxImportSource
于 ProcessorOptions
支持其他 JSX 运行时。
¥Other JSX runtimes are supported by setting jsxImportSource
in ProcessorOptions
.
有关这些工具的更多信息,请参阅其专用部分:¶ Emotion、¶ Preact、¶ React、¶ Solid、¶ Svelte、¶ 主题用户界面 和 ¶ Vue。
¥For more info on these tools, see their dedicated sections: ¶ Emotion, ¶ Preact, ¶ React, ¶ Solid, ¶ Svelte, ¶ Theme UI, and ¶ Vue.
编辑
¥Editor
你可以通过向编辑器添加对 MDX 的支持来增强使用 MDX 的体验:
¥You can enhance the experience of using MDX by adding support of it to your editor:
如果你使用 VS Code,请尝试
mdx-js/mdx-analyzer
¥if you use VS Code, try
mdx-js/mdx-analyzer
如果你使用 Vim,请尝试
jxnblk/vim-mdx-js
¥if you use Vim, try
jxnblk/vim-mdx-js
如果你使用 Sublime Text,请尝试
jonsuh/mdx-sublime
¥if you use Sublime Text, try
jonsuh/mdx-sublime
如果你使用 JetBrains IntelliJ/WebStorm,请尝试
JetBrains/mdx-intellij-plugin
¥if you use JetBrains IntelliJ/WebStorm, try
JetBrains/mdx-intellij-plugin
为我们的 VS Code 扩展提供支持并用于高亮 GitHub 上的代码块的语法高亮保留在 wooorm/markdown-tm-language
。
¥The syntax highlighting that powers our VS Code extension and that is used to highlight code blocks on GitHub is maintained at wooorm/markdown-tm-language
.
类型
¥Types
Expand example of typed imports
First install the package:
npm install @types/mdx
…TypeScript should automatically pick it up:
import Post from './post.mdx' // `Post` is now typed.
(alias) function Post(props: MDXProps): Element
import Post
An function component which renders the MDX content using JSX.
- @param props This value is be available as the named variable
props
inside the MDX component. - @returns A JSX element. The meaning of this may depend on the project configuration. I.e. it could be a React, Preact, or Vuex element.
我们的包上打有 TypeScript。为了使类型起作用,必须键入 JSX
命名空间。这是通过安装和使用框架类型来完成的,例如 @types/react
。
¥Our packages are typed with TypeScript. For types to work, the JSX
namespace must be typed. This is done by installing and using the types of your framework, such as @types/react
.
要启用导入的 .mdx
、.md
等类型,请安装并使用 @types/mdx
。该包还导出几个有用的类型,例如代表 components
属性的 MDXComponents
。你可以像这样导入它们:
¥To enable types for imported .mdx
, .md
, etc., install and use @types/mdx
. This package also exports several useful types, such as MDXComponents
which represents the components
prop. You can import them like so:
import type {MDXComponents} from 'mdx/types.js'
(alias) type MDXComponents = NestedMDXComponents & {
symbol?: Component<React.SVGProps<SVGSymbolElement>>;
object?: Component<React.DetailedHTMLProps<React.ObjectHTMLAttributes<HTMLObjectElement>, HTMLObjectElement>>;
... 175 more ...;
view?: Component<...>;
} & {
...;
}
import MDXComponents
MDX components may be passed as the components
.
The key is the name of the element to override. The value is the component to render instead.
安全
¥Security
MDX 是一种编程语言。如果你信任你的作者,那很好。如果不这样做,那就不安全。
¥MDX is a programming language. If you trust your authors, that’s fine. If you don’t, it’s unsafe.
不要让互联网上的随机人员编写 MDX。如果你这样做,你可能想考虑将 <iframe>
与 sandbox
一起使用,但安全性很难,而且这似乎并不是 100%。对于 Node.js,vm2 听起来很有趣。但是你可能还应该使用 Docker 或类似工具对整个操作系统进行沙箱处理,执行限速,并确保在花费太长时间时可以终止进程。
¥Do not let random people from the internet write MDX. If you do, you might want to look into using <iframe>
s with sandbox
, but security is hard, and that doesn’t seem to be 100%. For Node.js, vm2 sounds interesting. But you should probably also sandbox the whole OS using Docker or similar, perform rate limiting, and make sure processes can be killed when taking too long.
集成
¥Integrations
打包者
¥Bundlers
esbuild
Expand example
import mdx from '@mdx-js/esbuild'
import esbuild from 'esbuild'
await esbuild.build({
entryPoints: ['index.mdx'],
format: 'esm',
outfile: 'output.js',
plugins: [mdx({/* jsxImportSource: …, otherOptions… */})]
})
(alias) function mdx(options?: Readonly<Options> | null | undefined): esbuild.Plugin
import mdx
Create an esbuild plugin to compile MDX to JS.
esbuild takes care of turning modern JavaScript features into syntax that works wherever you want it to. With other integrations you might need to use Babel for this, but with esbuild that’s not needed. See esbuild’s docs for more info.
- @param options Configuration (optional).
- @return Plugin.
import esbuild
import esbuild
function build<{
entryPoints: string[];
format: "esm";
outfile: string;
plugins: esbuild.Plugin[];
}>(options: esbuild.SameShape<esbuild.BuildOptions, {
entryPoints: string[];
format: "esm";
outfile: string;
plugins: esbuild.Plugin[];
}>): Promise<...>
This function invokes the "esbuild" command-line tool for you. It returns a promise that either resolves with a "BuildResult" object or rejects with a "BuildFailure" object.
- Works in node: yes
- Works in browser: yes
Documentation: https://esbuild.github.io/api/#build
(property) entryPoints: string[]
(property) format: "esm"
(property) outfile: string
(property) plugins: esbuild.Plugin[]
(alias) mdx(options?: Readonly<Options> | null | undefined): esbuild.Plugin
import mdx
Create an esbuild plugin to compile MDX to JS.
esbuild takes care of turning modern JavaScript features into syntax that works wherever you want it to. With other integrations you might need to use Babel for this, but with esbuild that’s not needed. See esbuild’s docs for more info.
- @param options Configuration (optional).
- @return Plugin.
我们支持 esbuild。安装并配置 esbuild 插件 @mdx-js/esbuild
。配置你的 JSX 运行时 取决于你使用哪一种(React、Preact、Vue 等)。
¥We support esbuild. Install and configure the esbuild plugin @mdx-js/esbuild
. Configure your JSX runtime depending on which one (React, Preact, Vue, etc.) you use.
要使用比用户支持的更现代的 JavaScript 功能,配置 esbuild 的 target
.
¥To use more modern JavaScript features than what your users support, configure esbuild’s target
.
另请参阅你可能正在使用的 ¶ Bun 以获取更多信息。
¥See also ¶ Bun, which you might be using, for more info.
Rollup
Expand example
/**
* @import {RollupOptions} from 'rollup'
*/
import mdx from '@mdx-js/rollup'
import {babel} from '@rollup/plugin-babel'
/** @type {RollupOptions} */
const config = {
// …
plugins: [
// …
mdx({/* jsxImportSource: …, otherOptions… */}),
// Babel is optional:
babel({
// Also run on what used to be `.mdx` (but is now JS):
extensions: ['.js', '.jsx', '.cjs', '.mjs', '.md', '.mdx'],
// Other options…
})
]
}
export default config
(alias) function mdx(options?: Readonly<Options> | null | undefined): Plugin
import mdx
Plugin to compile MDX w/ rollup.
- @param options Configuration (optional).
- @return Rollup plugin.
(alias) function babel(options?: RollupBabelInputPluginOptions): Plugin
import babel
A Rollup plugin for seamless integration between Rollup and Babel.
- @param options - Plugin options.
- @returns Plugin instance.
const config: RollupOptions
- @type {RollupOptions}
(property) InputOptions.plugins?: InputPluginOption
(alias) mdx(options?: Readonly<Options> | null | undefined): Plugin
import mdx
Plugin to compile MDX w/ rollup.
- @param options Configuration (optional).
- @return Rollup plugin.
(alias) babel(options?: RollupBabelInputPluginOptions): Plugin
import babel
A Rollup plugin for seamless integration between Rollup and Babel.
- @param options - Plugin options.
- @returns Plugin instance.
(property) RollupBabelInputPluginOptions.extensions?: string[]
An array of file extensions that Babel should transpile. If you want to transpile TypeScript files with this plugin it's essential to include .ts and .tsx in this option.
- @default ['.js', '.jsx', '.es6', '.es', '.mjs']
const config: RollupOptions
- @type {RollupOptions}
我们支持 Rollup。安装并配置 Rollup 插件 @mdx-js/rollup
。配置你的 JSX 运行时 取决于你使用哪一种(React、Preact、Vue 等)。
¥We support Rollup. Install and configure the Rollup plugin @mdx-js/rollup
. Configure your JSX runtime depending on which one (React, Preact, Vue, etc.) you use.
要使用比用户支持的更现代的 JavaScript 功能,安装并配置 @rollup/plugin-babel
.
¥To use more modern JavaScript features than what your users support, install and configure @rollup/plugin-babel
.
如果你通过它使用 Rollup,另请参阅 ¶ Vite 以获取更多信息。
¥See also ¶ Vite, if you use Rollup through it, for more info.
Webpack
Expand example
/**
* @import {Options} from '@mdx-js/loader'
* @import {Configuration} from 'webpack'
*/
/** @type {Configuration} */
const webpackConfig = {
module: {
// …
rules: [
// …
{
test: /\.mdx?$/,
use: [
// Babel is optional:
{loader: 'babel-loader', options: {}},
{
loader: '@mdx-js/loader',
/** @type {Options} */
options: {/* jsxImportSource: …, otherOptions… */}
}
]
}
]
}
}
export default webpackConfig
const webpackConfig: Configuration
- @type {Configuration}
(property) Configuration.module?: ModuleOptions
Options affecting the normal modules (NormalModuleFactory
).
(property) ModuleOptions.rules?: (false | "" | 0 | RuleSetRule | "..." | null | undefined)[]
An array of rules applied for modules.
(property) RuleSetRule.test?: string | RegExp | ((value: string) => boolean) | RuleSetLogicalConditionsAbsolute | RuleSetConditionAbsolute[]
Shortcut for resource.test.
(property) RuleSetRule.use?: string | (string | false | 0 | {
ident?: string;
loader?: string;
options?: string | {
[index: string]: any;
};
} | ((data: object) => string | {
ident?: string;
loader?: string;
options?: string | {
[index: string]: any;
};
} | __TypeWebpackOptions | __Type_2[]) | null | undefined)[] | ((data: {
resource: string;
realResource: string;
resourceQuery: string;
issuer: string;
compiler: string;
}) => __Type_2[]) | {
...;
} | __TypeWebpackOptions
Modifiers applied to the module when rule is matched.
(property) loader?: string
Loader name.
(property) options?: string | {
[index: string]: any;
}
Loader options.
(property) loader?: string
Loader name.
(property) options?: string | {
[index: string]: any;
}
Loader options.
const webpackConfig: Configuration
- @type {Configuration}
我们支持 webpack。安装并配置 webpack 加载器 @mdx-js/loader
。配置你的 JSX 运行时 取决于你使用哪一种(React、Preact、Vue 等)。
¥We support webpack. Install and configure the webpack loader @mdx-js/loader
. Configure your JSX runtime depending on which one (React, Preact, Vue, etc.) you use.
要使用比用户支持的更现代的 JavaScript 功能,安装并配置 babel-loader
.
¥To use more modern JavaScript features than what your users support, install and configure babel-loader
.
如果你通过它使用 webpack,另请参阅 ¶ Next.js 以获取更多信息。
¥See also ¶ Next.js, if you use webpack through it, for more info.
构建系统
¥Build systems
Vite
Expand example
import mdx from '@mdx-js/rollup'
import {defineConfig} from 'vite'
const viteConfig = defineConfig({
plugins: [
mdx(/* jsxImportSource: …, otherOptions… */)
]
})
export default viteConfig
(alias) function mdx(options?: Readonly<Options> | null | undefined): Plugin
import mdx
Plugin to compile MDX w/ rollup.
- @param options Configuration (optional).
- @return Rollup plugin.
(alias) function defineConfig(config: UserConfig): UserConfig (+3 overloads)
import defineConfig
Type helper to make it easier to use vite.config.ts accepts a direct {@link UserConfig } object, or a function that returns it. The function receives a {@link ConfigEnv } object.
const viteConfig: UserConfig
(alias) defineConfig(config: UserConfig): UserConfig (+3 overloads)
import defineConfig
Type helper to make it easier to use vite.config.ts accepts a direct {@link UserConfig } object, or a function that returns it. The function receives a {@link ConfigEnv } object.
(property) UserConfig.plugins?: PluginOption[]
Array of vite plugins to use.
(alias) mdx(options?: Readonly<Options> | null | undefined): Plugin
import mdx
Plugin to compile MDX w/ rollup.
- @param options Configuration (optional).
- @return Rollup plugin.
const viteConfig: UserConfig
我们支持 Vite。安装并配置 Rollup 插件 @mdx-js/rollup
。配置你的 JSX 运行时 取决于你使用哪一种(React、Preact、Vue 等)。
¥We support Vite. Install and configure the Rollup plugin @mdx-js/rollup
. Configure your JSX runtime depending on which one (React, Preact, Vue, etc.) you use.
要使用比用户支持的更现代的 JavaScript 功能,配置 Vite 的 build.target
.
¥To use more modern JavaScript features than what your users support, configure Vite’s build.target
.
注意:如果还使用 @vitejs/plugin-react
,则必须强制 @mdx-js/rollup
在其之前的 pre
阶段运行:
¥Note: If you also use @vitejs/plugin-react
, you must force @mdx-js/rollup
to run in the pre
phase before it:
// …
const viteConfig = defineConfig({
plugins: [
{enforce: 'pre', ...mdx({/* jsxImportSource: …, otherOptions… */})},
react({include: /\.(jsx|js|mdx|md|tsx|ts)$/})
]
})
// …
const viteConfig: UserConfig
(alias) defineConfig(config: UserConfig): UserConfig (+3 overloads)
import defineConfig
Type helper to make it easier to use vite.config.ts accepts a direct {@link UserConfig } object, or a function that returns it. The function receives a {@link ConfigEnv } object.
(property) UserConfig.plugins?: PluginOption[]
Array of vite plugins to use.
(property) Plugin<any>.enforce?: "pre" | "post"
Enforce plugin invocation tier similar to webpack loaders. Hooks ordering is still subject to the order
property in the hook object.
Plugin invocation order:
- alias resolution
enforce: 'pre'
plugins- vite core plugins
- normal plugins
- vite build plugins
enforce: 'post'
plugins- vite build post plugins
(alias) mdx(options?: Readonly<Options> | null | undefined): Plugin
import mdx
Plugin to compile MDX w/ rollup.
- @param options Configuration (optional).
- @return Rollup plugin.
(alias) react(opts?: Options): PluginOption[]
import react
(property) Options.include?: string | RegExp | (string | RegExp)[]
另请参阅 Vite 中使用的 ¶ Rollup,如果你使用它,请参阅 ¶ Vue 以获取更多信息。
¥See also ¶ Rollup which is used in Vite and see ¶ Vue if you’re using that, for more info.
编译器
¥Compilers
Babel
Expand plugin and sample use
This plugin:
/**
* @import {ParseResult, ParserOptions} from '@babel/parser'
* @import {File} from '@babel/types'
* @import {Program} from 'estree'
* @import {Plugin} from 'unified'
*/
import parser from '@babel/parser'
import {compileSync} from '@mdx-js/mdx'
import estreeToBabel from 'estree-to-babel'
/**
* Plugin that tells Babel to use a different parser.
*/
export function babelPluginSyntaxMdx() {
return {parserOverride: babelParserWithMdx}
}
/**
* Parser that handles MDX with `@mdx-js/mdx` and passes other things through
* to the normal Babel parser.
* * @param {string} value
* @param {ParserOptions} options
* @returns {ParseResult<File>}
*/
function babelParserWithMdx(value, options) {
/** @type {string | undefined} */
// @ts-expect-error: babel changed the casing at some point and the types are out of date.
const filename = options.sourceFilename || options.sourceFileName
if (filename && /\.mdx?$/.test(filename)) {
// Babel does not support async parsers, unfortunately.
const file = compileSync(
{value, path: options.sourceFilename},
{recmaPlugins: [recmaBabel] /* jsxImportSource: …, otherOptions… */}
)
return /** @type {ParseResult<File>} */ (file.result)
}
return parser.parse(value, options)
}
/**
* A “recma” plugin is a unified plugin that runs on the estree (used by
* `@mdx-js/mdx` and much of the JS ecosystem but not Babel).
* This plugin defines `'estree-to-babel'` as the compiler,
* which means that the resulting Babel tree is given back by `compileSync`.
* * @type {Plugin<[], Program, unknown>}
*/
function recmaBabel() {
// @ts-expect-error: `Program` is similar enough to a unist node.
this.compiler = compiler
/**
* @param {Program} tree
* @returns {unknown}
*/
function compiler(tree) {
// @ts-expect-error: TS2349: This expression *is* callable, `estreeToBabel` types are wrong.
return estreeToBabel(tree)
}
}
import parser
(alias) function compileSync(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): VFile
import compileSync
Synchronously compile MDX to JS.
When possible please use the async compile
.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Compiled file.
import estreeToBabel
function babelPluginSyntaxMdx(): {
parserOverride: (value: string, options: parser.ParserOptions) => parser.ParseResult<File>;
}
Plugin that tells Babel to use a different parser.
(property) parserOverride: (value: string, options: parser.ParserOptions) => parser.ParseResult<File>
function babelParserWithMdx(value: string, options: parser.ParserOptions): parser.ParseResult<File>
Parser that handles MDX with @mdx-js/mdx
and passes other things through
to the normal Babel parser.
- @param value
- @param options
- @returns
function babelParserWithMdx(value: string, options: parser.ParserOptions): parser.ParseResult<File>
Parser that handles MDX with @mdx-js/mdx
and passes other things through
to the normal Babel parser.
- @param value
- @param options
- @returns
(parameter) value: string
- @param value
(parameter) options: parser.ParserOptions
- @param options
const filename: string | undefined
- @type {string | undefined}
(parameter) options: parser.ParserOptions
- @param options
(property) ParserOptions.sourceFilename?: string | undefined
Correlate output AST nodes with their source filename. Useful when generating code and source maps from the ASTs of multiple input files.
(parameter) options: parser.ParserOptions
- @param options
any
const filename: string | undefined
- @type {string | undefined}
(method) RegExp.test(string: string): boolean
Returns a Boolean value that indicates whether or not a pattern exists in a searched string.
- @param string String on which to perform the search.
const filename: string
- @type {string | undefined}
const file: VFile
(alias) compileSync(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): VFile
import compileSync
Synchronously compile MDX to JS.
When possible please use the async compile
.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Compiled file.
(property) value: string
(property) path: string | undefined
(parameter) options: parser.ParserOptions
- @param options
(property) ParserOptions.sourceFilename?: string | undefined
Correlate output AST nodes with their source filename. Useful when generating code and source maps from the ASTs of multiple input files.
(property) recmaPlugins?: PluggableList | null | undefined
List of recma plugins (optional); this is a new ecosystem, currently in beta, to transform esast trees (JavaScript)
class recmaBabel
function recmaBabel(this: Processor): void | Transformer<Program, Node> | undefined
A “recma” plugin is a unified plugin that runs on the estree (used by
@mdx-js/mdx
and much of the JS ecosystem but not Babel).
This plugin defines 'estree-to-babel'
as the compiler,
which means that the resulting Babel tree is given back by compileSync
.
- @type {Plugin<[], Program, unknown>}
const file: VFile
(property) VFile.result: unknown
Custom, non-string, compiled, representation.
This is used by unified to store non-string results. One example is when turning markdown into React nodes.
- @type {unknown}
import parser
(alias) parse(input: string, options?: parser.ParserOptions): parser.ParseResult<File>
export parse
Parse the provided code as an entire ECMAScript program.
(parameter) value: string
- @param value
(parameter) options: parser.ParserOptions
- @param options
function recmaBabel(this: Processor): void | Transformer<Program, Node> | undefined
A “recma” plugin is a unified plugin that runs on the estree (used by
@mdx-js/mdx
and much of the JS ecosystem but not Babel).
This plugin defines 'estree-to-babel'
as the compiler,
which means that the resulting Babel tree is given back by compileSync
.
- @type {Plugin<[], Program, unknown>}
(property) recmaBabel.compiler: (tree: Program) => unknown
(local function) compiler(tree: Program): unknown
- @param tree
- @returns
(local function) compiler(tree: Program): unknown
- @param tree
- @returns
(parameter) tree: Program
- @param tree
import estreeToBabel
(parameter) tree: Program
- @param tree
…can be used like so with the Babel API:
import babel from '@babel/core'
import {babelPluginSyntaxMdx} from './plugin.js'
const document = '# Hello, world!'
// Note that a filename must be set for our plugin to know it’s MDX instead of JS.
const result = await babel.transformAsync(document, {
filename: 'example.mdx',
plugins: [babelPluginSyntaxMdx]
})
console.log(result)
import babel
(alias) function babelPluginSyntaxMdx(): {
parserOverride: (value: string, options: babel.ParserOptions) => ParseResult<babel.types.File>;
}
import babelPluginSyntaxMdx
Plugin that tells Babel to use a different parser.
const document: "# Hello, world!"
const result: babel.BabelFileResult | null
import babel
function transformAsync(code: string, opts?: babel.TransformOptions): Promise<babel.BabelFileResult | null>
Transforms the passed in code. Calling a callback with an object with the generated code, source map, and AST.
const document: "# Hello, world!"
(property) TransformOptions.filename?: string | null | undefined
Filename for use in errors etc
Default: "unknown"
(property) TransformOptions.plugins?: babel.PluginItem[] | null | undefined
List of plugins to load and use
Default: []
(alias) function babelPluginSyntaxMdx(): {
parserOverride: (value: string, options: babel.ParserOptions) => ParseResult<babel.types.File>;
}
import babelPluginSyntaxMdx
Plugin that tells Babel to use a different parser.
namespace console
var console: Console
The console
module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers.
The module exports two specific components:
- A
Console
class with methods such asconsole.log()
,console.error()
andconsole.warn()
that can be used to write to any Node.js stream. - A global
console
instance configured to write toprocess.stdout
andprocess.stderr
. The globalconsole
can be used without callingrequire('console')
.
Warning: The global console object's methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O
for more information.
Example using the global console
:
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
Example using the Console
class:
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
- @see source
(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to stdout
with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to printf(3)
(the arguments are all passed to util.format()
).
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
See util.format()
for more information.
- @since v0.1.100
const result: babel.BabelFileResult | null
你可能应该直接使用 Rollup 或 webpack 而不是 Babel,因为这样可以提供最好的界面。可以在 Babel 中使用 @mdx-js/mdx
,而且速度更快一些,因为如果无论如何使用 Babel,它会跳过 @mdx-js/mdx
序列化和 Babel 解析。
¥You should probably use Rollup or webpack instead of Babel directly as that gives the best interface. It is possible to use @mdx-js/mdx
in Babel and it’s a bit faster, as it skips @mdx-js/mdx
serialization and Babel parsing, if Babel is used anyway.
Babel 不支持其解析器的语法扩展(它有“语法”插件,但这些插件只能打开或关闭内部标志)。它确实支持设置不同的解析器。这又让我们选择是使用 @mdx-js/mdx
还是 @babel/parser
。
¥Babel does not support syntax extensions to its parser (it has “syntax” plugins but those only turn internal flags on or off). It does support setting a different parser. Which in turn lets us choose whether to use the @mdx-js/mdx
or @babel/parser
.
站点生成器
¥Site generators
Astro
Astro 有自己的 MDX 集成。你可以添加与 Astro CLI 的集成:npx astro add mdx
。
¥Astro has its own MDX integration. You can add the integration with the Astro CLI: npx astro add mdx
.
此基本设置允许你导入 Markdown、Astro 组件和 MDX 文件作为组件。有关如何在 MDX 文件中使用框架中的组件的信息,请参阅 Astro 的 框架组件指南。
¥This base setup lets you import markdown, Astro components, and MDX files as components. See Astro’s Framework components guide for info on how to use components from frameworks in your MDX files.
有关如何结合 Astro 和 MDX 的更多信息,请参阅 Astro 的 MDX 集成文档。
¥For more on how to combine Astro and MDX, see Astro’s MDX integration docs.
Docusaurus
Docusaurus 默认支持 MDX。有关如何将 MDX 与 Docusaurus 结合使用的信息,请参阅 Docusaurus 的 MDX 和 React 指南。
¥Docusaurus supports MDX by default. See Docusaurus’ MDX and React guide for info on how to use MDX with Docusaurus.
Gatsby
Gatsby 有自己的插件来支持 MDX。请参阅 gatsby-plugin-mdx
了解如何将 MDX 与 Gatsby 结合使用。
¥Gatsby has its own plugin to support MDX. See gatsby-plugin-mdx
on how to use MDX with Gatsby.
Next.js
Expand example
import nextMdx from '@next/mdx'
const withMdx = nextMdx({
// By default only the `.mdx` extension is supported.
extension: /\.mdx?$/,
options: {/* otherOptions… */}
})
const nextConfig = withMdx({
// Support MDX files as pages:
pageExtensions: ['md', 'mdx', 'tsx', 'ts', 'jsx', 'js'],
})
export default nextConfig
(alias) function nextMdx(options?: nextMdx.NextMDXOptions): WithMDX
(alias) namespace nextMdx
import nextMdx
const withMdx: WithMDX
(property) nextMDX.NextMDXOptions.extension?: RuleSetConditionAbsolute
A webpack rule test to match files to treat as MDX.
- @default /.mdx$/
- @example // Support both .md and .mdx files. /.mdx?$/
(property) nextMDX.NextMDXOptions.options?: Options
The options to pass to MDX.
const nextConfig: NextConfig
const withMdx: (config: NextConfig) => NextConfig
(property) pageExtensions: string[]
const nextConfig: NextConfig
Next.js 有自己的 MDX 集成。安装并配置 @next/mdx
。
¥Next.js has its own MDX integration. Install and configure @next/mdx
.
不要将 providerImportSource
和 @mdx-js/react
与 Next 一起使用来注入组件。请改为添加 mdx-components.tsx
(在 src/
或 /
中)文件。请参阅 在 nextjs.org
上配置 MDX 了解更多信息。
¥Do not use providerImportSource
and @mdx-js/react
with Next to inject components. Add an mdx-components.tsx
(in src/
or /
) file instead. See Configuring MDX on nextjs.org
for more info.
Parcel
Parcel 有自己的插件来支持 MDX。请参阅 @parcel/transformer-mdx
了解如何将 MDX 与 Parcel 结合使用。
¥Parcel has its own plugin to support MDX. See @parcel/transformer-mdx
on how to use MDX with Parcel.
注意:官方 Parcel 插件目前未维护。对于维护的替代方案,请尝试 parcel-transformer-mdx
。
¥Note: the official Parcel plugin is currently not maintained. For a maintained alternative, try parcel-transformer-mdx
.
JSX 运行时
¥JSX runtimes
Emotion
Expand example
import {compile} from '@mdx-js/mdx'
const js = String(await compile('# hi', {jsxImportSource: '@emotion/react', /* otherOptions… */}))
(alias) function compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
const js: string
var String: StringConstructor
(value?: any) => string
Allows manipulation and formatting of text strings and determination and location of substrings within strings.
(alias) compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
(property) jsxImportSource?: string | null | undefined
Place to import automatic JSX runtimes from (default: 'react'
); when in the automatic
runtime, this is used to define an import for Fragment
, jsx
, jsxDEV
, and jsxs
.
当 jsxImportSource
于 ProcessorOptions
设置为 '@emotion/react'
时,支持 Emotion。你可以选择安装和配置 @mdx-js/react
以支持基于上下文的组件传递。
¥Emotion is supported when jsxImportSource
in ProcessorOptions
is set to '@emotion/react'
. You can optionally install and configure @mdx-js/react
to support context based component passing.
另请参阅 ¶ React(用于 Emotion),并参阅 ¶ Rollup 和 ¶ Webpack(你可能正在使用)以获取更多信息。
¥See also ¶ React, which is used in Emotion, and see ¶ Rollup and ¶ webpack, which you might be using, for more info.
Ink
Expand example
# Hi!
import React from 'react'
import {Text, render} from 'ink'
import Content from './example.mdx' // Assumes an integration is used to compile MDX -> JS.
render(
React.createElement(Content, {
components: {
h1(properties) {
// @ts-expect-error: `Ink` types don’t match w/ `exactOptionalPropertyTypes: true`
return React.createElement(Text, {bold: true, ...properties})
},
p: Text
}
})
)
(alias) namespace React
import React
(alias) function Text({ color, backgroundColor, dimColor, bold, italic, underline, strikethrough, inverse, wrap, children, }: Props): React.JSX.Element | null
import Text
This component can display text, and change its style to make it colorful, bold, underline, italic or strikethrough.
(alias) const render: (node: React.ReactNode, options?: NodeJS.WriteStream | RenderOptions) => Instance
import render
Mount a component and render the output.
(alias) function Content(props: MDXProps): Element
import Content
An function component which renders the MDX content using JSX.
- @param props This value is be available as the named variable
props
inside the MDX component. - @returns A JSX element. The meaning of this may depend on the project configuration. I.e. it could be a React, Preact, or Vuex element.
(alias) render(node: React.ReactNode, options?: NodeJS.WriteStream | RenderOptions): Instance
import render
Mount a component and render the output.
(alias) namespace React
import React
function React.createElement(type: "input", props?: (React.InputHTMLAttributes<HTMLInputElement> & React.ClassAttributes<HTMLInputElement>) | null, ...children: React.ReactNode[]): React.DetailedReactHTMLElement<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> (+6 overloads)
(alias) function Content(props: MDXProps): Element
import Content
An function component which renders the MDX content using JSX.
- @param props This value is be available as the named variable
props
inside the MDX component. - @returns A JSX element. The meaning of this may depend on the project configuration. I.e. it could be a React, Preact, or Vuex element.
(property) components: {
h1(properties: React.DetailedHTMLProps<React.HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>): React.DetailedReactHTMLElement<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>;
p: ({ color, backgroundColor, dimColor, bold, italic, underline, strikethrough, inverse, wrap, children, }: Props) => React.JSX.Element | null;
}
(method) h1(properties: React.DetailedHTMLProps<React.HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>): React.DetailedReactHTMLElement<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>
(parameter) properties: React.DetailedHTMLProps<React.HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>
(alias) namespace React
import React
function React.createElement(type: "input", props?: (React.InputHTMLAttributes<HTMLInputElement> & React.ClassAttributes<HTMLInputElement>) | null, ...children: React.ReactNode[]): React.DetailedReactHTMLElement<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> (+6 overloads)
(alias) function Text({ color, backgroundColor, dimColor, bold, italic, underline, strikethrough, inverse, wrap, children, }: Props): React.JSX.Element | null
import Text
This component can display text, and change its style to make it colorful, bold, underline, italic or strikethrough.
(property) bold: boolean
(parameter) properties: React.DetailedHTMLProps<React.HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>
No overload matches this call.
The last overload gave the following error.
Type '({ color, backgroundColor, dimColor, bold, italic, underline, strikethrough, inverse, wrap, children, }: Props) => Element | null' is not assignable to type 'Component<DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>> | undefined'.
Type '({ color, backgroundColor, dimColor, bold, italic, underline, strikethrough, inverse, wrap, children, }: Props) => Element | null' is not assignable to type '(props: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>) => ReactNode'.
Types of parameters '__0' and 'props' are incompatible.
Type 'DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>' is not assignable to type 'Props' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties.
Types of property 'color' are incompatible.
Type 'string | undefined' is not assignable to type 'LiteralUnion<keyof ForegroundColor, string>'.
Type 'undefined' is not assignable to type 'LiteralUnion<keyof ForegroundColor, string>'. (2769)
(property) p: ({ color, backgroundColor, dimColor, bold, italic, underline, strikethrough, inverse, wrap, children, }: Props) => React.JSX.Element | null
(alias) function Text({ color, backgroundColor, dimColor, bold, italic, underline, strikethrough, inverse, wrap, children, }: Props): React.JSX.Element | null
import Text
This component can display text, and change its style to make it colorful, bold, underline, italic or strikethrough.
Can be used with:
node --loader=@mdx-js/node-loader example.js
Ink 使用 React JSX 运行时,因此进行设置。你需要将 HTML 元素替换为 Ink 的组件。请参阅 § 组件表 了解它们是什么,以及 Ink 的文档了解它们可以用什么替换。
¥Ink uses the React JSX runtime, so set that up. You will need to swap HTML elements out for Ink’s components. See § Table of components for what those are and Ink’s docs on what they can be replaced with.
另请参阅 ¶ Node.js 和 ¶ React 了解更多信息。
¥See also ¶ Node.js and ¶ React for more info.
Preact
Expand example
import {compile} from '@mdx-js/mdx'
const js = String(await compile('# hi', {jsxImportSource: 'preact', /* otherOptions… */}))
(alias) function compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
const js: string
var String: StringConstructor
(value?: any) => string
Allows manipulation and formatting of text strings and determination and location of substrings within strings.
(alias) compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
(property) jsxImportSource?: string | null | undefined
Place to import automatic JSX runtimes from (default: 'react'
); when in the automatic
runtime, this is used to define an import for Fragment
, jsx
, jsxDEV
, and jsxs
.
当 jsxImportSource
于 ProcessorOptions
设置为 'preact'
时支持 Preact。你可以选择安装和配置 @mdx-js/preact
以支持基于上下文的组件传递。
¥Preact is supported when jsxImportSource
in ProcessorOptions
is set to 'preact'
. You can optionally install and configure @mdx-js/preact
to support context based component passing.
另请参阅你可能正在使用的 ¶ Rollup、¶ esbuild 和 ¶ Webpack,了解更多信息。
¥See also ¶ Rollup, ¶ esbuild, and ¶ webpack, which you might be using, for more info.
React
默认支持 React。你可以选择安装和配置 @mdx-js/react
以支持基于上下文的组件传递。
¥React is supported by default. You can optionally install and configure @mdx-js/react
to support context based component passing.
另请参阅你可能正在使用的 ¶ Rollup、¶ esbuild 和 ¶ Webpack,了解更多信息。
¥See also ¶ Rollup, ¶ esbuild, and ¶ webpack, which you might be using, for more info.
主题界面
¥Theme UI
主题界面 有自己的插件来支持 MDX。请参阅 @theme-ui/mdx
了解如何将 MDX 与主题 UI 结合使用。
¥Theme UI has its own plugin to support MDX. See @theme-ui/mdx
on how to use MDX with Theme UI.
Svelte
Expand example
import {compile} from '@mdx-js/mdx'
const js = String(await compile('# hi', {jsxImportSource: 'svelte-jsx', /* otherOptions… */}))
(alias) function compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
const js: string
var String: StringConstructor
(value?: any) => string
Allows manipulation and formatting of text strings and determination and location of substrings within strings.
(alias) compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
(property) jsxImportSource?: string | null | undefined
Place to import automatic JSX runtimes from (default: 'react'
); when in the automatic
runtime, this is used to define an import for Fragment
, jsx
, jsxDEV
, and jsxs
.
当 jsxImportSource
于 ProcessorOptions
设置为 'svelte-jsx'
时,支持 Svelte。
¥Svelte is supported when jsxImportSource
in ProcessorOptions
is set to 'svelte-jsx'
.
另请参阅你可能正在使用的 ¶ Rollup、¶ esbuild 和 ¶ Webpack,了解更多信息。
¥See also ¶ Rollup, ¶ esbuild, and ¶ webpack, which you might be using, for more info.
Vue
Expand example
import {compile} from '@mdx-js/mdx'
const js = String(await compile('# hi', {jsxImportSource: 'vue', /* otherOptions… */}))
(alias) function compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
const js: string
var String: StringConstructor
(value?: any) => string
Allows manipulation and formatting of text strings and determination and location of substrings within strings.
(alias) compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
(property) jsxImportSource?: string | null | undefined
Place to import automatic JSX runtimes from (default: 'react'
); when in the automatic
runtime, this is used to define an import for Fragment
, jsx
, jsxDEV
, and jsxs
.
当 jsxImportSource
于 ProcessorOptions
设置为 'vue'
时,支持 Vue。你可以选择安装和配置 @mdx-js/vue
以支持基于上下文的组件传递。
¥Vue is supported when jsxImportSource
in ProcessorOptions
is set to 'vue'
. You can optionally install and configure @mdx-js/vue
to support context based component passing.
另请参阅你可能正在使用的 ¶ Vite 以获取更多信息。
¥See also ¶ Vite, which you might be using, for more info.
Solid
Expand example
import {compile} from '@mdx-js/mdx'
const js = String(await compile('# hi', {jsxImportSource: 'solid-js/h', /* otherOptions… */}))
(alias) function compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
const js: string
var String: StringConstructor
(value?: any) => string
Allows manipulation and formatting of text strings and determination and location of substrings within strings.
(alias) compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>
import compile
Compile MDX to JS.
- @param vfileCompatible MDX document to parse.
- @param compileOptions Compile configuration (optional).
- @return Promise to compiled file.
(property) jsxImportSource?: string | null | undefined
Place to import automatic JSX runtimes from (default: 'react'
); when in the automatic
runtime, this is used to define an import for Fragment
, jsx
, jsxDEV
, and jsxs
.
当 jsxImportSource
于 ProcessorOptions
设置为 'solid-js/h'
时支持实心。
¥Solid is supported when jsxImportSource
in ProcessorOptions
is set to 'solid-js/h'
.
另请参阅你可能正在使用的 ¶ Rollup 和 ¶ Vite 以获取更多信息。
¥See also ¶ Rollup and ¶ Vite, which you might be using, for more info.
JavaScript 引擎
¥JavaScript engines
Node.js
可以使用 @mdx-js/node-loader
.MDX 文件导入 Node 中。有关如何配置它的信息,请参阅其自述文件。
¥MDX files can be imported in Node by using @mdx-js/node-loader
. See its readme on how to configure it.
Bun
可以使用 @mdx-js/esbuild
在 Bun 中导入 MDX 文件。
¥MDX files can be imported in Bun by using @mdx-js/esbuild
.
Expand example
preload = ["./bun-mdx.ts"]
import mdx from '@mdx-js/esbuild'
import {type BunPlugin, plugin} from 'bun'
await plugin(mdx() as unknown as BunPlugin)
(alias) function mdx(options?: Readonly<Options> | null | undefined): Plugin
import mdx
Create an esbuild plugin to compile MDX to JS.
esbuild takes care of turning modern JavaScript features into syntax that works wherever you want it to. With other integrations you might need to use Babel for this, but with esbuild that’s not needed. See esbuild’s docs for more info.
- @param options Configuration (optional).
- @return Plugin.
(alias) interface BunPlugin
import BunPlugin
(alias) const plugin: BunRegisterPlugin
import plugin
(alias) plugin<BunPlugin>(options: BunPlugin): void | Promise<void>
import plugin
(alias) mdx(options?: Readonly<Options> | null | undefined): Plugin
import mdx
Create an esbuild plugin to compile MDX to JS.
esbuild takes care of turning modern JavaScript features into syntax that works wherever you want it to. With other integrations you might need to use Babel for this, but with esbuild that’s not needed. See esbuild’s docs for more info.
- @param options Configuration (optional).
- @return Plugin.
(alias) interface BunPlugin
import BunPlugin
进一步阅读
¥Further reading
如果你想在项目中使用 MDX 内容,请参阅 § 使用 MDX
¥If you want to use MDX content in your project, see § Using MDX
如果你在集成 MDX 时遇到错误,请参阅 § MDX 故障排除 或 § 支持
¥If you’re getting errors integrating MDX, see § Troubleshooting MDX or § Support