实习中积累到的前端工程化知识 | 青训营笔记

209 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第8天。

项目开发流程

提交代码到gitilab=>gitlab触发事件到jenkins=>jenkins拉取指定分支代码webpack构建=>推送镜像到镜像仓库和kubernetes

kubernetes是开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能

webpack主要目的是集成代码、减少前端文件、以及兼容,打包出来的代码兼容新旧浏览器,然后输出到dist目录。部属时只需要dist里面的文件即可。容器打包会根据项目配置的Dockersfile文件,把webpack打包的dist进一步压缩成二进制文件,容器部署时,再解压出来。进去容器里面,看到的还是dist文件。

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。

Docker是一个开源应用容器引擎,基于Go语言并遵从Apache2.0协议开源 。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可已知的容器中,然后发不到任何Linux机器上,也可以实现虚拟化。Docker应用场景:

  • Web应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或扩展现有的OpenShift或CloudFoundry平台来搭建自己的PaaS环境。

SSR和CSR

服务器渲染:

服务端在返回 html 之前,在特定的区域,符号里用数据填充,再给客户端,客户端只负责解析 HTML 。

image.png

客户端渲染:

html 仅仅作为静态文件,客户端端在请求时,服务端不做任何处理,直接以原文件的形式返回给客户端客户端,然后根据 html 上的 JavaScript,生成 DOM 插入 html。

image.png

当代项目开发的几种架构模型

image.png

灰度发布

优点:提前收集用户使用意见,及时完善产品功能。控制未知异常只出现在小范围内,不影响大多数用户。发现产品是否存在外在问题(如合规),可及时回滚至已旧版本。

客户端渲染:每一个页面都需要去获取灰度规则,然后判断是否灰度,这个灰度请求将阻塞页面的,可能会造成较差的用户体验,所以我们可以考虑使用客户端的localStrage来存储这个用户是否为灰度用户,而不是每次请求资源时都发请求去判断是否为灰度用户,然后定期的更新localStrage内存储的值,取代大量的请求造成的体验问题。

npm模块安装机制

  • 发出npm install命令
  • 查询node_modules目录中是否已经存在指定模块,若存在,不再重新安装,若不存在,npm向registry查询模块压缩包的网址,下载,解压。
  • 执行工程自身pre install。
  • 确定首层依赖模块
  • 获取模块
  • 模块扁平化
  • 安装模块
  • 执行工程自身生命周期

pnpm

包管理器,优势在于:包安装速度极快/磁盘空间利用非常高效。

pnpm 内部使用基于内容寻址的文件系统来存储磁盘上所有的文件,这个文件系统出色的地方在于:

  • 不会重复安装同一个包。用 npm/yarn 的时候,如果 100 个项目都依赖 lodash,那么 lodash 很可能就被安装了 100 次,磁盘中就有 100 个地方写入了这部分代码。但在使用 pnpm 只会安装一次,磁盘中只有一个地方写入,后面再次使用都会直接使用 hardlink
  • 即使一个包的不同版本,pnpm 也会极大程度地复用之前版本的代码。举个例子,比如 lodash 有 100 个文件,更新版本之后多了一个文件,那么磁盘当中并不会重新写入 101 个文件,而是保留原来的 100 个文件的 hardlink,仅仅写入那一个新增的文件。
  • 支持monorepo
  • 安全性高

monorepo

单个仓库。将许多项目的代码存储在同一个repository中,这样做的目的是多个包本身相互独立,可以有自己的功能逻辑、单元测试等,同时在一个仓库下方便管理,而且模块划分的更加清晰,可维护性、可扩展性更强。