【BUG】3.0.1的 import 无法完美兼容 mjs 和 cjs(common js)的自定义模块

  • Creator 版本:3.0.1
  • 目标平台: chrome
  • 重现方式:必现

尝试使用mjs和cjs,各有各的bug,都不能完美使用。
但是我看了编译后的源码,实际上引擎开发团队动动小拇指就能完美结果。

希望能够在3.1中解决该BUG。

问题一:
当使用mjs时候,import 必须写扩展名才能编译通过,且正常运行。
但是写了扩展名,vscode就不认了。vscode只认“无扩展名”和“.js”或“.ems.js”的扩展名。
这有好多种解决方案,例如加入.ems.js的支持,或加入无扩展名的自动识别的支持。

mjs文件

问题二:
当使用cjs的时候,文件扩展名为.js,此时可以编译,vscode能够正常识别,但无法正常运行。
所有exports 中的对象都被一起塞到了default中,这是很明显的错误。

cjs文件

希望能够在3.1中解决该BUG。
希望cocos团队动动小拇指,同时兼容cjs和mjs,这样开发者可以任意选择,感谢:pray:

补充一下cjs下断点到的import对象,可以更好得展示所有对象都被塞到了default中:

所有对象都被塞到了defaut

你好,这个不是 BUG,是我们定制的规范,见这里有正式描述: 模块规范 · Cocos Creator

稍微总结一下:

  • 模块格式鉴别 .mjs 后缀的文件会被认为是 ESM 模块,.cjs 以及大部分情况下的 .js 后缀的文件会被认为是 CommonJS 模块。

  • 模块格式交互 当你在 ESM 模块里 import from CommonJS 模块时,CommonJS 模块的 exportsmodule.exports) 会被当作 “ESM 模块默认导出” 的形式进行导入。也就是说你需要使用 import M from "./cjs",其中 M 就是 CommonJS 模块 ./cjsexports

    提示:import M from "./cjs" 相当于 import { default as M } from "./cjs"

  • 模块路径后缀名 import /* ... */ from "模块" 里模块的路径必须要加后缀名。除非它是 ts

现在来看一下你提出的问题。

但是写了扩展名,vscode就不认了。vscode只认“无扩展名”和“.js”或“.ems.js”的扩展名。

可以试着将 DataManager.d.ts 改名为 DataManager.mjs.d.ts

当使用cjs的时候,文件扩展名为.js,此时可以编译,vscode能够正常识别,但无法正常运行。
所有exports 中的对象都被一起塞到了default中,这是很明显的错误。

是的,这是我们的规定。见我上面列出的第二条。这条规定和 Node.js 的行为是一致的,见 Node.js中,ESM 与 CommonJS 的交互机制

3赞

mjs正确释放方式1

感谢Cocos团队,完美解决,学到老活到老~

1赞

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。