Destiner's notes

Using Markdown Plugins in Astro

20 February 2022

Astro uses Remark to render your Markdown which makes it possible to tap into its rich plugin ecosystem. Here, we will learn how to use these plugins on your Astro site.

Let’s start by initializing a project:

bash
npm init astro -- --template blog

Astro config

In the Astro config, add markdownOptions. Astro comes with a few plugins by default. When we want to add a new plugin, we need to list default plugins in the config. Later, you can remove the plugins that you don’t need:

ts
import { defineConfig } from 'astro/config';
export default defineConfig({
renderers: [],
markdownOptions: {
render: [
'@astrojs/markdown-remark',
{
remarkPlugins: ['remark-gfm', 'remark-smartypants'],
rehypePlugins: ['rehype-slug'],
},
],
},
});

Adding a plugin

Let’s now add a new plugin. I will use remark-toc as an example.

First, install the plugin:

bash
npm i -D remark-toc

Second, update the config to include the plugin:

ts
import { defineConfig } from 'astro/config';
export default defineConfig({
renderers: [],
markdownOptions: {
render: [
'@astrojs/markdown-remark',
{
remarkPlugins: [
// Other remark plugins…
'remark-toc',
],
// Rehype plugins…
},
],
},
});

Using the plugin

Now let’s use the plugin. Add a few headings to the pages/posts/index.md file:

md
<Cool name={frontmatter.name} href="https://twitter.com/n_moore" client:load />
This is so cool!
Do variables work {frontmatter.value \* 2}?
## TOC
## Plants
## Animals
### Cats
### Dogs
``

This should make the plugin generate a table of contents.

Plugin configuration

You can also configurate plugins. Replace a string with a two-item array in the config, and then pass the options inside curly braces:

ts
import { defineConfig } from 'astro/config';
export default defineConfig({
markdown: {
render: [
'@astrojs/markdown-remark',
{
remarkPlugins: [
// Other remark plugins
['remark-toc', { ordered: true }],
],
// Rehype plugins
},
],
},
});

This will make the plugin generate the table of contents as an ordered list.