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

Astro项目中使用react-media-recorder出现Blob is not defined错误如何解决?

解决Astro项目中react-media-recorder报ReferenceError: Blob is not defined的问题

问题原因

Astro默认对组件进行服务端渲染(SSR),而Blob是浏览器专属的全局API,Node.js服务端环境中不存在这个对象。当你的React组件在服务端执行useReactMediaRecorder钩子时,库内部调用了Blob,就会抛出这个错误。

解决方法

方法一:使用Astro客户端指令强制组件仅在客户端渲染

这是最简单直接的方案,Astro提供了client:系列指令来控制组件的渲染时机和环境。在Astro页面中引入你的RecordButton组件时,添加对应的客户端指令:

方式1:使用client:load

页面加载时立即在客户端渲染组件:

<RecordButton client:load />

方式2:使用client:only="react"

完全跳过服务端渲染,仅在客户端加载并渲染组件(适合完全依赖浏览器API的组件):

<RecordButton client:only="react" />

添加指令后,组件只会在浏览器环境中执行,此时Blob对象存在,就能正常运行react-media-recorder库。

方法二:动态导入依赖(备选方案)

如果不想使用客户端指令,可以在React组件中仅在浏览器环境下动态导入react-media-recorder库:

import { useEffect, useState } from 'react';

function RecordButton() {
  const [recorderProps, setRecorderProps] = useState(null);

  useEffect(() => {
    // 仅在浏览器环境中加载库
    if (typeof window !== 'undefined') {
      import('react-media-recorder').then(({ useReactMediaRecorder }) => {
        const props = useReactMediaRecorder({
          video: false,
          audio: true,
          onStop: () => {
            console.log("stopped recording");
            generateTranscript(props.mediaBlobUrl);
          }
        });
        setRecorderProps(props);
      });
    }
  }, []);

  // 未加载完成时显示占位内容
  if (!recorderProps) {
    return <button disabled>加载录音组件...</button>;
  }

  const { status, startRecording, stopRecording, mediaBlobUrl } = recorderProps;

  // ... 你的组件渲染逻辑
}

这种方法通过判断window对象是否存在来确保只在浏览器中加载库,避免服务端执行时的错误,但实现起来比客户端指令繁琐,优先推荐方法一。

内容的提问来源于stack exchange,提问作者Cassidy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:11:01