node.js - 使用 vite/rollup.js 填充节点操作系统模块
问题描述
我正在开发一个使用该opensea-js
包的 Vite 项目。这个包依赖于 xhr2-cookies
. 其中导入os
,http
和https
其他一些内部节点模块。
尝试调用任何 opensea 方法时出现此错误:
Uncaught (in promise) TypeError: os.type is not a function
XMLHttpRequest2 xml-http-request.ts:102
prepareRequest httpprovider.js:61
sendAsync httpprovider.js:116
node_modules opensea-js.js:24209
跟踪这个错误来自于构造用户代理字符串。
我尝试安装rollup-plugin-polyfill-node
并将其添加到vite.config.js
但仍然遇到相同的错误:
import path from 'path'
import vue from '@vitejs/plugin-vue'
import nodePolyfills from 'rollup-plugin-polyfill-node'
import { defineConfig } from 'vite'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
server: {
port: 8080,
},
define: {
'process.env': {},
},
build: {
rollupOptions: {
plugins: [
nodePolyfills(),
],
},
},
})
我还尝试使用 手动修补文件patch-package
,这修复了os
错误,但是在尝试发送请求时失败(它使用http
/https
模块,也需要填充)。
解决方案
在我的项目中,我解决了这样的配置。我在一篇简短的文章中描述了解决方案。
// yarn add --dev @esbuild-plugins/node-globals-polyfill
import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'
// yarn add --dev @esbuild-plugins/node-modules-polyfill
import { NodeModulesPolyfillPlugin } from '@esbuild-plugins/node-modules-polyfill'
// You don't need to add this to deps, it's included by @esbuild-plugins/node-modules-polyfill
import rollupNodePolyFill from 'rollup-plugin-node-polyfills'
export default {
resolve: {
alias: {
// This Rollup aliases are extracted from @esbuild-plugins/node-modules-polyfill,
// see https://github.com/remorses/esbuild-plugins/blob/master/node-modules-polyfill/src/polyfills.ts
// process and buffer are excluded because already managed
// by node-globals-polyfill
util: 'rollup-plugin-node-polyfills/polyfills/util',
sys: 'util',
events: 'rollup-plugin-node-polyfills/polyfills/events',
stream: 'rollup-plugin-node-polyfills/polyfills/stream',
path: 'rollup-plugin-node-polyfills/polyfills/path',
querystring: 'rollup-plugin-node-polyfills/polyfills/qs',
punycode: 'rollup-plugin-node-polyfills/polyfills/punycode',
url: 'rollup-plugin-node-polyfills/polyfills/url',
string_decoder:
'rollup-plugin-node-polyfills/polyfills/string-decoder',
http: 'rollup-plugin-node-polyfills/polyfills/http',
https: 'rollup-plugin-node-polyfills/polyfills/http',
os: 'rollup-plugin-node-polyfills/polyfills/os',
assert: 'rollup-plugin-node-polyfills/polyfills/assert',
constants: 'rollup-plugin-node-polyfills/polyfills/constants',
_stream_duplex:
'rollup-plugin-node-polyfills/polyfills/readable-stream/duplex',
_stream_passthrough:
'rollup-plugin-node-polyfills/polyfills/readable-stream/passthrough',
_stream_readable:
'rollup-plugin-node-polyfills/polyfills/readable-stream/readable',
_stream_writable:
'rollup-plugin-node-polyfills/polyfills/readable-stream/writable',
_stream_transform:
'rollup-plugin-node-polyfills/polyfills/readable-stream/transform',
timers: 'rollup-plugin-node-polyfills/polyfills/timers',
console: 'rollup-plugin-node-polyfills/polyfills/console',
vm: 'rollup-plugin-node-polyfills/polyfills/vm',
zlib: 'rollup-plugin-node-polyfills/polyfills/zlib',
tty: 'rollup-plugin-node-polyfills/polyfills/tty',
domain: 'rollup-plugin-node-polyfills/polyfills/domain'
}
},
optimizeDeps: {
esbuildOptions: {
// Node.js global to browser globalThis
define: {
global: 'globalThis'
},
// Enable esbuild polyfill plugins
plugins: [
NodeGlobalsPolyfillPlugin({
process: true,
buffer: true
}),
NodeModulesPolyfillPlugin()
]
}
},
build: {
rollupOptions: {
plugins: [
// Enable rollup polyfills plugin
// used during production bundling
rollupNodePolyFill()
]
}
}
}
推荐阅读
- amazon-web-services - 陷入 BlueHost 和 AWS 之间的过渡
- kotlin - 不针对浏览器时如何在 Kotlin 中调用 setTimeout 等 JS 函数
- flutter - 行高扩展时将图标放在底部
- powerbi - Application Insights Data Limited 导入 PowerBI
- python - 编写不会因越界检查而中断的 if 语句的最佳方法是什么?
- java - 出现错误 10 后如何让 Google-Sign in 工作?
- java - Firebase 上传监听器永远不会被解雇
- python - 第一次退出应用程序后保存excel文件的问题
- firebase - Firebase 支出和 AdMob 广告
- php - 调用外部程序(postmap)时php exec()返回错误