MDX: Make mdx-remote optional for dynamic mode

This commit is contained in:
Fuma Nama
2026-04-14 18:43:01 +08:00
parent e1567e2e58
commit eb62304a14
5 changed files with 55 additions and 31 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'fumadocs-mdx': patch
---
Make `mdx-remote` optional for dynamic mode
+5 -3
View File
@@ -45,14 +45,16 @@ Depending on your bundler, this may reduce compilation time significantly on dev
## Dynamic Mode
Dynamic mode works by performing on-demand compilation with MDX Remote.
Dynamic mode works by performing **on-demand compilation**, then execute the output on runtime.
You need to install extra dependencies:
It is recommended to install & externalize `shiki`:
```npm
npm i @fumadocs/mdx-remote shiki
npm i shiki
```
Enable dynamic mode in collections like:
```ts tab="Docs Collection"
import { defineDocs } from 'fumadocs-mdx/config';
-5
View File
@@ -86,7 +86,6 @@
"zod": "^4.3.6"
},
"devDependencies": {
"@fumadocs/mdx-remote": "workspace:*",
"@types/bun": "^1.3.12",
"@types/js-yaml": "^4.0.9",
"@types/mdast": "^4.0.4",
@@ -108,7 +107,6 @@
"webpack": "^5.106.1"
},
"peerDependencies": {
"@fumadocs/mdx-remote": "^1.4.0",
"@types/mdast": "*",
"@types/mdx": "*",
"@types/react": "*",
@@ -139,9 +137,6 @@
},
"vite": {
"optional": true
},
"@fumadocs/mdx-remote": {
"optional": true
}
}
}
+26 -1
View File
@@ -1,12 +1,12 @@
import { buildConfig, type DocCollectionItem } from '@/config/build';
import { buildMDX, type CompiledMDXProperties } from '@/loaders/mdx/build-mdx';
import { executeMdx } from '@fumadocs/mdx-remote/client';
import { pathToFileURL } from 'node:url';
import { fumaMatter } from '@/utils/fuma-matter';
import fs from 'node:fs/promises';
import { server, type ServerOptions } from './server';
import { type CoreOptions, createCore } from '@/core';
import type { FileInfo, InternalTypeConfig } from './types';
import jsxRuntimeDefault from 'react/jsx-runtime';
export interface LazyEntry<Data = unknown> {
info: FileInfo;
@@ -19,6 +19,31 @@ export type CreateDynamic<Config, TC extends InternalTypeConfig = InternalTypeCo
typeof dynamic<Config, TC>
>;
interface ExecuteOptions {
scope?: Record<string, unknown>;
baseUrl?: string | URL;
jsxRuntime?: unknown;
}
const AsyncFunction: new (...args: string[]) => (...args: unknown[]) => Promise<unknown> =
Object.getPrototypeOf(executeMdx).constructor;
/** we always assume the input code is safe and execute it directly */
async function executeMdx(compiled: string, options: ExecuteOptions = {}) {
const { opts: scopeOpts, ...scope } = options.scope ?? {};
const fullScope = {
opts: {
...(scopeOpts as object),
...(options.jsxRuntime ?? jsxRuntimeDefault),
baseUrl: options.baseUrl,
},
...scope,
};
const hydrateFn = new AsyncFunction(...Object.keys(fullScope), compiled);
return await hydrateFn.apply(hydrateFn, Object.values(fullScope));
}
export async function dynamic<Config, TC extends InternalTypeConfig>(
configExports: Config,
coreOptions: CoreOptions,
+19 -22
View File
@@ -2226,9 +2226,6 @@ importers:
specifier: ^4.3.6
version: 4.3.6
devDependencies:
'@fumadocs/mdx-remote':
specifier: workspace:*
version: link:../mdx-remote
'@types/bun':
specifier: ^1.3.12
version: 1.3.12
@@ -16525,13 +16522,13 @@ snapshots:
'@tanstack/[email protected](@vitejs/[email protected]([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])))([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))':
dependencies:
'@tanstack/react-router': 1.168.18([email protected]([email protected]))([email protected])
'@tanstack/react-start-server': 1.166.36([email protected]([email protected]))([email protected]([email protected]))([email protected])
'@tanstack/react-start-server': 1.166.36([email protected])([email protected]([email protected]))([email protected])
'@tanstack/router-core': 1.168.14
'@tanstack/router-utils': 1.161.6
'@tanstack/start-client-core': 1.167.16
'@tanstack/start-fn-stubs': 1.161.6
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected]([email protected]))
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected])
'@tanstack/start-storage-context': 1.166.28
pathe: 2.0.3
react: 19.2.5
@@ -16549,13 +16546,13 @@ snapshots:
'@tanstack/[email protected](@vitejs/[email protected]([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])))([email protected])([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))':
dependencies:
'@tanstack/react-router': 1.168.18([email protected]([email protected]))([email protected])
'@tanstack/react-start-server': 1.166.36([email protected]([email protected]))([email protected]([email protected]))([email protected])
'@tanstack/react-start-server': 1.166.36([email protected])([email protected]([email protected]))([email protected])
'@tanstack/router-core': 1.168.14
'@tanstack/router-utils': 1.161.6
'@tanstack/start-client-core': 1.167.16
'@tanstack/start-fn-stubs': 1.161.6
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected]([email protected]))
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected])
'@tanstack/start-storage-context': 1.166.28
pathe: 2.0.3
react: 19.2.5
@@ -16582,13 +16579,13 @@ snapshots:
transitivePeerDependencies:
- crossws
'@tanstack/[email protected]([email protected]([email protected]))([email protected]([email protected]))([email protected])':
'@tanstack/[email protected]([email protected])([email protected]([email protected]))([email protected])':
dependencies:
'@tanstack/history': 1.161.6
'@tanstack/react-router': 1.168.18([email protected]([email protected]))([email protected])
'@tanstack/router-core': 1.168.14
'@tanstack/start-client-core': 1.167.16
'@tanstack/start-server-core': 1.167.18([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected])
react: 19.2.5
react-dom: 19.2.5([email protected])
transitivePeerDependencies:
@@ -16622,11 +16619,11 @@ snapshots:
'@tanstack/react-router': 1.168.18([email protected]([email protected]))([email protected])
'@tanstack/react-start-client': 1.166.35([email protected]([email protected]))([email protected])
'@tanstack/react-start-rsc': 0.0.12(@vitejs/[email protected]([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])))([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/react-start-server': 1.166.36([email protected]([email protected]))([email protected]([email protected]))([email protected])
'@tanstack/react-start-server': 1.166.36([email protected])([email protected]([email protected]))([email protected])
'@tanstack/router-utils': 1.161.6
'@tanstack/start-client-core': 1.167.16
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected]([email protected]))
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected])
pathe: 2.0.3
react: 19.2.5
react-dom: 19.2.5([email protected])
@@ -16645,11 +16642,11 @@ snapshots:
'@tanstack/react-router': 1.168.18([email protected]([email protected]))([email protected])
'@tanstack/react-start-client': 1.166.35([email protected]([email protected]))([email protected])
'@tanstack/react-start-rsc': 0.0.12(@vitejs/[email protected]([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])))([email protected])([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/react-start-server': 1.166.36([email protected]([email protected]))([email protected]([email protected]))([email protected])
'@tanstack/react-start-server': 1.166.36([email protected])([email protected]([email protected]))([email protected])
'@tanstack/router-utils': 1.161.6
'@tanstack/start-client-core': 1.167.16
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected]([email protected]))
'@tanstack/start-plugin-core': 1.167.29(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected])
pathe: 2.0.3
react: 19.2.5
react-dom: 19.2.5([email protected])
@@ -16776,7 +16773,7 @@ snapshots:
- vite-plugin-solid
- webpack
'@tanstack/[email protected](@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))':
'@tanstack/[email protected](@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/core': 7.29.0
@@ -16787,7 +16784,7 @@ snapshots:
'@tanstack/router-plugin': 1.167.18(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))
'@tanstack/router-utils': 1.161.6
'@tanstack/start-client-core': 1.167.16
'@tanstack/start-server-core': 1.167.18([email protected]([email protected]))
'@tanstack/start-server-core': 1.167.18([email protected])
cheerio: 1.2.0
exsolve: 1.0.8
pathe: 2.0.3
@@ -16820,13 +16817,13 @@ snapshots:
transitivePeerDependencies:
- crossws
'@tanstack/[email protected]([email protected]([email protected]))':
'@tanstack/[email protected]([email protected])':
dependencies:
'@tanstack/history': 1.161.6
'@tanstack/router-core': 1.168.14
'@tanstack/start-client-core': 1.167.16
'@tanstack/start-storage-context': 1.166.28
h3-v2: [email protected]([email protected]([email protected]))
h3-v2: [email protected]([email protected])
seroval: 1.5.2
transitivePeerDependencies:
- crossws
@@ -19374,7 +19371,7 @@ snapshots:
optionalDependencies:
crossws: 0.4.4([email protected])
[email protected]([email protected]([email protected])):
[email protected]([email protected]):
dependencies:
rou3: 0.8.1
srvx: 0.11.15