如何在 NestJS 中创建可重用模块库以供内部用作 npm 依赖项?

问题描述 投票:0回答:1

我想在 NestJS 中为我的公司创建一个可重用模块库,可以将其作为 npm 依赖项导入到各个项目中。目标是避免为每个新项目重写常见模块,如身份验证、缓存、记录器等。

过去,我使用 Lerna 创建具有类似

@[company-name]/[module-name]
结构的 NPM 包,并且我想使用 NestJS 库结构复制类似的东西。

有人可以指导我如何在 NestJS 中实现这一目标吗?具体来说:

  • 如何构建我的代码以将这些模块创建为库?
  • 如何将它们发布为 npm 包以便在不同项目中轻松重用?

更准确地说,我想完成类似 Angular 中发生的事情,其中所有

@angular/[module]
也共享相同的版本。

typescript npm nestjs lerna
1个回答
0
投票

第 1 步:构建您的 NestJS 库


创建一个新的 NestJS 项目: 使用 Nest CLI 创建一个新项目。

nest new my-company-library

生成您的模块: 在新创建的 NestJS 项目中,生成要创建为可重用库的模块。例如:

nest g mo authentication
nest g mo cache
nest g mo logger

组织您的模块: 以易于维护的方式构建模块。您可以创建一个 libs 目录来包含所有可重用模块。

my-company-library/
├── libs/
│   ├── authentication/
│   ├── cache/
│   └── logger/
├── src/
└── ...

导出您的模块: 确保每个模块(例如,authentication.module.ts)导出所有必需的内容:

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';

@Module({
  controllers: [AuthController],
  providers: [AuthService],
  exports: [AuthService],
})
export class AuthenticationModule {}

第 2 步:配置您的库以进行发布


为每个库添加package.json: 每个模块应该有自己的package.json。为每个模块在 libs 目录中创建一个,例如 libs/authentication/package.json:

{
  "name": "@company-name/authentication",
  "version": "1.0.0",
  "main": "dist/authentication/index.js",
  "types": "dist/authentication/index.d.ts",
  "scripts": {
    "build": "tsc",
    "prepublishOnly": "npm run build"
  },
  "peerDependencies": {
    "@nestjs/common": "^9.0.0",
    "@nestjs/core": "^9.0.0"
  }
}

构建配置: 确保您的库的根目录中有一个 tsconfig.json,它将您的库编译到 dist 文件夹中。

tsconfig.json 示例:

{
  "compilerOptions": {
    "outDir": "./dist",
    "module": "commonjs",
    "target": "es2016",
    "lib": ["es2017", "esnext.asynciterable"],
    "allowJs": true,
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["libs/**/*.ts"],
  "exclude": ["node_modules"]
}

第 3 步:发布您的库


建立你的图书馆: 发布之前,需要构建各个模块,生成dist文件夹。

npm run build --prefix libs/authentication
npm run build --prefix libs/cache
npm run build --prefix libs/logger

发布到NPM: 确保您已登录 npm 帐户并发布每个包:

cd libs/authentication
npm publish --access public

cd ../cache
npm publish --access public

cd ../logger
npm publish --access public

版本管理: 您可以使用 Lerna 或类似工具来管理版本并自动化发布过程。 Lerna 让您可以轻松处理库的单一存储库。这是快速设置指南:

全局安装 Lerna:

npm install -g lerna

在您的项目中初始化 Lerna:

lerna init

为模块(例如 libs)设置包目录:

{
  "packages": [
    "libs/*"
  ],
  "version": "0.0.0"
}

使用Lerna命令更新和发布库:

lerna publish

第 4 步:在其他项目中使用您的库


安装您的库: 在您的其他 NestJS 项目中,您可以像这样安装库:

npm install @company-name/authentication
npm install @company-name/cache
npm install @company-name/logger

导入您的模块: 像使用任何其他 npm 包一样将模块导入到您的应用程序中:

import { Module } from '@nestjs/common';
import { AuthenticationModule } from '@company-name/authentication';
import { CacheModule } from '@company-name/cache';

@Module({
  imports: [AuthenticationModule, CacheModule],
})
export class AppModule {}

结论


通过执行这些步骤,您将创建一个可重用的 NestJS 模块库,该模块可以在各个项目之间轻松共享,从而减少重复并鼓励一致性。使用 Lerna 有助于有效管理版本控制和依赖关系,类似于 Angular 模块的管理方式。

© www.soinside.com 2019 - 2024. All rights reserved.