前言
系列常规操作,没兴趣的可以跳过这篇水文. 写过Angular 2 的小伙伴会有一种天然的熟悉感. 因为Nest基本就是同一个思想模式搞得~~
实操
安装
代码语言:javascript复制npm i -g @nestjs/cli
CLI Help
还是熟悉的模样,极具通用性的CLI, 可以快速创建各种模块和中间件~
代码语言:javascript复制 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.
项目初始化
代码语言:javascript复制# 初始化项目
# nest-project: 就是你要初始化的项目名
nest new nest-project
目录结构解释
代码语言:javascript复制├── .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那套提交规范即可.
安装
代码语言:javascript复制 # @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不是很丰满的情况下,我更倾向于写在里面
代码语言:javascript复制{
"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可读性很强
结语
有不对之处请留言, 会及时修正,谢谢阅读!