我想在 NestJS 中为我的公司创建一个可重用模块库,可以将其作为 npm 依赖项导入到各个项目中。目标是避免为每个新项目重写常见模块,如身份验证、缓存、记录器等。
过去,我使用 Lerna 创建具有类似
@[company-name]/[module-name]
结构的 NPM 包,并且我想使用 NestJS 库结构复制类似的东西。
有人可以指导我如何在 NestJS 中实现这一目标吗?具体来说:
更准确地说,我想完成类似 Angular 中发生的事情,其中所有
@angular/[module]
也共享相同的版本。
创建一个新的 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 {}
为每个库添加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"]
}
建立你的图书馆: 发布之前,需要构建各个模块,生成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
安装您的库: 在您的其他 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 模块的管理方式。