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

在VitePress项目中使用@metamask/sdk时出现Reference error: process is not defined问题的解决咨询

在VitePress项目中使用@metamask/sdk时出现Reference error: process is not defined问题的解决咨询

嘿,我之前也碰到过类似的问题,VitePress的服务端渲染(SSR)特性确实会因为浏览器专属全局变量(比如window)不存在而踩坑,给你几个可行的解决方案:

方案一:通过Vite配置全局注入process变量

VitePress基于Vite构建,我们可以在Vite配置里直接定义process相关变量,让服务端和客户端环境都能识别它:

在你的.vitepress/config.js文件中添加如下配置:

import { defineConfig } from 'vitepress'

export default defineConfig({
  vite: {
    define: {
      // 可以根据需求注入具体的环境变量,比如NODE_ENV
      'process.env': JSON.stringify(process.env),
      // 如果不需要真实环境变量,也可以直接置空对象
      // 'process.env': {}
    }
  }
})

这样配置后,不管是开发时的客户端渲染,还是构建时的服务端渲染,process变量都会被正确定义,不会出现未定义的错误。

方案二:仅在客户端环境赋值window.process

既然服务端没有window,那我们就只在客户端执行赋值操作。可以利用Vue的生命周期钩子或者VitePress的客户端专属逻辑:

方法1:用Vue的onMounted钩子

在你的布局组件或者使用MetaMask SDK的组件中:

<script setup>
import { onMounted } from 'vue'
import process from 'process'

onMounted(() => {
  // onMounted仅在客户端执行,此时window已经存在
  window.process = process
})
</script>

方法2:用VitePress的ClientOnly组件

如果你的MetaMask SDK相关代码只需要在客户端渲染,可以用ClientOnly组件包裹:

<ClientOnly>
  <template #fallback>
    <!-- 服务端渲染时显示的占位内容 -->
    Loading...
  </template>
  <!-- 这里放置使用@metamask/sdk的组件 -->
  <MetaMaskConnectButton />
</ClientOnly>

方案三:动态导入MetaMask SDK(仅在客户端加载)

如果你的项目只有部分页面用到MetaMask SDK,可以只在客户端环境动态导入它,从根源避免服务端加载时的变量问题:

// 在需要使用SDK的地方
if (typeof window !== 'undefined') {
  // 仅在客户端环境下加载SDK
  import('@metamask/sdk').then(({ MetaMaskSDK }) => {
    const mmSdk = new MetaMaskSDK({
      // 你的SDK配置
    })
    // 后续的连接、交互逻辑
    const provider = mmSdk.getProvider()
  })
}

这些方案都能解决你碰到的构建失败问题,你可以根据自己的项目情况选择最合适的方式~

备注:内容来源于stack exchange,提问作者Mohamad javad Safari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:18:03