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

有个问题在于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 文件夹里的东西太多了,所以想只用压缩后的库。 如果不提取 我再试试。

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

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

你好,这个碰撞检测库能用吗?【detect-collisions】
https://github.com/Prozi/detect-collisions
我npm导入后,vscode里一切正常,但是运行后提示 xxx类不是构造方法

你是怎么导入的?试试这样:

import detect from 'detect-collisions';
new detect.System();

:smile: 好了,多谢局长

这个有什么后续计划吗 大佬 3.6会有改观吗