求creator 3.0 npm 引入 web3的方法

求npm 引入 web3的方法
直接npm install web3 就是这个结果:
2021-03-14 17:53:29-error: 无法加载模块 file:///crypto :Error: 在加载模块文件 /crypto 时发生错误:Error: ENOENT: no such file or directory, open ‘/crypto’.
2021-03-14 17:53:29-error: 无法加载模块 file:///buffer :Error: 在加载模块文件 /buffer 时发生错误:Error: ENOENT: no such file or directory, open ‘/buffer’.
2021-03-14 17:53:29-error: 无法加载模块 file:///os :Error: 在加载模块文件 /os 时发生错误:Error: ENOENT: no such file or directory, open ‘/os’.
2021-03-14 17:53:29-error: 无法加载模块 file:///path :Error: 在加载模块文件 /path 时发生错误:Error: ENOENT: no such file or directory, open ‘/path’.
2021-03-14 17:53:29-error: 无法加载模块 file:///child_process :Error: 在加载模块文件 /child_process 时发生错误:Error: ENOENT: no such file or directory, open ‘/child_process’.
2021-03-14 17:53:27-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/web3/package.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “web3”,
| ^
3 | “version”: “1.3.4”,
4 | “description”: “Ethereum JavaScript API”,
5 | “repository”: “https://github.com/ethereum/web3.js”,.
2021-03-14 17:53:30-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/swarm-js/archives/archives.json :SyntaxError: unknown: Unexpected token, expected “;” (2:17)

1 | {

2 | “windows-amd64”: {
| ^
3 | “archive”: “swarm-windows-amd64-1.6.7.exe”,
4 | “binaryMD5”: “c2d827dc4553d9b91a7d6c1d5a6140fd”,
5 | “archiveMD5”: “059196d21548060a18a12e17cc0ee59a”.
2021-03-14 17:53:30-error: 无法加载模块 file:///assert :Error: 在加载模块文件 /assert 时发生错误:Error: ENOENT: no such file or directory, open ‘/assert’.
2021-03-14 17:53:30-error: 无法加载模块 file:///http :Error: 在加载模块文件 /http 时发生错误:Error: ENOENT: no such file or directory, open ‘/http’.
2021-03-14 17:53:31-error: 无法加载模块 file:///https :Error: 在加载模块文件 /https 时发生错误:Error: ENOENT: no such file or directory, open ‘/https’.
2021-03-12 21:05:41-warn: [Scene] No need to specify the “type” of “MyBotton.hoverLabelColor” because cc.Color is a child class of ValueType. Just set the default value to ‘new cc.Color()’ and it will be handled properly. MyBotton hoverLabelColor cc.Color
2021-03-14 17:53:32-error: 无法加载模块 file:///stream :Error: 在加载模块文件 /stream 时发生错误:Error: ENOENT: no such file or directory, open ‘/stream’.
2021-03-14 17:53:32-error: 无法加载模块 file:///url :Error: 在加载模块文件 /url 时发生错误:Error: ENOENT: no such file or directory, open ‘/url’.
2021-03-14 17:53:29-error: 无法加载模块 file:///util :Error: 在加载模块文件 /util 时发生错误:Error: ENOENT: no such file or directory, open ‘/util’.
2021-03-14 17:53:32-error: 无法加载模块 file:///querystring :Error: 在加载模块文件 /querystring 时发生错误:Error: ENOENT: no such file or directory, open ‘/querystring’.
2021-03-14 17:53:32-error: 无法加载模块 file:///events :Error: 在加载模块文件 /events 时发生错误:Error: ENOENT: no such file or directory, open ‘/events’.
2021-03-14 17:43:16-warn: [Scene] No need to specify the “type” of “MyBotton.hoverLabelColor” because cc.Color is a child class of ValueType. Just set the default value to ‘new cc.Color()’ and it will be handled properly. MyBotton hoverLabelColor cc.Color
2021-03-14 17:53:34-error: 无法从 file:///Users/necklace/work/Legend/client/Legend/node_modules/swarm-js/node_modules/got/index.js 解析出模块 ./package,已将其视为外部模块。
这是因为:Error: 以 file:///Users/necklace/work/Legend/client/Legend/node_modules/swarm-js/node_modules/got/index.js 为起点找不到模块 “./package”
2021-03-14 17:53:34-error: 无法加载模块 file:///fs :Error: 在加载模块文件 /fs 时发生错误:Error: ENOENT: no such file or directory, open ‘/fs’.
2021-03-14 17:53:34-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/mime-db/db.json :SyntaxError: unknown: Unexpected token, expected “;” (2:40)

1 | {

2 | “application/1d-interleaved-parityfec”: {
| ^
3 | “source”: “iana”
4 | },
5 | “application/3gpdash-qoe-report+xml”: {.
2021-03-14 17:53:35-error: 无法加载模块 file:///constants :Error: 在加载模块文件 /constants 时发生错误:Error: ENOENT: no such file or directory, open ‘/constants’.
2021-03-14 17:53:36-error: 无法加载模块 file:///zlib :Error: 在加载模块文件 /zlib 时发生错误:Error: ENOENT: no such file or directory, open ‘/zlib’.
2021-03-14 17:53:36-error: 无法加载模块 file:///async_hooks :Error: 在加载模块文件 /async_hooks 时发生错误:Error: ENOENT: no such file or directory, open ‘/async_hooks’.
2021-03-14 17:53:34-error: 无法从 file:///Users/necklace/work/Legend/client/Legend/node_modules/swarm-js/node_modules/got/index.js 解析出模块 electron,已将其视为外部模块。
这是因为:Error: 以 file:///Users/necklace/work/Legend/client/Legend/node_modules/swarm-js/node_modules/got/index.js 为起点找不到模块 “electron”
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/chains/kovan.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “kovan”,
| ^
3 | “chainId”: 42,
4 | “networkId”: 42,
5 | “comment”: “Parity PoA test network”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/chains/mainnet.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “mainnet”,
| ^
3 | “chainId”: 1,
4 | “networkId”: 1,
5 | “comment”: “The Ethereum main chain”,.
2021-03-14 17:53:34-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/elliptic/package.json :SyntaxError: unknown: Unexpected token, expected “;” (2:8)

1 | {

2 | “name”: “elliptic”,
| ^
3 | “version”: “6.5.4”,
4 | “description”: “EC cryptography”,
5 | “main”: “lib/elliptic.js”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/chains/rinkeby.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “rinkeby”,
| ^
3 | “chainId”: 4,
4 | “networkId”: 4,
5 | “comment”: “PoA test network”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/homestead.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “homestead”,
| ^
3 | “comment”: “Homestead hardfork with protocol and network changes”,
4 | “eip”: {
5 | “url”: “https://eips.ethereum.org/EIPS/eip-606”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/chainstart.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “chainstart”,
| ^
3 | “comment”: “Start of the Ethereum main chain”,
4 | “eip”: {
5 | “url”: “”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/chains/goerli.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “goerli”,
| ^
3 | “chainId”: 5,
4 | “networkId”: 5,
5 | “comment”: “Cross-client PoA test network”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/tangerineWhistle.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “tangerineWhistle”,
| ^
3 | “comment”: “Hardfork with gas cost changes for IO-heavy operations”,
4 | “eip”: {
5 | “url”: “https://eips.ethereum.org/EIPS/eip-608”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/spuriousDragon.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “spuriousDragon”,
| ^
3 | “comment”: “HF with EIPs for simple replay attack protection, EXP cost increase, state trie clearing, contract code size limit”,
4 | “eip”: {
5 | “url”: “https://eips.ethereum.org/EIPS/eip-607”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/constantinople.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “constantinople”,
| ^
3 | “comment”: “Postponed hardfork including EIP-1283 (SSTORE gas metering changes)”,
4 | “eip”: {
5 | “url”: “https://eips.ethereum.org/EIPS/eip-1013”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/istanbul.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “istanbul”,
| ^
3 | “comment”: “HF targeted for December 2019 following the Constantinople/Petersburg HF”,
4 | “eip”: {
5 | “url”: “https://eips.ethereum.org/EIPS/eip-1679”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/byzantium.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

1 | {

2 | “name”: “byzantium”,
| ^
3 | “comment”: “Hardfork with new precompiles, instructions and other protocol changes”,
4 | “eip”: {
5 | “url”: “https://eips.ethereum.org/EIPS/eip-609”,.
2021-03-14 17:53:36-error: 无法加载模块 file:///Users/necklace/work/Legend/client/Legend/node_modules/ethereumjs-common/dist/hardforks/petersburg.json :SyntaxError: unknown: Unexpected token, expected “;” (2:10)

creator并不是nodejs,并不是所有包都能在creator中使用,推荐使用浏览器端能用的包

这个我大概知道,可是这个包在react环境是可以用上的,目标也是浏览器,所以我在想是不是有其他办法?

兄弟,你是安装web3时报错还是安装完之后,cocos报错?
我看你是安装的时候报错的

不是安装时报错,是creator预览都报错,因为web3里的一些子库可能是nodejs里通用的,这个web3是区块链ETH的库,自带types。可以在react环境下完美编译出浏览器目标的应用,我在想是不是cc也应该有办法,目前我是用的web3.min.js :laughing:

我搜索了一下,这个库
web3.js 是一个node和web通用的库,被打包成umd规范
umd规范,是指在commonjs(node用)和amd(浏览器用)的规范中都可以使用的。
源码中有一段判断逻辑,是判断使用哪个cryptojs(区分浏览器和node)


在cocos预览环境中,这个global可能是存在的,我猜测可能是这个导致你预览报错的。你可以尝试改一下这个逻辑试试看

react下,编译后是直接在浏览器运行,所以可能不存在这个问题
但在cocos预览就会有这个问题

我是想尽量不动这个库上的逻辑,因为这个很完整了,如果自己独立维护不现实

可能你需要克隆一下他的库,改一下源码,重新编译一下应该就可以了。
多多尝试。

比如:我们可以在package.json里做些什么,类似用webpack给环境变量等达到目的。

em,其实并非动这个库的逻辑,而是改一下,兼容cocos而已。

如果觉得麻烦,那我就没法子了,官方估计也没空处理

你说的改逻辑是,把你上面的这个图的判断取消掉用crypto-browserify?

或者你用将web3.min.js导入为插件试试,我觉得可以哦

em,应该是取消调用crypto-js吧,
看名字和逻辑
crypto-browserify 才是给浏览器用的

如下是否可以达到你所说的目的?:
var cryp = (typeof global === ‘undefined’ || !!globalthis)?require(‘crypto-browserify’) : require(‘crypto’);

这个应该去测试看看,思路大致是这样了

  1. 改源码,让crypto的引用,兼容cocos环境
  2. 将web.min.js导入为插件(应该可以,最方便了)

web3.min.js直接入assets下是可以用的,直接import Web3 from ‘web3.min.js’


我在想,是不是可以让这个global不有值可以用

确实是有不少库有这种问题:

  • 有些库是专门为 Node 定制的,具体表现就是它用了 Node 的内置库,什么 fspathcrypto 的;或者用了 global 这个Node 专属变量。这些库是无法在 Creator 里使用的。

  • 大多数库既像上面说的提供了 Node 版本,但也兼顾了咱们 Web 用户。但是这些库中大部分,又把包的入口设置成了 Node 的版本,而把 Web 版放在了什么 dist/**.jsdist/**.min.js 里面。这就是导致我们 import "<包名>" 拿到的是 Node 的版本,用不了。

    那这种情况我们就对症下药,去导入这个包里为 Web 定制的版本:import X from "<包名>/dist/**.js"

    但你会发现 TypeScript 爆红。为什么?因为即使这些包有类型说明,也是为那个入口的 Node 版本而做的类型说明。一般情况下,两个版本的接口定义是一样的,因此我们只要 “偷” Node 版本的类型说明就好了。就是任意新建个 .d.ts 到项目里,写:

    // 为模块 "<包名>/dist/**.js" 补充类型说明
    declare module "<包名>/dist/**.js" {
        export * from "<包名>"; // “偷” 主入口的类型说明
    }
    

    那我们是不是每用一个包都得确认它是为谁而做?目前确实是的。但是情况在改善,因为在新版的 Node里, package.json 有加入一个很好的机制来告诉用户什么情况应该使用哪个版本。

3赞

2021-03-14 17:53:29-error: 无法加载模块 file:///crypto :Error: 在加载模块文件 /crypto 时发生错误:Error: ENOENT: no such file or directory, open ‘/crypto’.

这个报错我们会在后面优化下,它其实就是说该模块使用了 Node 内置库 crypto

image

2赞