全栈学习日记之core

32 阅读6分钟

前言:做了几年的前端,发现对于后端的知识比较缺乏,而且对于一个项目所要具备,编写的过程没有一个特别清晰的认知,把这些知识做一个串联,把空缺的知识面补上,通过做一个项目整理出来。所以接下来也会通过几个部分编写,然后把自己一些想法记录下来,后面也能够重新回顾,在编码思想上有一个好的进步。不会太注重于代码如何编写,而是总结一些在代码中的思考。

💡 那对于代码的编写,重要的是编写的思路,不是工具的应用,所以在选择哪种语言上选择了node+koa,这样能让我边梳理,更加容易上手,后续用java也是换一个用法,最近公司也是我们一个人负责一个模块的前后端工作,所以也是在同步进行。


🔥 接下来我想整理一个接下来要做的事情,如果没有明确清晰的架构,那也不会清楚自己接下来要干什么。以及每一层要做的事情,一步步来。

技术层级架构

结构内容
展示层包含前端所涉及到的所有内容
BFF层是转发层,也是会拿到做一些接口消费的功能
数据层就是我们的数据库,我们可以在BFF层消费它

image.png

技术架构(首先是BFF层)

image.png

❓什么是BFF层,先介绍一下。

🤔️ 是一种后端架构模式,翻译过来就是 专门为前端服务的后端层,位于前端与后端之间的适配层。

🐸 当然如果项目只有一个前端,一个后端是不用用到BFF的,当你公司项目多端,显示内容不用,需要更种不同的接口数据,BFF层能够帮到你,增加灵活性,并且多版本维护,接口聚合等等。
性能提升:正常发起请求需要经过浏览器解析域名,dns,防火墙等等一系列节点,通过BFF进行架构调整减少节点。密钥签名,放在bff层不对外暴露。ssr。

缺点: 多了一层系统,运维成本,容易写成 业务后端重复开发接口膨胀难维护等

编写代码?

在实现代码之前,最重要的是约定好要如何实现。约定优于配置

言简意赅就是,思考文件怎么放,怎么加载,怎么统一命名,这样会对于你后面开发减少很多麻烦。

eg:你实现了十几个不同的功能文件,有controller,service,middleware,那全部放在一个文件里面,哪里使用哪里require?是怎么命名的?

影响: 没有约定好的后果就是,代码不清晰,代码混乱,后续接手的同事需要花费大量时间去理解。

core 出现了!

意思是:核心层,定义框架的运行规则!!
💡:框架怎么运行的?系统怎么启动?请求怎么流动?模块怎么加载?

loader层

💡:自动加载目标文件夹下功能文件,挂载。

思考:有时候写一个功能文件,然后加载,会出现这里一句require(),某个文件又引入同个 require(),所以在写loader 会先定义好controller这些文件要怎么加载,所以在文件结构上会预先定义好。

  1. 目录结构约定

    • app/controller/ - 存放所有控制器文件
    • app/service/ - 存放业务逻辑层代码
    • app/extend/ - 存放扩展方法代码,可以向 app 扩展额外的方法
    • app/middleware/ - 存放自定义中间件
    • app/router/ - 存放路由定义文件
    • app/router-schema/ - 存放路由参数定义文件
    • config/ - 存放环境配置文件
  2. 命名约定

    • 控制器文件名自动映射到路由路径
    • Service 类名与文件名保持一致
    • 中间件函数名即为中间件名称
  3. 加载约定

    • 框架启动时自动扫描约定目录
    • 按照预定义顺序加载各个模块

写代码中引发的思考

思考1

情况:
有时候很喜欢写死代码,比如像是定义端口,服务地址,或者一些标识。应该有意识把它们抽离出来。可能会遇到你定义了很多接口,都是/api/bmp/开头。

突然有一天,项目搬迁到别的系统,别的系统已经占用了这个标识,要你全部改为 /uav-api/bmp/开头,但是现阶段已经写死在很多文件里,参杂了很多逻辑不说,也不知道改了会影响什么效果。
eg:你有很多个不同模块的api文件,定义的路径都是: /api/xxxx/xxxxx/,然后在vue或者jsx文件中都类似于写死的 http://xxx:8080/api/xxx/xxx/。
这个时候你修改就是全局搜索 /api/xxx/ 替换 /uav-api/xxxx/。一运行:满屏飘红。

思考2:加载顺序问题

可以通过分析依赖关系,优先加载被依赖的模块,避免后续使用的模块没办法调用到。
而在用node+koa中,最重要的是你模块app.use的顺序。不然容易出现拿不到的问题。

思考3:try catch的问题

catch的类型有很多种,文件不存在,代码出错等,在进行日志打印的时候根据报错信息要准确提示相对应错误。
image.png
进入了 catch 逻辑,是代码异常,或者编译错误,不一定是文件不存在。

准确使用状态码

eg:301,302,303

💡301:“这个资源永久搬家了,以后请访问新地址”,后端返回location。

浏览器发起请求时候,如果看到301+location,会立刻重新发起一次请求。会发生两次请求。关键是浏览器会永久记忆,浏览器会认为这个资源已经永久迁移,会缓存这个重定向关系。

下次一次再输入地址会直接访问新地址。例如:http->https,后面浏览器记住会直接补成https。
为什么这么设计?减少一次网络请求。

开发配置:

/a
301 → /b

上线后发现:

跳错了

因为用户浏览器已经记住了之前跳转的旧地址。

302:因HTTP协议规定,302状态码要求客户端以GET方式访问新地址,导致原POST数据丢失,早起互联网发现如果post->post会有危险,导致重复提交。现在如果修改,老网站会崩,乱套。
搜索引擎看到:

302
一般认为:
旧 URL 才是正式地址
不会彻底迁移权重
不会永久替换索引
-----
从“提交动作”  
变成了  
“查看结果”

后续的303,307 被发明,都是为了给前面的擦屁股。303解决用户重刷新问题,有表单提交的时候会弹窗提示是否重复提交。302浏览器可能 GET,也可能不 GET。

持续更新记录中~~后续会重新整理这篇文章,插个眼在这里~~~