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

能否通过Vite替换模块依赖?将node-fetch替换为Node内置fetch

替换项目中所有node-fetch为Node原生Fetch(基于Vite配置)

问题背景

我项目里多个依赖都依赖node-fetch,执行npm ls node-fetch的结果如下:

$ npm ls node-fetch
myapp@1.0.0 /home/mike/Code/myapp@1.0.0 
├─┬ @metaplex-foundation/js@0.18.1
│ ├─┬ @bundlr-network/client@0.8.9
│ │ └─┬ near-api-js@0.44.2
│ │   └── node-fetch@2.6.7 deduped
│ └── node-fetch@2.6.7
├─┬ @solana/spl-token-registry@0.2.7
│ └─┬ cross-fetch@3.1.5
│   └── node-fetch@2.6.7 deduped
└─┬ @solana/web3.js@1.73.2
  └── node-fetch@2.6.7 deduped

目前Fetch已经成为Node 18的正式特性(已移除实验特性警告),我想把所有依赖中的node-fetch导入替换为Node原生的global.fetch,打算通过Vite的构建选项实现,但不清楚具体配置方式——已经查阅过Vite和Rollup文档,知道resolve.alias可以设置包别名,但不知道如何将别名关联到全局对象。

解决方案

可以通过自定义中转模块+resolve.alias的组合实现需求,具体步骤如下:

1. 创建Fetch代理模块

在项目根目录新建src/polyfills/fetch-proxy.js文件,内容如下:

// 对齐node-fetch的导出结构,导出Node原生Fetch相关对象
export default global.fetch;
export const Headers = global.Headers;
export const Request = global.Request;
export const Response = global.Response;

2. 配置Vite别名

修改vite.config.js,将node-fetch的导入指向刚才创建的代理模块:

import { defineConfig } from 'vite';

export default defineConfig({
  resolve: {
    alias: {
      'node-fetch': './src/polyfills/fetch-proxy.js'
    }
  }
});

注意事项

  • 确保项目运行环境为Node 18及以上版本,原生Fetch特性已稳定可用。
  • 部分依赖可能依赖node-fetch的特定API或版本特性,替换后需全面测试项目功能,避免出现兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:24:41