【问题标题】:Creating a tree-shakable angular library with a single import module使用单个导入模块创建可摇树的 Angular 库
【发布时间】:2020-05-01 09:45:46
【问题描述】:

上下文

我正在创建一个具有 2 种初始化方式的库:

  1. 自动 - 我为您异步下载一些东西,然后初始化。
  2. 手动 - 你之前已经下载了这些东西,然后我立即初始化库(同步)。

我过去曾成功实现过可摇树的库。我们通常会做的是将代码分成两个模块,让应用程序开发人员选择导入哪个模块,从而允许对另一部分进行 tree-shaking。与此类似:

import { LibraryAsyncModule } from 'my-library'; // ???? Or LibrarySyncModule

@NgModule({
    imports: [LibraryAsyncModule] // ???? Or LibrarySyncModule
})
export class AppModule { }


我想要完成的事情✔

为了减少使用我的库的学习曲线,我正在尝试设计一个包含相关模块并允许摇树的单个导入模块。下图显示了所需的结构。

我想避免什么????

我可以创建工厂提供程序来检测传递给forRoot() 的配置并在运行时 加载相应的模块。但是,在运行时导入模块会将初始化变为异步,并且还会阻止 Angular 将使用的模块与应用程序捆绑在一起。

我需要一个构建时间解决方案。我的原型表明,在核心模块中简单地包含同步和异步模块会导致两者都被捆绑在一起。 那个单一的模块会是什么样子?有什么想法/建议吗? ????

【问题讨论】:

    标签: javascript angular typescript webpack


    【解决方案1】:

    您的方法应该有效,但您需要启用它。

    由于 Tree-shaking 仅适用于 es6 模块,您需要使用它发布您的库并在您的 package.json 中指定 module 属性。

    // package.json
    {
      ...
      "main": "dist/index.js",
      "module": "dist/es/index.js", // <- this file should contain es modules not commonjs
      ...
    }
    

    此设置将告诉打包程序(在您的情况下为 webpack)使用 es 模块导出并允许它们启用 tree-shaking 功能。

    我建议软件包开发人员使用tsdx cli 工具,它会自动执行此操作并支持许多其他功能,例如 TypeScript 支持等。

    npx tsdx create mylib
    

    【讨论】:

    • 嗨@felixmosh,感谢您的回复。你能提供一个例子,或者一个链接吗?我不太明白如何实施您的建议。
    • 试试我的建议库(tsdx),它会帮助你理解它。
    • tsdx 看起来很有趣,但我正在寻找一种不同的解决方案。更具体地说,我试图避免在我的工作流程中加入另一个工具。我们都受够了,不是吗? ?
    • 这是一个用于构建库的开发工具,无需再包含另一个工具,这将定义您所需要的一切,它支持开箱即用的 TS
    • 根据我的经验,tsdx 让开发一个库变得超级简单,只需在某个侧面文件夹中运行它,npx tsdx create mylib 你会看到为了获得可摇树而需要进行的所有配置库
    猜你喜欢
    • 2019-11-08
    • 2023-03-13
    • 2020-06-19
    • 2019-02-07
    • 2020-03-24
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多