TypeScript 中有一种动态导入机制,尽管实现方式因模块类型而异。
以下示例(针对 AMD)将有条件地加载模块:
declare function require(moduleNames: string[], onLoad: (...args: any[]) => void): void;
import * as ModuleAlias from './mod';
const someCondition = true;
if (someCondition) {
require(["./mod"], (module: typeof ModuleAlias) => {
console.log(module.go());
});
}
文件顶部的import语句是惰性的,除非if (someCondition)条件为真,否则模块的实际加载不会发生。
您可以通过更改someCondition 并查看对网络选项卡的影响来测试这一点,或者您可以查看生成的代码...在动态版本中,"./mod" 不会出现在define 调用中。在非动态的情况下,它确实如此。
动态加载
define(["require", "exports"], function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const someCondition = true;
if (someCondition) {
require(["./mod"], (module) => {
console.log(module.go());
});
}
});
没有动态加载
define(["require", "exports", "./mod"], function (require, exports, ModuleAlias) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const someCondition = true;
if (someCondition) {
console.log(ModuleAlias.go());
}
});