Backend For Frontend(服务于前端的后端)

Backend For Frontend(服务于前端的后端)

BFF,即 Backend For Frontend(服务于前端的后端)。玉伯在《从前端技术进化到体验科技》这篇文章中点出了 BFF 层的概念:

BFF 模式下,整体分工很清晰,后端通过 Java/C++ 等语言负责服务实现,理想情况下给前端提供的是基于领域模型的 RPC 接口,前端则在 BFF 层直接调用服务端 RPC 接口拿到数据,按需加工消费数据,并实现人机交互。基于 BFF 模式的研发,很适合拥有前端技术背景的全栈型工程师。这种模式的好处很明显,后端可以专注于业务领域,更多从领域模型的视角去思考问题,页面视角的数据则交给前端型全栈工程师去搞定。领域模型与页面数据是两种思维模式,通过 BFF 可以很好地解耦开,让彼此更专业高效

在 Web 服务里,搭建一个中间层,前端访问中间层的接口,中间层再访问后台的 Java/C++ 服务。这类服务的特点是不需要太强的服务器运算能力,但对程序的灵活性有较高的要求。这两个特点,正好和 Node.js 的优势相吻合。Node.js 非常适合用来做 BFF 层,优势如下:

  • 对于前端来说:让前端有能力自由组装后台数据,这样可以减少大量的业务沟通成本,加快业务的迭代速度;并且,前端同学能够自主决定与后台的通讯方式。
  • 对于后台和运维来说,好处是:安全性(不会把主服务器暴露在外面)、降低主服务器的复杂度等。

客户端渲染(CSR / Client side render):前端通过一大堆接口请求数据,然后通过 JS 动态处理和生成页面结构和展示。优点是前后端分离、减小服务器压力、局部刷新。缺点是不利于 SEO(如果你的页面然后通过 Ajax 异步获取内容,抓取工具并不会等待异步完成后再行抓取页面内容)、首屏渲染慢。

服务端渲染(SSR / Server Side Render):服务器返回的不是接口数据,而是一整个页面(或整个楼层)的 HTML 字符串,浏览器直接显示即可。也就是说,在服务器端直接就渲染好了,然后一次性打包返回给前端。优点是有利于 SEO、首屏渲染很快

总结: 搜索引擎优化 + 首屏速度优化 = 服务端渲染

备注:这里的「服务端渲染」只是让 Node.js 做中间层,不会替代后端的,后台同学请放心。

参考链接:

历史回顾:

(1)一开始,页面很简单,html 是后端渲染的(比如PHP、ASP、JSP等方式)。后端发现页面中的 js 好麻烦(虽然简单,但是坑多),于是让公司招聘专门写 js 的人,简称「前端切图仔」。

(2)随着 Node.js 和前端 MVC 的兴起,以及前端越来越复杂,慢慢演变成了「前后端分离」。

(3)前端的 SPA 应用流行之后,发现 SEO 问题很大,而且首屏渲染速度很慢,但是自己选的路再难走也要走下去,于是用 Node.js 在服务端渲染被看成是一条出路。

(4)以前在一起的时候,是后端做部分前端的工作;现在在一起的时候,是前端做部分后端的工作。

知名度较高的 Node.js 开源项目

  • express:Node.js 中著名的 web 服务框架。

  • Koa:下一代的 Node.js 的 Web 服务框架。所谓的“下一代”是相对于 Express 而言的。

  • Egg:2016 年,阿里巴巴研发了知名的 Egg.js 开源项目,号称企业级 Web 服务框架。Egg.js 是基于 Koa 开发的。

  • mocha:是现在最流行的 JavaScript 测试框架,在浏览器和 Node 环境都可以使用。

  • PM2:node 多进程管理。

  • jade:非常优秀的模板引擎,不仅限于 js 语言。

  • CoffeeScript:用简洁的方式展示 JavaScript 优秀的部分。

  • Atom:编辑器。

  • VS Code:最酷炫的编辑器。

  • socket.io:实时通信框架。

Node.js 版本常识

  • 偶数版本为稳定版(0.6.x ,0.8.x ,8.10.x)
  • 奇数版本为非稳定版(0.7.x ,0.9.x ,9.11.x)
  • LTS(Long Term Support)

参考链接:node.js 中 LTS 和 Current 的区别

npm 配置、换源、换储存库配置
https://blog.csdn.net/smalCat/article/details/79505441

https://blog.csdn.net/m0_55734628/article/details/129859196
https://www.jianshu.com/p/5e13c3afca4b

Node.js v20.7.0 文档

关于 Node.js 的内置模块和常见API,可以看官方文档。

查阅文档时,稳定指数如下:

  • 红色:废弃。
  • 橙色:实验。表示当前版本可用,其他版本不确定。也许不向下兼容,建议不要在生产环境中使用该特性。
  • 绿色:稳定。与 npm 生态系统的兼容性是最高的优先级。

https://www.cnblogs.com/ckfuture/p/14348168.html

Puppeteer

https://zhuanlan.zhihu.com/p/524254998
Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。

Puppeteer 默认以无头模式(headless)运行,也就是运行一个无界面的 Chrome 浏览器。

pm2 常用命令

https://blog.csdn.net/sinat_31057219/article/details/110225790

pm2 常用命令

启动应用:pm2 start xxx.js

查看所有进程:pm2 list

停止某个进程:pm2 stop name/id

停止所有进程:pm2 stop all

重启某个进程:pm2 restart name/id

删除某个进程:pm2 delete name/id

dotenv-safe是dotenv模块的扩展,从.env(不提交git)加载本地环境变量,并确保它们都存在。通过配置.env.example(提交git)文件来制定哪些变量必须要配置。

dotenv-safe 文档
https://www.cnblogs.com/VVsky/p/11065514.html

rimraf

npm install rimraf -g
rimraf node_modules

image
http://websong.wang/mytools/rimraf.html

批量删除node_moduels 目录

var fs = require("fs");
// D:/ws/front_ws/chapter01/node2
// var base = "./";
var base = "D:/ws/front_ws/chapter01/node2";
var list = fs.readdirSync(base);
var remove = require("rimraf");
function recursion(list, base) {
  for (var i = 0; i < list.length; i++) {
    if (fs.statSync(base + list[i]).isDirectory()) {
      // 如果文件夹名字是node_moduels 则删除
      var name = list[i];
      //   name === ".git"
      if (name === "node_moduels") {
        console.log(base + name);
        remove(base + name, (err) => {
          console.log(err);
        });
      } else {
        var path = base + name + "/";
        recursion(fs.readdirSync(path), path);
      }
    }
  }
}
recursion(list, base);

批量删除 .git 目录

var fs = require("fs");
var base = "./";
var list = fs.readdirSync(base);
var remove = require("rimraf");
function recursion(list, base) {
  for (var i = 0; i < list.length; i++) {
    if (fs.statSync(base + list[i]).isDirectory()) {
      // 如果文件夹名字是node_moduels 则删除
      var name = list[i];
      if (name === ".git") {
        remove(base + name, (err) => {
          console.log(err);
        });
      } else {
        var path = base + name + "/";
        recursion(fs.readdirSync(path), path);
      }
    }
  }
}
recursion(list, base);

posted @ 2023-09-25 16:17  三里清风18  阅读(465)  评论(0)    收藏  举报