Tencent / puerts

PUER(普洱) Typescript. Let's write your game in UE or Unity with TypeScript.
Other
4.98k stars 696 forks source link

[UE] IJSModuleLoader逻辑往js迁移 #1248

Open chexiongsheng opened 1 year ago

chexiongsheng commented 1 year ago

detail | 详细描述

在这个commit里头:https://github.com/Tencent/puerts/commit/a6853226fb763afc07b258da5e72d5b94f7da901 ,由于package.json里包含了本模块*.js文件是以cjs还是esm方式加载的信息,所以调整为优先加载package.json,但这又会导致其它一些npm模块加载失败,比如这两个issue: https://github.com/Tencent/puerts/issues/1199 https://github.com/Tencent/puerts/issues/1223

要解决这问题,目前 IJSModuleLoader所定义的c++/js分工方式并不能很好的解决。估计得把逻辑完全交给c++或者完全交给js。完全在c++做会比较复杂,特别是c++解析json并不方便。所以倾向于把逻辑放到js。

PrimaryFantasty commented 1 year ago

有个疑问请教:你们关于package.json和index.js的加载顺序的问题,是说按nodejs的解析,应当是先加载index.js,没有找到它才去查找package.json这个文件吗? 我看了node的文档:https://nodejs.org/docs/latest-v16.x/api/modules.html, 里面的描述似乎是说在require一个目录的时候,先尝试加载pakcage.json,找出其main字段的值,有效的话就去加载这个main指定的文件,无效的话就直接加载这目录之下的index.js。 这样的话,那先尝试读取package.json不是合理吗?还是我理解错了,或者,你们想说的是那个package.json的main字段?

chexiongsheng commented 1 year ago

有个疑问请教:你们关于package.json和index.js的加载顺序的问题,是说按nodejs的解析,应当是先加载index.js,没有找到它才去查找package.json这个文件吗? 我看了node的文档:https://nodejs.org/docs/latest-v16.x/api/modules.html, 里面的描述似乎是说在require一个目录的时候,先尝试加载pakcage.json,找出其main字段的值,有效的话就去加载这个main指定的文件,无效的话就直接加载这目录之下的index.js。 这样的话,那先尝试读取package.json不是合理吗?还是我理解错了,或者,你们想说的是那个package.json的main字段?

应该是先package.json,但按目前的做法,在C++里头做package.json的处理太复杂。所以才有这issue提的需求:c++只负责基本的文件的读取,existed判断,把cjs逻辑全放js(nodejs的做法)。

zombieyang commented 1 year ago

https://github.com/zombieyang/puerts-ts-loader/blob/main/upm/Runtime/NodeModuleLoader/Typescripts/nodemodule-loader/resolve.mjs 从node.js源码里抠出来的cjs逻辑

PrimaryFantasty commented 1 year ago

感谢两位前辈

chexiongsheng commented 1 year ago

https://github.com/zombieyang/puerts-ts-loader/blob/main/upm/Runtime/NodeModuleLoader/Typescripts/nodemodule-loader/resolve.mjs 从node.js源码里抠出来的cjs逻辑

上面有__webpack_require__之类的代码,是用webpack压缩过了?另外也没看到require的实现 我看nodejs里头cjs的实现是在node\lib\internal\modules\cjs\下,和你这个有比较大的区别。

PrimaryFantasty commented 1 year ago

这两个:https://github.com/zombieyang/puerts-ts-loader/blob/2.0.0-pre.5/upm/Runtime/NodeModuleLoader/Typescripts/nodemodule-loader/resolve.mjs#L4903

https://github.com/nodejs/node/blob/v16.16.0/lib/internal/modules/cjs/loader.js#L342 解析的规则似乎不一样。 尚未实际运行过代码,上面的结论待验证。

PrimaryFantasty commented 1 year ago

node官方的cjs解析,有处理符号链接(最终调用了fs的realpathSync), 并且支持preserveSymlinks作进一步配置。Puerts的目前在c++实现模块文件search,FPath拼接处理,跳过"node_modules",已有的问题是若采用pnpm等依赖符号链接的工具,解析有问题。

chexiongsheng commented 1 year ago

逻辑移动到js,感觉性能会下降(多了js和c++间的路径传递)。看了下目前碰到的问题貌似都解决了 https://github.com/Tencent/puerts/issues/1404,在这个commit解决了https://github.com/Tencent/puerts/commit/5ad19653d350eec8311b6fc79030820fe7b5f061 已经解决,亲测express运行没问题。 而开头两个关于package.json和index.js顺序的问题,在这个commit也解决了:https://github.com/Tencent/puerts/commit/743d3d3a2043217e4ce2a533a292277385bf56d8

暂时先不做吧。