使用vite/rollup.js来扩展Node.js的os模块
P粉176151589
P粉176151589 2023-08-24 16:17:55
[Vue.js讨论组]

我正在处理一个使用opensea-js包的Vite项目。这个包依赖于xhr2-cookies,它导入了oshttphttps和其他一些内部的node模块。

当我尝试调用任何opensea方法时,出现了以下错误:

Uncaught (in promise) TypeError: os.type不是一个函数
    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错误,但在尝试发送请求时失败(因为它使用需要进行polyfill的http/https模块)。

P粉176151589
P粉176151589

全部回复(1)
P粉863295057

我使用了 rollup-plugin-polyfill-node 来解决这个问题。

import nodePolyfills from 'rollup-plugin-polyfill-node';
rollup({
  entry: 'main.js',
  plugins: [
    nodePolyfills( /* options */ )
  ]
})

这是基于Fabiano的答案的更完整的解决方案:

// 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'
import nodePolyfills from 'rollup-plugin-polyfill-node';

export default {
        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
                    nodePolyfills()
                ]
            }
        }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号