我这里有一个关于这个问题的最小可重现示例。问题是
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)
重现步骤:
npm install ccxt
/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
编辑:
我设法使用
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'
,但我不知道如何解决这个问题,而且这太兔子洞了。
ccxt
这样的nodejs库(相对于浏览器或客户端库)在客户端SvelteKit中并未得到正式支持;它们仅在服务器端 SvelteKit 中受支持。
通常,最好的解决方案是将 Nodejs 库的使用限制为服务器端 SvelteKit。 这在 99% 的情况下应该足够了:
data
属性从 +page.svelte 访问。
fetch()
来自 +page.svelte(或几乎任何其他地方)的适当内部 API 端点 URL。
Buffer
) 和/或从相关库中删除 NodeJS 依赖项 (
ccxt
)。
不过,看来你已经尝试过polyfilling了。