在打字稿中实现树摇动

VJA*_*JAI 5 typescript tree-shaking

我正在使用 TypeScript 和 OpenTelemetry 构建一个可重用的遥测库。我正在尝试了解如何实现树摇动,以便消费者可以仅导入他们需要的模块而不是所有内容,这样他们就可以减少整体包的大小。项目结构如下所示,

lib
|
|__ trace
|    |____ TraceClass.ts
|    |____ index.ts
|
|__ metrics
|    |____ MetricClass.ts
|    |____ index.ts
|
|__ logs
|    |____ LogClass.ts
|    |____ index.ts
|
|__ index.ts
Run Code Online (Sandbox Code Playgroud)

我将三个主要模块“trace”、“log”和“metrics”作为单独的文件夹。正如您所看到的,每个模块都有自己的“index.ts”文件,并且有一个根“index.ts”文件。假设根“index.ts”文件是否导出子模块等所有内容。

根索引.ts

export * from './trace';
export * from './metrics';
export * from './logs';
Run Code Online (Sandbox Code Playgroud)

假设消费者TraceClass从根文件导入,如下所示,

import { TraceClass } from 'mytelemetrylib';
Run Code Online (Sandbox Code Playgroud)

上面的代码是否导入了其代码中的所有模块?

或者他们必须做这样的事情?

import { TraceClass } from 'mytelemetrylib/trace';
Run Code Online (Sandbox Code Playgroud)

fme*_*dez 0

如果在index.ts跟踪文件夹中:

lib
|
|__ trace
|    |____ TraceClass.ts
|    |____ index.ts
Run Code Online (Sandbox Code Playgroud)

您已经导出了所有内容(例如export * from './TraceClass';),并且在TraceClass.ts类中也导出了(例如export class TraceClass),然后import可以访问显式导出的所有内容(例如import { TraceClass } from 'mytelemetrylib';就足够了)。

此外,为了代码清晰,您可以对导出进行“命名空间”。例如:

export * as Trace from './trace';
export * as Metrics from './metrics';
export * as Logs from './logs';
Run Code Online (Sandbox Code Playgroud)

然后消费者可以导入:

import { Trace, Metrics, Logs } from 'mytelemetrylib';
Run Code Online (Sandbox Code Playgroud)

并将它们用于:

Trace.TraceClass // or any other explicitly exported trace related functionality.
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1963 次

最近记录:

4 年,7 月 前