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 做中间层,不会替代后端的,后台同学请放心。
参考链接:
- Vue 服务端渲染的概念
- https://blog.csdn.net/u012036171/article/details/88833200
- https://juejin.im/post/5c068fd8f265da61524d2abc
- 方应杭
历史回顾:
(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文档(英文): https://nodejs.org/docs/latest-v8.x/api/index.html
- Node.js 的API文档(中文):http://nodejs.cn/api/
关于 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

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);

浙公网安备 33010602011771号