2017-04-13 103 views
0

在此typescript book section作者解释了延迟加载与下面的例子:延迟模块加载如何在打字稿中工作?

import foo = require('foo'); 

export function loadFoo() { 
    // This is lazy loading `foo` and using the original module *only* as a type annotation 
    var _foo: typeof foo = require('foo'); 
    // Now use `_foo` as a variable instead of `foo`. 
} 

据笔者打字稿只加载的foo在第一次调用类型require,但在第二次调用时会创建一个foo变种它会加载创建var _foo所需的全部模块。

这是如何工作的。可有人告诉什么是引擎盖下发生的情况更详细的例子吗?

回答

1

它在typescript handbook

编译器检测在所发射的 JavaScript的每个模块是否被使用提及。如果模块标识符只使用过的作为一种类型的 注释的一部分,并且从不作为表达,则没有需要呼叫是 该模块射出。

在这个例子中,第一foo(一个没有下划线)在类型的注释作为typeof参数只使用一次,所以第一个require('foo')从生成的JavaScript代码删去。您可以查看生成的.js文件看到,有将只有一个调用require在runtine,“第二”之一。

loadFoo()被调用时,require('foo')执行,调用内置的node.js,加载在运行时以通常的方式foo模块require()功能。

1

打字稿2.4现在支持Dynamic Import Expressions在那里你可以懒洋洋地导入模块。

这里是例子

async function getZipFile(name: string, files: File[]): Promise<File> { 
const zipUtil = await import('./utils/create-zip-file'); 
const zipContents = await zipUtil.getContentAsBlob(files); 
return new File(zipContents, name); 

}

它依然使用 “规定”,你可以在transpiled code here

看到幕后的背后