你想在 Creator 中使用哪些 npm 包?

预览没用抛错,只有构建发布抛错,我把源码修改下声明个空函数也能解决,但貌似不是正规解决方案

这个库目前有两个问题:一个是构建时候会抛错,如果自定义一个process.memoryUsage 函数可以构建成功,但是如果打包成APK会出现 发布成功但是 生成失败,无法生成APK.

说实话3.x这样根本不能叫“支持npm包”吧
官方是不是应该正面的回复一下了

rx lodash mobx 都不能直接用
下载十个常见的包,得有半数包都不能直接引入。

如果都是开发者通过到node_modules里去引用具体的文件,那也不能算是cocos creator本身适配了npm包吧,这基本等同于我只用npm下载但不按照npm规则引入。

而且3.x开始也主推ts脚本了,这样引入会让库的类型丢失。

这个帖子更是意味不明,其实3.x根本就没有在npm包支持上付出什么努力吧。
至少与2.x相比,cocos creator的npm包支持现在很差,不值得拿出来说。

Cocos Creator 永远不会依赖打包工具这句说的也是莫名其妙。为啥,如果能提升体验为啥不接入。至少能让3.x实际上的支持npm包。

当然了ccc是游戏引擎,对于很多人来说没有npm包支持也不是什么太大的问题,但就现在的支持程度,我觉得楼主以后还是不要宣传3.x对npm的支持了。

另外,丢失的类型可以通过tsconfig去定位类型的文件。有些库如果用不了也可以下载源代码,用ccc的import-map或插件脚本之类引入。但其实所有的替代方案,可维护性都很差,个人是觉得接受不了。

3赞

说的在理,除了部分确实不能用于原生的包,我觉得支持npm包就应该是无缝使用,和web开发一致,而不是看什么包有问题在这里问,浪费开发时间

有个问题在于npm出包规则和参数非常多,目前我们在2.x使用的npm在3x上都不能用,还不知道为什么不能用,可能是对各种模块不熟悉,所以还是很急切需要一个模版,为了节省开发者去尝试各种npm的参数和规则,不熟cocos需要的规则的情况下真的很费时间

最让我不爽的是,子包用不了npm。虽然自己也能想办法解决,但是官方没提供解决相关的解决方案,还是让我用起来不舒服。

不能直接引入的一个重要的原因就是很多 npm 包是专门为 Node 做的,里面的 fs、http 等模块是 web、原生、小游戏上没有提供的。

你有提到 Creator 没有按 npm 的规则来,你可否说一下所谓 npm 的规则是什么?据我所知,npm “官方” 的解析规则是由 mainexports 描述的,我们都有支持。browser非官方的,它的规范在这里: defunctzombie/package-browser-field-spec: Spec document for the ‘browser’ field in package.json (github.com) ,我们没有支持。

Cocos Creator 永远不会依赖打包工具 这句说的也是莫名其妙。

现在的打包工具层出不穷,每个打包工具也有很多关于模块解析的选项,我们觉得开放这些给开发者太复杂了;况且开发者也不一定愿意去学习配置。开放也会让我们以后无法迁移到别的工具,例如现在我们使用的是 rollup,而现在更快的打包工具例如 esbuild、swc-pack 等都跃跃欲试。

Node.js 关于模块的生态也在经历变革,能让“直接使用”的包,大多数使用了专属于某某打包工具的 “browser”、“module” 等字段,但是在新的 Node.js 模块生态中,已经有了统一替代物,很多持续维护的包也正在往这个方向靠拢。我们何乐而不为?

何为子包中用不了 npm?在子包中无法导入 npm 中的模块?

对于 “为什么不能用” 的错误提示我们后续会想办法优化,敬请期待

解决CocosCreator2.4.x的ABundle不能使用npm包的问题 - Creator 2.x - Cocos中文社区

1赞

这是 2.x 诶,3.x 理论上可以用啊

的确Node和浏览器都有自己的专有API,但我们写一些逻辑的时候大多数库是与这些逻辑无关的。就上面举例的rx、lodash、mobx都是与dom或fs无关的。说实话还是没理解到这个原因的说服力。
我提到的npm引入规则是指引入时可以像这样

import {Subject} from 'rxjs'

而不是

import rxjs from 'rxjs/bundles/xxx.min.umd.js'
const { Subject }  = rxjs

最后关于打包工具,的确esm是未来的标准,ts不需要任何适配可以直接引入esm包。
但它也是个在推行阶段的标准,不对browser和module适配,事实的结果就是,确实2.x能直接引入的包在3.x用不了了

大佬你驳倒我没意义,事实都说清楚了。
但是最后听一些社区意见,让类似我们的用户用的舒心点。
还是坚定的拥抱未来,等着npm生态来适配ccc,还是引擎组的相关人员才能决定。
就到这吧,我以后也不提了npm包这档子事了,毕竟我现在是实在的用着ccc 3.5.1在开发,再说怕不是要被当成黑子了。

我们肯定是欢迎开发者反馈的,我们也能感受到 import rxjs from 'rxjs/bundles/xxx.min.umd.js' 的不便。我们会继续努力优化~

1赞

async 包报这个错误 regeneratorRuntime is not defined

在什么情况下报的?我这里 web 预览没有报:

import async from 'async';
import { log } from 'cc';

log(async);

async.forEachOf({}, () => {

});

我是把 async.js 这个文件从 node_modules 里提取出来放到项目里的。 老版本的 async 2.6.3 是可以直接使用的。 3.2.3 的会报这个错误

那你试试就让它在 npm 里,然后去像我上面那样导入呢

感觉 node modules 文件夹里的东西太多了,所以想只用压缩后的库。 如果不提取 我再试试。

没有被使用的文件是不会打包进去的

了解了。项目上线之后。 如果使用了里面的其他文件。 会打到热更包里的吧。