# Vite Import `.mmd` and `.mermaid` files as SVG compiled during the Vite build. ## Overview The `ondine` plugin from `ondine/vite` compiles each imported Mermaid file when Vite transforms it. The default export of the module is the rendered diagram. The page bundle contains the SVG markup and no compiler. ```ts title="main.ts" import flow from './flow.mmd' // The import is { height, svg, type, width }, compiled at build time console.log(flow.type) ``` If a diagram has a syntax error, the transform fails with the file, line, and column. Vite shows the error in the terminal and in the error overlay. ## Walkthrough The steps below add the plugin, write a diagram, and show it on a page. ### Add the Plugin Add `ondine()` to the `plugins` list of the Vite config. ```ts title="vite.config.ts" import { defineConfig } from 'vite' import { ondine } from 'ondine/vite' export default defineConfig({ // Compiles .mmd and .mermaid imports to SVG plugins: [ondine()], }) ``` ### Write a Diagram Save Mermaid source in a `.mmd` or `.mermaid` file. ```mermaid flowchart LR request[Request] --> cache{Cached?} cache -- yes --> hit[Return] cache -- no --> origin[Fetch] --> hit ``` ### Show the Diagram Mount the import into an element, or pass its `svg` to a framework. ```ts title="main.ts" import { mount } from 'ondine' import flow from './flow.mmd' // Replaces the element's contents with the SVG mount(document.getElementById('flow')!, flow) ``` ```tsx title="Flow.tsx" import flow from './flow.mmd' export function Flow() { // Inserts the compiled SVG as markup, because the SVG is inert return
} ``` ## Recipes ### Type the Imports `ondine/vite/client` declares the default export of `.mmd` and `.mermaid` imports. Reference it from a declaration file, or list it in `compilerOptions.types`. ```ts title="src/env.d.ts" // Types the default export of every Mermaid import /// ``` ### Compile Markdown `ondine/remark` compiles ` ```mermaid ` fences in `.md` and `.mdx` files. Add it to the MDX plugin, which reads both formats. ```ts title="vite.config.ts" import mdx from '@mdx-js/rollup' import { defineConfig } from 'vite' import { remarkOndine } from 'ondine/remark' export default defineConfig({ // Replaces each Mermaid fence with inline SVG during the build plugins: [mdx({ remarkPlugins: [remarkOndine] })], }) ``` Each fence becomes a `
` around the SVG. The plugin emits elements, not a markup string, so the diagram renders in each framework that MDX targets. If a fence has a syntax error, the build fails with the Markdown file, line, and column. ### Fit a Column `maxWidth` sets the width available to the diagram. If a diagram that runs across does not fit, the compiler draws it running down. ```ts title="vite.config.ts" import { defineConfig } from 'vite' import { ondine } from 'ondine/vite' export default defineConfig({ // Lays out every diagram for a 640-pixel column plugins: [ondine({ maxWidth: 640 })], }) ``` The plugin accepts every [`render` option](/docs/api/compiler/render#parameters) except `idPrefix`. The plugin makes the prefix for each file from the file path. ### Pin the Schedule A gantt chart schedules relative tasks against the current time. To make builds reproducible, set `now`. ```ts title="vite.config.ts" import { defineConfig } from 'vite' import { ondine } from 'ondine/vite' export default defineConfig({ // Schedules every gantt chart against January 15, 2024 plugins: [ondine({ now: Date.UTC(2024, 0, 15) })], }) ``` ## More