3.x使用动态import传变量报错

目前使用3.8.5,tsconfig指定ES2020,使用import动态导入只能支持固定字符串的写法,传入静态变量或者使用字符串模板都会报错:Chunk ‘chunks/60/game’ has a bad timestamp.

代码如下:
const name = “game”;
import(./${name}).then((module) => {
console.log(“Module loaded:”, module);
});

我看到官方23年提到这是JS的特性https://forum.cocos.org/t/topic/144395,说import必须是静态的,但是目前查到ES2020应该是支持传入字符串,包括AI也提到:
动态 import() 是 JavaScript 的原生功能(从 ES2020 开始支持),它返回一个 Promise ,允许在运行时加载模块。动态 import() 的路径可以是动态生成的字符串

目前我想了解的是:
1.目前Cocos中动态import只支持固定字符串,是Creator的限制还是确实是JS语法限制,
2.看报错堆栈感觉像编辑器做的检查,不知道app.asar\node_modules@editor这个路径下的ts脚本有没有办法查看

  • Creator 版本:3.8.5

  • 目标平台: 原生和网页都能100%复现

  • 首个报错:
    [PreviewInEditor] {hidden(::SceneExecutorImportExceptionHandler::)} AssertionError [ERR_ASSERTION]: Chunk ‘chunks/60/game’ has a bad timestamp.
    at new AssertionError (node:internal/assert/assertion_error:451:5)
    at Object.asserts (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\utils\asserts.ts:5:15)
    at PackModInstantiation.instantiate (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\executor\pack-mod-instantiation.ts:85:13)
    at C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\executor\index.ts:143:34
    at ExecutorSystem._instantiate (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\editor-systemjs\index.ts:167:30) {
    generatedMessage: false,
    code: ‘ERR_ASSERTION’,
    actual: undefined,
    expected: undefined,
    operator: undefined
    }
    Error: [PreviewInEditor] {hidden(::SceneExecutorImportExceptionHandler::)} AssertionError [ERR_ASSERTION]: Chunk ‘chunks/60/game’ has a bad timestamp.
    at C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\executor\index.ts:143:34
    at ExecutorSystem._instantiate (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\editor-systemjs\index.ts:167:30) {
    generatedMessage: false,
    code: ‘ERR_ASSERTION’,
    actual: undefined,
    expected: undefined,
    operator: undefined
    }
    at Logger._logHandler (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\builtin\scene\dist\script\3d\manager\startup\log.ccc:1:487)
    at Logger.record (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@base\electron-logger\lib\renderer.ccc:1:458)
    at console. (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@base\electron-logger\lib\renderer.ccc:1:1414)
    at console.error (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@sentry\src\instrument\console.ts:40:20)
    at ScriptManager._handleImportException (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\builtin\scene\dist\script\3d\manager\scripts.ccc:1:5408)
    at Executor.importExceptionHandler [as _importExceptionHandler] (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\builtin\scene\dist\script\3d\manager\scripts.ccc:1:3604)
    at Executor._onModuleLoaded (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\executor\index.ts:401:22)
    at SystemJS.onload (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\src\executor\index.ts:99:18)
    at triggerOnload (C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\static\executor\systemjs-bridge\out\index.js:270:10)
    at C:\ProgramData\cocos\editors\Creator\3.8.5\resources\app.asar\node_modules@editor\lib-programming\static\executor\systemjs-bridge\out\index.js:347:5

你该不会想做加载子游戏ts文件的操作吧?

确实是,目前只能是搞了个全局的映射表,以后每加一个子游戏就静态导入一下,放在表里

https://docs.cocos.com/creator/3.8/manual/zh/scripting/language-support.html

看下这个就知道了

这个思路走不通,ts不像js, 我在子游戏配置了个Json文件,json里配置类名等信息,子游戏是子包,通过gameId获取子游戏bundle名称进行加载,然后得到bundle,bundle可以加载bundle内的子游戏配置json文件,到这,基本就可以切换到子包里面预制或者场景,然后再UI里,去实例化protocol。仅做参考

cocos建议的是用bundle搞分包, 而不是前端的imort then搞分包(猜测是多平台兼容没做好)

这个看过了,按官方说法规范是ES6,但是实际上很多新特性都是支持的,我看import()也是ES2020的新特性,所以我不清楚为啥这个特性可用但只可用一半,除非这个特性是cocos官方做的支持或者做的限制,当然也可能我对js的特性理解有误,所以才需要懂的解释解释

感谢分享,我目前暂时没把代码分出去,只把资源分出去了 :joy: