NestJS 7.x 折腾记: (1) 项目初始化及常规提交门禁加入

994 阅读3分钟

前言

系列常规操作,没兴趣的可以跳过这篇水文.
写过Angular 2+的小伙伴会有一种天然的熟悉感.
因为Nest基本就是同一个思想模式搞得~~

实操

安装

npm i -g @nestjs/cli

CLI Help

还是熟悉的模样,极具通用性的CLI,
可以快速创建各种模块和中间件~

 linqunhe@crper-MBP  ~/Code  neh                        
Usage: nest <command> [options]

Options:
  -v, --version                                   Output the current version.
  -h, --help                                      Output usage information.

Commands:
  new|n [options] [name]                          Generate Nest application.
  build [options] [app]                           Build Nest application.
  start [options] [app]                           Run Nest application.
  info|i                                          Display Nest project details.
  update|u [options]                              Update Nest dependencies.
  add [options] <library>                         Adds support for an external library to
                                                  your project.
  generate|g [options] <schematic> [name] [path]  Generate a Nest element.
    Available schematics:
      ┌───────────────┬─────────────┐
      │ name          │ alias       │
      │ application   │ application │
      │ class         │ cl          │
      │ configuration │ config      │
      │ controller    │ co          │
      │ decorator     │ d           │
      │ filter        │ f           │
      │ gateway       │ ga          │
      │ guard         │ gu          │
      │ interceptor   │ in          │
      │ interface     │ interface   │
      │ middleware    │ mi          │
      │ module        │ mo          │
      │ pipe          │ pi          │
      │ provider      │ pr          │
      │ resolver      │ r           │
      │ service       │ s           │
      │ library       │ lib         │
      │ sub-app       │ app         │
      │ resource      │ res         │
      └───────────────┴─────────────┘
 linqunhe@crper-MBP  ~/Code  nest new --help 
Usage: nest new|n [options] [name]

Generate Nest application.

Options:
  --directory [directory]                  Specify the destination directory
  -d, --dry-run                            Report actions that would be performed without
                                           writing out results.
  -g, --skip-git                           Skip git repository initialization.
  -s, --skip-install                       Skip package installation.
  -p, --package-manager [package-manager]  Specify package manager.
  -l, --language [language]                Programming language to be used (TypeScript or
                                           JavaScript).
  -c, --collection [collectionName]        Schematics collection to use.
  -h, --help                               Output usage information.

项目初始化

# 初始化项目
# nest-project: 就是你要初始化的项目名
nest new nest-project

image.png

目录结构解释

├── .eslintrc.js # eslint 规则配置
├── .gitignore # git忽略配置
├── .prettierrc # prettier格式化工具配置
├── README.md # 项目初始化描述文档 
├── nest-cli.json # 脚手架Nest的项目级别配置
├── package.json # 不言而喻
├── src
│   ├── app.controller.spec.ts # 单元测试文件
│   ├── app.controller.ts # controller, 功能接口写这里
│   ├── app.module.ts # 根模块,模块有很清晰的领域概念,可以包含自己的provider,service,也能打包给别人用
│   ├── app.service.ts # Provider,就是提供者,比如数据库数据获取,第三方接口组装
│   └── main.ts # 项目主入口文件
├── test # 单元测试目录
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── tsconfig.build.json # 生产模式ts配置文件,继承tsconfig.json,做了一些其他覆写配置而已
├── tsconfig.json # ts配置文件
└── yarn.lock # 不言而喻

nest默认的单元测试使用的是Jest,亲切友好.

提交门禁配置

提交门禁是一种很好的东东,基本是项目必备的.
业务组那边用的是我们包装过的提交门禁(中文化及规则改动),
系统组就不需要了,直接采用github angular那套提交规范即可.

安装

 # @commitlint/cli @commitlint/config-conventional : 校验提交规格的(这套是angular那套)
 # commitizen 可以拦截git cz 触发规则校验提交交互
 # lint-staged 可以给git暂存区特定文件设置执行规则,比如ts走tslint,所有文件prettier
 # husky 可以拦截git钩子做一些事情,比如提交记录拦截去执行校验
 yarn add @commitlint/cli @commitlint/config-conventional commitizen lint-staged husky

配置(package.json)

配置支持分离式加载(比如.lintstagedrc,YAML!)和package.json
package.json不是很丰满的情况下,我更倾向于写在里面

{
  "name": "xxx-bff-core",
  "version": "0.0.1",
  "description": " xxxx 3.0 BFF",
  "author": {
    "email": "linqh@xxxx.com",
    "name": "linqunhe"
  },
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "cross-env NODE_ENV=development nest start --watch",
    "start:debug": "cross-env NODE_ENV=development nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json",
    "pm2start": "npm run build && pm2 start ecosystem.config.js",
    "commit": "git cz" # yarn commit 或者npm run commit可以唤醒交互式提交
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged", # 准备提交的时候执行lint-staged的逻辑,看下面
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS "  # lint-staged过了之后再校验提交规格!
    }
  },
  "lint-staged": { # 校验哪些文件走规则,这里就是所有js相关的先格式化再eslint规范化
    "src/**/*.{js,ts,tsx,jsx}": [
      "prettier --write",
      "eslint --fix"
    ]
  },
  "commitlint": { # commitlint提交规则配置
    "extends": [
      "@commitlint/config-conventional"
    ]
  }

}

效果图

这样提交的commit可读性很强
2020-11-06 14.20.21.gif
image.png

结语

有不对之处请留言,
会及时修正,谢谢阅读!