Vite2 发布有一段时间了,其内部使用了 ESBuild 进行打包,ESBuild 有着相对 Webpack 惊人的打包速度。
React 用户表示令人羡慕,不过 Vite 野心比较大,不止可以用来开发 Vue 项目,类似 Rollup,Vite2 可以使用插件来支持 React 项目。
这就巧了,手上刚好有一个 React 练习项目,使用 Create React App 创建并且进行过 Eject。接下来我们就用这个 React 项目来练练手吧,享受一下飞一般的构建速度!
Vite2 发布有一段时间了,其内部使用了 ESBuild 进行打包,ESBuild 有着相对 Webpack 惊人的打包速度。
React 用户表示令人羡慕,不过 Vite 野心比较大,不止可以用来开发 Vue 项目,类似 Rollup,Vite2 可以使用插件来支持 React 项目。
这就巧了,手上刚好有一个 React 练习项目,使用 Create React App 创建并且进行过 Eject。接下来我们就用这个 React 项目来练练手吧,享受一下飞一般的构建速度!
第二章我们简单的介绍了下如何连接测试数据库,这篇我们将结合 TDD 来完整的实现注册和登录功能。(如果接下来我写的内容你已经做过,可以跳过该步)
按照 Nest 提供的示例 E2E 测试, 位于 test/app.e2e-spec.ts
应该长这样
1 | import { Test, TestingModule } from '@nestjs/testing' |
现在是运行不了的,不过没关系,我们稍稍改造一下
首先我们测试一个用于检查健康的接口 /hello
, 无需导入整个 AppModule
, 只需导入 AppController
,改造为下列的样子
1 | import { Test, TestingModule } from '@nestjs/testing' |
然后执行
1 | yarn test:e2e |
这一节, 我们引入 Swagger 来自动根据代码里的注脚来生成接口文档。
Nest 为我们提供了一个专用的模块来搭配 Swagger 来使用
1 | yarn add @nestjs/swagger swagger-ui-express |
在我们的应用入口文件 main.ts
中添加一个 createSwagger
方法, 并在 bootstrap
方法中初始化它
1 | import { INestApplication, ValidationPipe } from '@nestjs/common' |
在 createSwagger
中, 我们首先读取了来自 package.json
中的版本号来作为接口的版本
然后我们设置了 Title 和 Bearer 鉴权认证入口, 我们还设置了 /docs
为我们文档的入口
最后,我们判断环境变量中的 SWAGGER_ENABLE
是否打开, 如果打开我们就初始化 Swagger 文档系统。
在 .env
和 .env.template
中增加 SWAGGER_ENABLE=true
, 然后启动服务器
访问 http://localhost:3000/docs
就能看见我们的接口文档创建好啦!
这里记录了一些个人学习 Flutter 时遇到的一些问题, 可以作为避免踩坑和速查手册. 如有疑问欢迎留言.
上一章中, 我们完成了鉴权功能, 也就是 Auth 模块, 顺便简单实现了下注册和登录功能. 这一章我们就来正式的将登录和实现功能做完, 含有完整的数据校验和转化.
在正式的开始完善功能之前, 我们现清理重构一下已有的代码.
我们上一张的登录和注册是写在 app.controller.ts
中的, 如果所有的路由都写在这里的话就会比较杂乱, 所以我们将它移动到 Auth 模块下.
首先生成 AuthController
1 | nest g controller auth |
然后将 /auth/register
和 /auth/login
移到 AuthController 下
1 | import { Body, Controller, Post, Request, UseGuards } from '@nestjs/common' |
顺便也移动下测试代码, 这里就不再赘述了.
上一章我们创建了一个用户表, 但是还没有实现真正的注册和登录. 要实现注册登录以及后续的权限校验, 我们还有一些工作要做.
目前有比较多的思路来对用户进行鉴权, 我们选用 Conduit 示例中展示的也是现在比较广泛的做法 JWT 进行认证.
要实现 JWT 鉴权, NestJS 为我们做好了大部分工作.
但是在这之前, 我们要先安装下面的依赖
1 | yarn add @nestjs/passport passport passport-local |
Passport 你可以把它看作是一个小型的框架, 因为你可以通过一些简单的回调函数来进行配置. Passport 会在适当的时候对其进行调用.
而 @nestjs/passport
则对 Passport 进行了很好的集成.
上一个文章我们介绍了如何搭建一个开发环境和 Pipeline, 这篇文章开始我们将正式的用 TDD 的模式实现一个后端项目.
我们选用了 Postgres 作为我们的数据库, 操作数据库的 ORM 我们选用 TypeORM, 这是一个 TypeScript 友好的 ORM, 并且 nest 也提供了非常便利的集成方法.
1 | yarn add @nestjs/typeorm typeorm pg |
编辑 app.module.ts
1 | import { Module } from '@nestjs/common' |
emmm, 最近计划着学习后端,本来想从 Java 开始,奈何新的知识点一股脑涌进来,只知道教程怎么做,而不说为什么,很是迷茫。
于是想从熟悉的技术栈开始,结合最近学习的知识(TDD、Docker、GitHub Actions)和想学的知识(NestJS、Postgres、Swagger)一步一步巩固和学习。
顺便记录下来沉淀和输出自己的知识,也希望能帮到大家少走一些弯路,告别 2019,迎接 2020!
我们这次将要实现的系统是 Conduit 的 API 部分,前些时间我已经 TDD 实践实现了 Conduit 的前端部分,技术栈选择了 Preact.
Conduit 是什么,这是一个基于 Realworld 的示例项目。Realworld 集合了现今大部分的前后端框架,他们用不同的语言和技术展实现了同一个系统,也就是我们这次要做的 Conduit。
当然,Realworld 现在也有 NestJS 的实现,不过既然是结合自己的知识点来学,当然不能照抄啦,假装网友们还没用 NestJS 实现它好啦,[偷笑][偷笑]
这次用到的技术栈有:Nestjs
TypeScript
Postgres
Jest
Docker
Github Actions
Swagger
ESLint
, 然后我们会以 TDD 的方式进行开发,遵循“红-绿-重构”的方式一步一步的完成我们的项目。
好,话不多说,赶紧进入实战演练吧!
如果不声明 network
字段, 在同一个 docker compose 之间可以通信吗?
可以。
如果不指定一个特定的 network, docker 会指定容器在一个名为
docker0
的默认网桥中
如果不声明 expose
选项, 那么同一网络中的其他容器可以访问该容器吗?
可以。
但如果启动docker守护进程时指定了
--icc=false
选项,则不可以。
建议声明, 声明该选项有助于使用者了解容器内暴露了那些端口出来供使用。
在同一个网络中不同的容器使用了同一个端口会有冲突吗?
不会。
不同的容器使用不同的 host, 所以哪怕两个容器使用了同样的端口,也不会与其他容器冲突。
expose
和 ports
字段有什么区别?
如果容器内的端口需要在宿主环境访问,则需提供 ports
字段
expose
字段在默认情况下是可选的,即使不声明也可以在同一个网络中使用该容器的端口
最近在使用 Cypress 作为前端项目的 E2E 测试,发布到 CI 环境时自动运行。
运行时发现在 Pipeline 测试报告中有生成 mp4 格式的视频,这才想起来 Cypress 自带生成视频快照的功能,结合 Jenkins 收集报告产物,不就可以拿到视频快照了吗?
哈哈,talk is cheap, show my code!
下面是 jenkins 配置
1 | pipeline { |
其中 ttf-wqy-zenhei
是用来解决 Ubuntu 系统中没有中文字体等问题,否则生成的视频报告中的中文都为方框乱码。
如果是在 CentOS 中,执行
yum -y groupinstall chinese-support
解决中文问题
如果不知道 Jenkins 所属运行环境,使用
uname -a
查看系统信息
archiveArtifacts
用来收集报告产物
junit
用来收集测试报告,但 Cypress 默认是不生成报告的,需要在 cypress.json
中增加以下内容
1 | { |