近几年由于 Node.js 的迅速发展,JavaScript 已经变成了一种全栈通用语言。
前端方面诞生了一系列提高开发者生产力的优秀前端项目框架:诸如 Angular、React、Vue 等。
而后端方面虽然有着诸如 Express,Koa,Fastify 等一系列优秀的开源库、工具,以及如eggjs、koa2等一些企业级的开发工具。但却缺乏真正意义上的框架。
直到nestJS的出现。
官方概述:
一个深受 Angular 启发,旨在构建高效、可靠、高拓展性服务端应用程序的先进的 Node.js 框架。
正如 Nest 作者所言——深受 Angular 启发,所以 Nest 的开发体验与 Angular 有些类似。既可以使用 TypeScript(与 Angular 相同,官方推荐),也可以使用 JavaScript 构建项目,同时结合了面向对象编程(Object Oriented Programming)、函数式编程(Functional Programming)、函数响应式编程(Functional Reactive Programming)等元素,可兼容主流第三方库与插件。
2.多功能性。适用于多种类型的服务端应用程序编写。
3.前沿先进。结合最前沿的 JavaScript 技术特性,将设计模式和成熟方案的理念带入 Node.js 领域中。
个人认为较为突出的有几点:
1.官方推荐使用 TypeScript,工程化意义重大。
2.内置支持 Express/fastify 服务器及其api 同时具有 socket.io 等套件,兼容其他库。
3.使用装饰器(ES7 Decorator)函数,无侵入式的语法使得代码逻辑更为清晰。
4.遵循控制反转(IoC, Inversion of Control)思想,大量使用依赖注入(DI, Dependency Injection)的设计模式,大大降低了单元间的耦合度。
5.内置的异常控制层(Exception Filter),权限控制层(Guard)与拦截层(Interceptor)。
6.集成工程化的测试,官方使用 Jest 测试框架。
https://docs.nestjs.cn/7/firststeps?id=%e5%bb%ba%e7%ab%8b
npm run prebuild //使用rimraf工具删除dist
npm run build // 打包(常用操作)
npm run format //启动prettier工具对src/test下所有.ts文件强制格式化整理
npm run start // 开启项目
npm run start:dev //开发模式:与start区别在于可以实时监听代码改变不用重启(常用操作)
npm run start:debug //开发模式:debug操作
npm run start:prod // 开发模式:启动dist/main中的项目(需先打包存在dist文件夹)
npm run lint // 启动tslint(代码规范工具)检查
npm run test // 测试模式 ---具体参考jest工具
npm run test:watch // 测试模式---实时监听改变
npm run test:debug // 测试模式---debug操作
npm run test:e2e // 读取./test/jest-e2e.json的配置文件开启单元测试
主程序入口文件及若干模块文件层次关系:
以上对src文件夹结构有了初步的认识
入口文件 main.ts 引导程序运行
加载模块 app.module.ts,模块中包括:
1.控制器 app.controller.ts
2.服务提供商 app.service.ts
3.测试用例 app.controller.spec.ts 等组件(这个测试用例可以删除,以后测试用例放置在test中统一管理)
app.controller.spec.ts
这个文件是一个测试用例文件,用于测试controller和service中对应的内容是否有效,引入了nest的测试模块采用moche测试工具语法
**app.controller.ts **
app.controller.ts 文件中定义了一个类,通过装饰器 @Controller() 使其成为一个路由控制类。类方法中,有构造函数 constructor 以及带有装饰器 @Get() 的 getHello 函数。其中AppService来自与app.service.ts文件
app.service.ts 文件:
app.service.ts中定义了一个AppService类通过@Injectable()装饰器将本类进行标注
getHello函数则是真正的实现方法
app.module.ts 文件:
这个文件用于注册各种模块或者服务的内容
@Module({}) // 模块的装饰器,参考NestJs官网
imports: [] //其他模块注册:如UserModule之类的
controllers: [] // 装饰器@Controller标注的类注册的地方,这里注册了app.controller.ts中的AppController类
providers:[] // 装饰器@Injectable()标注的类注册的地方,这里注册了app.service.ts中的AppService类
main.ts 文件:
main.ts文件项目启动以及端口配置
npm run start
然后从localhost:3000查看
从图中我们能够得到的信息大致为
1.运行 nodemon 监听项目文件
2.通过 ts-node 引导入口文件 main.ts
3.初始化模块与路由
依赖注入给人的感觉就像是不需要自己去new XX()实例,直接引入过来就可以用 如:
import { UserService } from ‘./user.service’;
constructor(private readonly userService: UserService) {}
this.userService.getlist();
前提是需要注册
@Module({
providers: [
UserService
]
})
装饰器给人的感觉就像是在某个方法/属性或者类上面加个说明。如:@controller告诉系统我是控制器类,实例化的时候你要让我来控制路由之类的、@body就是代表express中的request.body
详细情况请参照官网或者自行搜索答案,每个人的理解都有不同
app.e2e-spec.ts—e2e单元测试文件夹主要模拟接口请求操作,这里模仿了其操作可以尝试启用npm run test:e2e试试,注意:和app.controller.spec.ts测试用例还是有区别的。
app.e2e-spec.ts 文件:
配置文件可以在package.json里面看到引用
https://gitee.com/twang-gitee/nest-study
https://blog.csdn.net/lxy869718069/article/details/114028195