import的问题 求教


求指教

目前动态导入表达式 import(expr) 中的 expr 只能为字符串噢。

按照官方的例子重新写了下

依然报错


Dynamic import() · V8

能解释下原因吗? 目前看官方是支持的

实际上即时你写了 import('../../test')../../test 也会在游戏运行时一股脑加载进去。


原因

要想实现真正的动态加载或者说按需加载,Creator 必须要知道你会动态加载哪些模块?因为它需要把所有有可能加载的模块都编译好。大家可能会说,那不就是项目里 assets/ 下面的所有模块吗?并不。Creator 支持非 assets/ 下的模块,例如,npm 里的模块,例如项目根目录下 libs-xxxxxxx/ 下面的模块。这些 Creator 无从知晓。

即使我们知道了哪些模块会被加载,比如我们破釜沉舟,扫描项目下的所有 .ts.js 把它们都视为有可能加载的模块。我们还需要解决另一个问题——场景加载时候,哪些模块是需要的?例如,你一个模块里写了一个组件,这个组件在你第一个场景里用到了,那么 Creator 必须要在加载你这个场景之前加载好模块。场景和模块之间的关系是没有关联的,目前。

因此,现在 Creator 的做法就是,一股脑把所有模块都加载了。

1赞

如果想要实现这种需求, 我应该怎么改?

其实我只是想开发的时候不用手动去import, 通过一个函数 能自动创建我需要的对象

你给个你希望的代码效果示例?

类似这样

1赞

能否换一种角度看这个需求,就是希望能 以类名来导入某个类所在的模块,而不用知道它所在模块的路径?如果可以,我建议是用 导入映射 · Cocos Creator 来实现。

假设有两个类 AB,它们分别在 assets/a.tsassets/b.ts 下面,并且作为 默认导出。那可以创建一个导入映射,放在项目根目录,名为 import-map.json,内容如下:

{
  "imports": {
    "A": "./assets/a.ts",
    "B": "./assets/b.ts"
  }
}

然后按照文档中的步骤,把它设置到项目设置中。

然后就这样使用:

import A from 'A'; // 类 A
import B from 'B'; // 类 B

好的 谢谢,我尝试下

即使这样的话 ,我还是需要在文件头部 把所有用的到文件 import的进来,
那样我的文件头部 会非常大, 对开发也不友好
按常规来讲:一个大项目大概在1k 个文件 那个量级挺大的

如果这样的话 ,动态热更新加载怎么做 ? 需要退出游戏重新启动吗?

1赞