求creator 3.0 npm 引入 web3的方法

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赞

不错,感谢大神支招

大佬 你这问题解决了吗?

这个方式能具体讲一下吗?

你是遇到了什么问题?

引入Web3报错问题呢

引入Web3报错问题,运行报错!

import web3 from "web3/dist/web3.min.js"

用大佬的办法可行

半年了哈,斗胆过来问老铁要一份web3.d.ts :rofl:应该不过分吧

这个在web3的包里有提供,你找一下

1赞

但是还不能直接在creator 里引用,只能按楼上的方法

1赞

2.x版本的有救吗?还是报web3 undefined.

大佬,2.4.6报错

load script [web3] failed : Error: Cannot find module ‘bn’

还有救没