如何解决ES6 / TypeScript动态导入-由于静态导入Nodejs CLI,启动时间很慢
在我的nodejs代码中,我用ES6 require(x)
替换了许多import { ... } from "x"
。
不幸的是,这对于我的nodejs-CLI程序的启动时间非常不利。
首先让我给您一些背景知识:
我有一个nodejs-CLI程序,该程序使用一堆外部软件包,但是其中大多数软件包仅在极少数情况下才需要(例如,如果将特定标志传递给我的程序)。
这些导入对我的程序的启动时间造成了很大的开销。
甚至myprogram --help
这样的琐碎命令也要花费超过一秒钟的时间。
为解决此启动时间问题,我想对某些功能进行“动态导入”。 换句话说,仅当给定的CLI命令确实需要特定功能时,我才想导入某些软件包。
使用旧的require
机制,有条件地调用require
可以轻松实现。但是,我不确定如何对现代TypeScript代码执行此操作。
如果您对此类启动时间问题有任何建议,请告诉我。
解决方法
您可以在TypeScript中使用Dynamic Import Expressions:
动态导入表达式是ECMAScript的新功能和一部分 允许用户以任意方式异步请求模块 指向您的程序。
这意味着您可以有条件并懒惰地导入其他模块 和图书馆。例如,这是一个异步函数,仅导入 实用程序库。
(在JavaScript中,这仍然是一个建议:https://github.com/tc39/proposal-dynamic-import)
示例:
您有一个主文件和两个依赖项。
./main.ts
./dependency-a.ts
./dependency-b.ts
依赖项“ a”将快速加载。
console.log('exporting dependency-a');
export const a = () => {
console.log('called dependency-a');
};
依赖项“ b”加载缓慢时。
console.log('exporting dependency-b');
// We'll emulate a slow synchronous task with a loop to add delay
// https://stackoverflow.com/a/38839049/4669212
function wait(ms: number) {
var start = Date.now(),now = start;
while (now - start < ms) {
now = Date.now();
}
}
wait(5000);
export const b = () => {
console.log('called dependency-b');
};
在主文件中,有条件地调用导出的函数,但是由于依赖项“ b”,启动时间会很慢,即使您只想调用依赖项“ a”:
import { a } from './dependency-a';
import { b } from './dependency-b';
const run = (dep: 'a' | 'b') => {
switch (dep) {
case 'a':
return a();
case 'b':
return b();
default:
console.log('do nothing');
}
};
run();
您可以做的是使用动态import()表达式,如下所示:
const run = (dep: 'a' | 'b') => {
switch (dep) {
case 'a':
return import('./dependency-a').then(({ a }) => {
a();
});
case 'b':
return import('./dependency-b').then(({ b }) => {
b();
});
default:
console.log('do nothing');
}
};
run('a');
运行依赖项“ a”时,不会加载慢速依赖项“ b”(如果有的话就是import语句)。这意味着您的CLI将具有更好的启动时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。