Angular 8:使用库构建 monorepo 应用程序的更好方法

Ser*_*gey 2 angular-cli monorepo angular ng-packagr

我的 Angular monorepo 项目中有几个应用程序。我还编写了大约 5 个库以在应用程序中使用。

我想知道的是如何更好地构建/架构这些库

ins如下:

  1. 库仅供内部使用(意味着不能在其他应用程序中发布或使用,只能在projects文件夹中使用)
  2. 库具有不同的依赖项,例如lodashRxJs
  3. 一个库可以在其内部导入另一个库

到目前为止我所做的:

  1. 指定的umdModuleIds每个库的ng-package.json
  2. peerDependencies在外部库上指定,例如lodashRxJs
  3. 设置我的应用程序构建,其中包含通过“&&”组合的prebuild大约 5 个命令ng build lib-name
  4. 我以下一种方式导入 Lodash import { cloneDeep } from 'lodash'

现在我看到我的main.js块比将一些服务/组件/功能提取到外部库之前大得多。现在main.jsprod build 的大小是 2.1 Mb,在我看来这太大了。

另外,我不确定是否值得为每个库(UMD、FESM2015、FESM5)制作 3 个不同的版本。

我从 dist 文件夹中导入库,因为它在文档中推荐的遵循下一个表单import { LibService } from 'lib'

Chr*_*ert 8

Nrwl工具由 Angular 核心贡献者开发,专门研究企业架构,包括单一存储库。

Nrwl nx-examples是一个很好的入门资源。

我开始使用nx来构建一个新项目。最后,我的项目结构如下:

platform-directory/
  |
  ---apps/
  |  |
  |  ---app1/
  |  |
  |  ---app2/
  |
  ---library1/
  |  |
  |  ---src/
  |
  ---library2/
  |  |
  |  ---src/
  |
  ---angular.json
  |
  ---package.json
  |
  ---README.md
  |
  ---tsconfig.json
Run Code Online (Sandbox Code Playgroud)

配置文件

如果需要,顶层tsconfig.json应包含应用程序和库的大部分全局配置以及paths快捷方式。

路径快捷方式可以配置如下:

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "baseUrl": "./",
    "declaration": false,
    "downlevelIteration": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "module": "esnext",
    "moduleResolution": "node",
    "sourceMap": true,
    "target": "es6",
    "lib": [
      "es2018",
      "dom"
    ],
    "paths": {
      "@app1*": [
        "./apps/app1/src/app*"
      ],
      "@lib1/package1": [
        "./lib1/src/package1/public_api.ts"
      ],
      "@lib1/package2": [
        "./lib1/src/package2/public_api.ts"
      ],
     ...
}
Run Code Online (Sandbox Code Playgroud)

图书馆进口

在应用程序中,可以直接从库源中导入库代码,例如:

import { MyLibraryComponent } from '@lib1/package1'
Run Code Online (Sandbox Code Playgroud)

由于您不发布库,因此无需构建它们。当您在应用程序代码上运行 Angular 编译器时,库代码将根据需要自动包含和优化。

重要提示:在每个库中,不要使用路径快捷方式导入文件,因为这会导致难以调试的循环依赖。例如,在lib2它里面可以使用:

import { MyLibraryComponent } from '@lib1/package1'
Run Code Online (Sandbox Code Playgroud)

但是,如果在 中使用此导入lib1,则会创建循环依赖项。

作为旁注,每个应用程序都有一个tsconfig.app.jsontsconfig.spec.json如下所示:

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "outDir": "../../dist/out-tsc/apps/app1"
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 现在,您可以使用 Angular CLI 执行上述所有操作,无需 Nrwl - 工作区项目、多个应用程序、多个库、tsconfig 路径等。我知道 Nrwl 添加的内容不止这些,但它也是一个需要管理的额外构建框架 (2认同)