我尝试将 ccxt 导入到我的 svelte kit 应用程序中,但得到了 ReferenceError: Buffer is not Defined,即使我只导入了它

问题描述 投票:0回答:1

我这里有一个关于这个问题的最小可重现示例。问题是

import ccxt from "ccxt"
给出了这个错误

ReferenceError: Buffer is not defined
    at node_modules/ccxt/js/static_dependencies/node-rsa/schemes/pkcs1.js (pkcs1.js:10:10)
    at __require (chunk-RSJERJUL.js?v=d0062138:3:50)
    at node_modules/ccxt/js/static_dependencies/node-rsa/schemes/schemes.js (schemes.js:2:12)
    at __require (chunk-RSJERJUL.js?v=d0062138:3:50)
    at node_modules/ccxt/js/static_dependencies/node-rsa/libs/rsa.js (rsa.js:12:15)
    at __require (chunk-RSJERJUL.js?v=d0062138:3:50)
    at node_modules/ccxt/js/static_dependencies/node-rsa/NodeRSA.js (NodeRSA.js:8:11)
    at __require (chunk-RSJERJUL.js?v=d0062138:3:50)
    at node_modules/ccxt/js/base/functions/crypto.js (crypto.js:8:17)
    at __require (chunk-RSJERJUL.js?v=d0062138:3:50)

重现步骤:

  1. 使用创建项目步骤
  2. npm install ccxt
  3. /src/routes/+page.svelte
    中使用
    import ccxt from "ccxt"

我的预期行为是包导入,我可以像文档所说的那样做

var ccxt = require ('ccxt') console.log (ccxt.exchanges) // print all available exchanges
我看到

这篇文章基本上说“为了让require

工作,尝试将其添加为开发依赖项”,所以我这样做了:

npm install --save-dev ccxt


require 仍然失败。无论如何,我不想使用 require,我想使用“import”。

编辑:

我设法使用

Uncaught ReferenceError: Buffer is not Defined 让我的 vite.config.js 做到这一点

import path from 'path' import inject from '@rollup/plugin-inject' import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; export default defineConfig({ plugins: [sveltekit()], resolve: { alias: { '@': path.resolve(__dirname, 'src'), } }, build: { rollupOptions: { plugins: [inject({ Buffer: ['buffer', 'Buffer'] })], }, }, })
现在我可以

console.log(ccxt.exchanges)

服务器端,但客户端仍然错误。但是,进步了。

edit2:我还尝试了

ReferenceError: Buffer is not Defined in vite/sveltekit with Torus 的勾选答案,上面写着

resolve: { alias: { '@toruslabs/openlogin': path.resolve( './node_modules/@toruslabs/openlogin/dist/openlogin.umd.min.js' ) } }
但这也失败了。

我尝试了“Goutham J.M”的答案,得到了很多赞成票,又长又复杂,但遇到了错误

[ERR_MODULE_NOT_FOUND]: Cannot find package '@esbuild-plugins/node-globals-polyfill'

,但我不知道如何解决这个问题,而且这太兔子洞了。

javascript svelte sveltekit ccxt
1个回答
2
投票
不幸的是,像

ccxt

这样的nodejs库(相对于浏览器或客户端库)
在客户端SvelteKit中并未得到正式支持;它们仅在服务器端 SvelteKit 中受支持。

通常,最好的解决方案是将 Nodejs 库的使用限制为服务器端 SvelteKit。 这在 99% 的情况下应该足够了:

对于 1% 的时间,这还不够,您必须填充 NodeJS 内置依赖项 (

Buffer

) 和/或从相关库中删除 NodeJS 依赖项 (
ccxt
)。


有时,polyfilling 会让一些 Nodejs 库在客户端工作。 (Buffer是nodejs内置模块):

  1. 修复本地开发错误
  2. 修复构建时错误
不过,看来你已经尝试过polyfilling了。

© www.soinside.com 2019 - 2024. All rights reserved.