大家好,我想在一个函数时运行时才import其它模块,并且执行这模块里的某个函数,伪代码如下:
function call(mod_str: string, func_str: string) {
let mod = IMPORT(mod_str);
mod[func_str]();
}
call("module/test", "foo");
请问下在typescript里能实现类似功能吗?谢谢。
大家好,我想在一个函数时运行时才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");
呃,异步的话不好确定执行顺序,没有同步的么?
我发现直接用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模块,有两种方法:
import b from "aaa/b"
;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只能用于开发模式,发布模式后就不行了。