Skip to content

Commit 2cba2f4

Browse files
authored
fix(fileCodeBlock): should support hmr (#2423)
1 parent bd66a12 commit 2cba2f4

File tree

4 files changed

+32
-8
lines changed

4 files changed

+32
-8
lines changed

packages/core/src/node/mdx/loader.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export default async function mdxLoader(
3636
config,
3737
pluginDriver,
3838
routeService,
39+
addDependency: this.addDependency,
3940
});
4041
callback(null, compileResult);
4142
}

packages/core/src/node/mdx/options.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'node:path';
22
import { nodeTypes, type ProcessorOptions } from '@mdx-js/mdx';
3+
import type { Rspack } from '@rsbuild/core';
34
import type { UserConfig } from '@rspress/shared';
45
import rehypeShiki from '@shikijs/rehype';
56
import rehypeExternalLinks from 'rehype-external-links';
@@ -24,9 +25,16 @@ export async function createMDXOptions(options: {
2425
config: UserConfig | null;
2526
routeService: RouteService | null;
2627
pluginDriver: PluginDriver | null;
28+
addDependency?: Rspack.LoaderContext['addDependency'];
2729
}): Promise<ProcessorOptions> {
28-
const { docDirectory, config, routeService, filepath, pluginDriver } =
29-
options;
30+
const {
31+
docDirectory,
32+
config,
33+
routeService,
34+
filepath,
35+
pluginDriver,
36+
addDependency,
37+
} = options;
3038
const remarkLinkOptions = config?.markdown?.link;
3139
const format = path.extname(filepath).slice(1) as 'mdx' | 'md';
3240
const cleanUrls = config?.route?.cleanUrls ?? false;
@@ -58,7 +66,7 @@ export async function createMDXOptions(options: {
5866
remarkGFM,
5967
remarkToc,
6068
remarkContainerSyntax,
61-
[remarkFileCodeBlock, { filepath }],
69+
[remarkFileCodeBlock, { filepath, addDependency }],
6270
[
6371
remarkLink,
6472
{

packages/core/src/node/mdx/processor.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'node:path';
22
import { createProcessor } from '@mdx-js/mdx';
3+
import type { Rspack } from '@rsbuild/core';
34
import type { Header, UserConfig } from '@rspress/shared';
45
import { extractTextAndId, loadFrontMatter } from '@rspress/shared/node-utils';
56

@@ -23,18 +24,28 @@ interface CompileOptions {
2324
config: UserConfig | null;
2425
routeService: RouteService | null;
2526
pluginDriver: PluginDriver | null;
27+
28+
addDependency?: Rspack.LoaderContext['addDependency']; // remarkFileCodeBlock hmr
2629
}
2730

2831
async function compile(options: CompileOptions): Promise<string> {
29-
const { source, filepath, docDirectory, config, routeService, pluginDriver } =
30-
options;
32+
const {
33+
source,
34+
filepath,
35+
docDirectory,
36+
config,
37+
routeService,
38+
pluginDriver,
39+
addDependency,
40+
} = options;
3141

3242
const mdxOptions = await createMDXOptions({
3343
config,
3444
docDirectory,
3545
filepath,
3646
pluginDriver,
3747
routeService,
48+
addDependency,
3849
});
3950
// Separate frontmatter and content in MDX source
4051
const { frontmatter, emptyLinesSource } = loadFrontMatter(

packages/core/src/node/mdx/remarkPlugins/fileCodeBlock.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { readFile } from 'node:fs/promises';
22
import path from 'node:path';
3+
import type { Rspack } from '@rsbuild/core';
34
import { logger } from '@rspress/shared/logger';
45
import type { Root } from 'mdast';
56
import picocolors from 'picocolors';
@@ -22,9 +23,10 @@ function parseFileFromMeta(meta: string | undefined): string {
2223
return '';
2324
}
2425

25-
export const remarkFileCodeBlock: Plugin<[{ filepath: string }], Root> = ({
26-
filepath,
27-
}) => {
26+
export const remarkFileCodeBlock: Plugin<
27+
[{ filepath: string; addDependency?: Rspack.LoaderContext['addDependency'] }],
28+
Root
29+
> = ({ filepath, addDependency }) => {
2830
return async tree => {
2931
const promiseList: Promise<void>[] = [];
3032
visit(tree, 'code', node => {
@@ -59,6 +61,8 @@ this usage is not allowed, please use below:
5961

6062
const promise = readFile(resolvedFilePath, 'utf-8')
6163
.then(fileContent => {
64+
// hmr in dev
65+
addDependency?.(resolvedFilePath);
6266
node.value = fileContent;
6367
})
6468
.catch(e => {

0 commit comments

Comments
 (0)