typescript里如何运行时import & 执行 别的模块里的函数

大家好,我想在一个函数时运行时才import其它模块,并且执行这模块里的某个函数,伪代码如下:

function call(mod_str: string, func_str: string) {
        let mod = IMPORT(mod_str);
        mod[func_str]();
}

call("module/test", "foo");

请问下在typescript里能实现类似功能吗?谢谢。

你这都写出来了,干嘛不试试呢?

可以呀,不过动态import返回的是一个异步的Promise,可以用await:

// TestModule.ts
const {ccclass, property} = cc._decorator;
@ccclass
export default class TestModule {
    test() {
        cc.log(123);
    }
}
// TestLoad.ts
async load(mod_str, mod_func) {
    let mod = await import(mod_str);
    let modClass = mod.default;
    let modInstance = new modClass();
    modInstance[mod_func](); // 控制台输出123
}
load("TestModule", "test");
1赞

呃,异步的话不好确定执行顺序,没有同步的么?

我发现直接用require就是同步的。。。

// TestModule.ts
const {ccclass, property} = cc._decorator;
@ccclass
export default class TestModule {
    test() {
        cc.log(123);
    }
}
// TestLoad.ts
function load(mod_str, mod_func) {
    let mod = require(mod_str);
    let modClass = mod.default;
    let modInstance = new modClass();
    modInstance[mod_func](); // 控制台输出123
}
load("TestModule", "test");

在函数里也可以require吗?在js里可以直接require,但在ts里会报错:找不到名称"require"。

运行时是存在require的,ts中不知道有它而已。在代码开头加一行声明即可:

declare let require: (string)=>any;

加上declare是可以了。还有一个问题,如果运行时被require的文件之前没有被静态require过,还是不行的,会报:
Can not find deps [./module/xxx] for path : preview-scripts/assets/Scripts/aaa.js

@jun37213721
typescript 貌似会在编译时会移除没有使用的脚本文件/代码, 应该是可以通过编译选项关闭这个功能.
但是正统的做法应该是用import(), Promise本身是容易理解和使用的.

看了下cc.require()的实现,想要运行时require aaa/b.ts模块,有两种方法:

  1. 先在其它地方显示声明过import b from "aaa/b";
  2. 使用require("b"); // 注意这里只能是文件名b,不是全路径aaa/b。

目前我自己先写了一个_require来实现我的需求:

function _require(path): object {
    path = "preview-scripts/assets/Scripts/" + path + ".js";
    let modules: object = window["__modular"]["modules"];
    let m: object = modules[path];
    return m["module"]["exports"];
}

不确定这样实现有没有其它问题。

==============================
后面发现上面的_require只能用于开发模式,发布模式后就不行了。:cold_sweat: