如何在Vite/Rollup项目中为opensea-js依赖的Node核心模块做Polyfill
问题根因
opensea-js依赖的xhr2-cookies是专为Node.js环境设计的包,默认会调用Node内置的os/http/https等模块,而Vite默认不会在浏览器环境注入这些Node核心模块的polyfill。你之前的配置只给生产构建的Rollup流程添加了polyfill,开发阶段的Vite DevServer走Esbuild预构建逻辑,不会触发该配置,所以报错依然存在。
浏览器环境本身自带原生XMLHttpRequest实现,完全不需要xhr2-cookies的模拟能力,直接把该包替换成浏览器原生实现即可,无需安装额外polyfill:
- 新建
src/mocks/xhr2-cookies.js文件,内容如下:
export const XMLHttpRequest = window.XMLHttpRequest export default { XMLHttpRequest }
- 修改
vite.config.js的resolve.alias配置,添加别名映射:
import path from 'path' import vue from '@vitejs/plugin-vue' import { defineConfig } from 'vite' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': path.resolve(__dirname, 'src'), // 新增这行,把xhr2-cookies指向你写的mock文件 'xhr2-cookies': path.resolve(__dirname, 'src/mocks/xhr2-cookies.js') }, }, server: { port: 8080, }, define: { 'process.env': {}, // 补充global定义,避免其他Node包报错 global: 'window' } })
- 删除本地
node_modules/.vite缓存目录后重启项目即可。
方案2:全量注入Node核心模块Polyfill
如果需要保留xhr2-cookies的完整能力,可以配置同时覆盖开发+生产环境的Node polyfill:
- 安装额外依赖:
npm install @esbuild-plugins/node-globals-polyfill @esbuild-plugins/node-modules-polyfill rollup-plugin-polyfill-node --save-dev
- 修改
vite.config.js完整配置如下:
import path from 'path' import vue from '@vitejs/plugin-vue' import nodePolyfills from 'rollup-plugin-polyfill-node' import { defineConfig } from 'vite' import NodeGlobalsPolyfillPlugin from '@esbuild-plugins/node-globals-polyfill' import NodeModulesPolyfillPlugin from '@esbuild-plugins/node-modules-polyfill' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': path.resolve(__dirname, 'src'), // 手动指定核心模块的polyfill路径 os: 'rollup-plugin-polyfill-node/polyfills/os', http: 'rollup-plugin-polyfill-node/polyfills/http', https: 'rollup-plugin-polyfill-node/polyfills/https' }, }, server: { port: 8080, }, define: { 'process.env': {}, global: 'window' }, // 开发环境Esbuild预构建注入polyfill optimizeDeps: { esbuildOptions: { plugins: [ NodeGlobalsPolyfillPlugin({ process: true, buffer: true }), NodeModulesPolyfillPlugin() ] } }, // 生产环境Rollup构建注入polyfill build: { rollupOptions: { plugins: [ nodePolyfills() ] } } })
- 删除
node_modules/.vite缓存后重启项目即可。
内容的提问来源于stack exchange,提问作者Benedict Lewis
相关产品推荐
相关产品推荐

