Node.js ES6/TypeScript动态导入-静态导入导致启动时间缓慢(Nodejs CLI)
在我的nodejs代码中,我用ES6Node.js ES6/TypeScript动态导入-静态导入导致启动时间缓慢(Nodejs CLI),node.js,typescript,command-line-interface,es6-modules,Node.js,Typescript,Command Line Interface,Es6 Modules,在我的nodejs代码中,我用ES6import{…}从“x”替换了许多require(x)。 不幸的是,这对我的nodejs CLI程序的启动时间非常不利 首先让我给大家介绍一下背景: 我有一个nodejs CLI程序,它使用了大量的外部软件包,但这些软件包中的大多数只有在极少数情况下才需要(例如,如果向我的程序传递了特定的标志)。 这些导入为我的程序的启动时间带来了巨大的开销。 由于这些导入,即使是像myprogram--help这样的琐碎命令也需要一秒钟以上的时间 为了解决这个启动时间问题
import{…}从“x”
替换了许多require(x)
。
不幸的是,这对我的nodejs CLI程序的启动时间非常不利
首先让我给大家介绍一下背景:
我有一个nodejs CLI程序,它使用了大量的外部软件包,但这些软件包中的大多数只有在极少数情况下才需要(例如,如果向我的程序传递了特定的标志)。
这些导入为我的程序的启动时间带来了巨大的开销。
由于这些导入,即使是像myprogram--help
这样的琐碎命令也需要一秒钟以上的时间
为了解决这个启动时间问题,我想对某些功能进行“动态导入”。
换句话说,我只想在给定CLI命令实际需要特定功能时导入某些包
在旧的require
-机制中,通过有条件地调用require
可以实现这一点。然而,我不知道如何为现代打字脚本代码做到这一点
如果您对此类启动时间问题有任何建议,请告知我。您可以在TypeScript中使用:
动态导入表达式是ECMAScript的一项新功能和一部分
允许用户在任意时间异步请求模块
在你的程序中的点
这意味着您可以有条件地和惰性地导入其他模块
和图书馆。例如,这里有一个只导入
在需要时提供实用程序库
(在JavaScript中,这仍然是一个建议:)
例如:
您有一个主文件和两个依赖项
./main.ts
./dependency-a.ts
./dependency-b.ts
依赖项“a”将快速加载
console.log('exporting dependency-a');
导出常量a=()=>{
log('称为dependency-a');
};
而依赖项“b”将缓慢加载
console.log('exporting dependency-b');
//我们将模拟一个带有循环的慢速同步任务,以增加延迟
// https://stackoverflow.com/a/38839049/4669212
函数等待(ms:number){
var start=Date.now(),
现在=开始;
同时(现在-开始<毫秒){
now=Date.now();
}
}
等待(5000);
导出常量b=()=>{
log('称为dependency-b');
};
在主文件中,您可以有条件地调用导出的函数,但由于依赖项“b”,启动时间会很慢,即使您只想调用依赖项“a”:
从“/dependency-a”导入{a};
从“./dependency-b”导入{b};
常量运行=(dep:'a'|'b')=>{
交换机(dep){
案例“a”:
返回a();
案例“b”:
返回b();
违约:
log('do nothing');
}
};
run();
您可以这样使用dynamic 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”及其导入语句(如果有)。这意味着您的CLI将有更好的启动时间