Use a custom Astro component to render and syntax highlight code snippets in your MDX files.
View a demo of the integration in action on StackBlitz.
Due to the extra configuration needed, you must manually install this integration.
This integration depends on the
AutoImport
and@astrojs/mdx
integrations.
npm install -D astro-mdx-code-blocks astro-auto-import @astrojs/mdx
Create a component in your project that will be used to render fenced code blocks.
The code block component provided to the integration receives the following props.
Prop | Type | Optional | Description |
---|---|---|---|
code | String |
No | The raw contents of the fenced code block from the .mdx file. |
lang | String |
Yes | The language detected from the fenced code block. |
filename | String |
Optional | If a // filename.ts is provided at the top of the code block it will be removed and sent in in the filename prop. |
In addition, you can export the following type definition from the integration.
type CodeBlockProps = {
code: string;
lang?: string;
filename?: string;
};
import type { CodeBlockProps } from 'astro-mdx-code-blocks';
This example uses Astro's Prism component for syntax highlighting. However, you can use any library you'd like as the component has access to the raw
code
string.
src/components/CodeBlock.astro
---
import { Prism } from '@astrojs/prism';
const {
code,
lang,
filename,
} = Astro.props;
const hasLang = !!lang;
const hasFileName = !!filename;
const showHeader = hasLang || hasFileName;
---
<figure class="code-block">
{showHeader && (
<figcaption class="header">
{hasFileName && (
<span class="filename">
{filename}
</span>
)}
{hasLang && (
<span class="lang">
{lang}
</span>
)}
</figcaption>
)}
<Prism
code={code}
lang={lang}
/>
</figure>
- Import the
AutoImport
andmdx
integrations. - Import
MDXCodeBlocks
andmdxCodeBlockAutoImport
fromastro-mdx-code-blocks
. - Add
AutoImport
,MDXCodeBlocks
, andmdx
to theintegrations
config option. - Use the
mdxCodeBlockAutoImport
function to provide theAutoImport
integration the path to your custom Astro component.
import { defineConfig } from 'astro/config';
import AutoImport from 'astro-auto-import';
import mdx from '@astrojs/mdx';
import MDXCodeBlocks, { mdxCodeBlockAutoImport } from 'astro-mdx-code-blocks';
export default defineConfig({
// ...
integrations: [
AutoImport({
imports: [
mdxCodeBlockAutoImport('src/components/CodeBlock.astro')
],
}),
MDXCodeBlocks(),
mdx(),
],
});
AutoImport must come before
MDXCodeBlocks
andMDXCodeBlocks
must come beforemdx
.
Use fenced code blocks in your MDX files as you normally would. As noted above, the integration will pull out certain metadata from the block and provide it to your custom Astro component.
Issues and pull requests are welcome.