You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mdx-bundler与Next.js导入自定义组件失败问题

问题分析与解决方案

错误原因

问题核心在于**rehype-raw插件无法处理MDX中的ESM导入语句**。rehype-raw的设计目标是将原始HTML/JSX转换为HAST(超文本抽象语法树),但它仅识别标准HTML节点,对MDX特有的mdxjsEsm节点(对应import语句的AST节点)完全不兼容,因此处理时直接抛出编译错误。

另外你已经通过<Component components={{CookieSettings}}>的方式向MDX注入了组件,完全不需要在从Strapi获取的MDX内容里重复写import CookieSettings语句——这是冗余操作,也是触发错误的直接诱因。


解决方案

方案1:移除MDX中的冗余导入(推荐)

直接修改Strapi中存储的MDX内容,删掉import语句,只保留组件使用代码:

<CookieSettings />

Some content...

这种方式最简洁,也完全符合你通过components属性注入组件的设计逻辑。

方案2:保留导入时调整插件配置(特殊场景用)

如果因业务需求必须在MDX中保留import语句,需要给rehype-raw配置跳过MDX特有节点的规则:
修改prepareMdx函数中的rehype插件配置:

export async function prepareMdx(source: string) {
  return bundleMDX({
    source,
    cwd: process.cwd(),
    esbuildOptions(options) {
      options.target = 'esnext';
      return options;
    },
    mdxOptions(options) {
      options.remarkPlugins = [
        ...(options.remarkPlugins ?? []),
        remarkGfm,
        remarkUnwrapImages,
      ];
      options.rehypePlugins = [
        ...(options.rehypePlugins ?? []),
        // 配置rehype-raw跳过mdxjsEsm节点
        [rehypeRaw, { passThrough: ['mdxjsEsm'] }],
        imageMetadata,
        rehypeSlug,
      ];
      return options;
    },
  });
}

注意:此时MDX中的import路径必须是相对于process.cwd()的正确路径,否则mdx-bundler会无法找到组件文件。


内容的提问来源于stack exchange,提问作者Atomike-Toxic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:50:44