Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js ES6/TypeScript动态导入-静态导入导致启动时间缓慢(Nodejs CLI)_Node.js_Typescript_Command Line Interface_Es6 Modules - Fatal编程技术网

Node.js ES6/TypeScript动态导入-静态导入导致启动时间缓慢(Nodejs CLI)

Node.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这样的琐碎命令也需要一秒钟以上的时间 为了解决这个启动时间问题

在我的nodejs代码中,我用ES6
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将有更好的启动时间