Analog
On this page

构建 Angular 类库

Angular 类库是为了支持许多不同的服务和功能而构建的。可以使用 Vite 构建 Angular 类库,并将其发布到 npm。

创建类库

如果你正在创建一个新包,请使用 library schematic:

ng generate lib my-lib

对于现有的类库,请遵循设置说明。

设置

安装 @analogjs/platform 包:

npm install @analogjs/platform --save-dev

接下来,在项目根目录下创建一个 vite.config.ts,并配置它以构建类库。

更新 my-lib 的引用以匹配类库项目名称。

export default defineConfig(({ mode }) => ({
  root: __dirname,
  cacheDir: '../../node_modules/.vite/libs/my-lib',
  plugins: [angular()],
  resolve: {
    mainFields: ['module'],
  },
  build: {
    target: ['esnext'],
    sourcemap: true,
    lib: {
      // 类库入口点
      entry: 'src/public-api.ts',

      // 包输出路径,必须包含 fesm2022
      fileName: `fesm2022/my-lib`,

      // 发布为 ESM 包
      formats: ['es'],
    },
    rollupOptions: {
      // 添加应从捆绑包中排除的外部类库
      external: [/^@angular\/.*/, 'rxjs', 'rxjs/operators'],
      output: {
        // 生成单个文件捆绑包
        preserveModules: false,
      },
    },
    minify: false,
  },
}));

接下来,更新项目配置以使用 @analogjs/platform:vite 构建器来构建类库。

{
  "name": "my-lib",
  "$schema": "../../node_modules/nx/schemas/project-schema.json",
  "sourceRoot": "projects/my-lib/src",
  "prefix": "lib",
  "projectType": "library",
  "architect": {
    "build": {
      "builder": "@analogjs/platform:vite",
      "options": {
        "configFile": "projects/my-lib/vite.config.ts",
        "outputPath": "dist/projects/my-lib"
      },
      "defaultConfiguration": "production",
      "configurations": {
        "development": {
          "mode": "development"
        },
        "production": {
          "sourcemap": true,
          "mode": "production"
        }
      }
    }
  }
}

调整项目根目录下的 package.json 以指向构建输出。包含安装包时所需的任何必要的 dependenciespeerDependencies

{
  "name": "my-lib",
  "description": "Angular 类库的描述",
  "type": "module",
  "peerDependencies": {
    "@angular/common": "^19.0.0",
    "@angular/core": "^19.0.0"
  },
  "dependencies": {
    "tslib": "^2.0.0"
  },
  "types": "./src/public-api.d.ts",
  "exports": {
    "./package.json": {
      "default": "./package.json"
    },
    ".": {
      "import": "./fesm2022/my-lib.mjs",
      "require": "./fesm2022/my-lib.mjs",
      "default": "./fesm2022/my-lib.mjs"
    }
  },
  "sideEffects": false,
  "publishConfig": {
    "access": "public"
  }
}

复制资产

默认情况下,public 目录中的静态资产会复制到构建输出目录。如果要复制该目录之外的其他资产,请使用 nxCopyAssetsPlugin Vite 插件。

导入插件并进行设置:

/// <reference types="vitest" />
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
  // ...
  plugins: [angular(), nxCopyAssetsPlugin(['*.md', 'package.json'])],
}));

构建类库

运行构建命令:

ng build my-lib

发布类库

使用 npm login 登录后,使用 npm publish 命令发布包。

要查看输出而不发布,请使用 --dry-run 标志。

npm publish dist/projects/my-lib --dry-run

要将类库发布到 npm:

npm publish dist/projects/my-lib