这里主要介绍下 Node.js 能做什么,尝试提高大家对 Node.js 的兴趣。
一、初入山门
基于事件驱动的、单线程的异步 I/O 架构
平常我们说 node、Node.js,其实两者的区别不大,我个人理解为:
- node 是 JavaScript 的一个运行时环境(runtime)
- Node.js 是可以在服务端执行 JavaScript 的代码平台
运行时环境是指一个服务想要运行必须依赖的服务,类似运行 Java 需要安装 JDK,JDK 内就包含了 Java 的运行时环境。JavaScript 是网页的脚本语言,依赖浏览器的 JavaScript 引擎,基于 node 可以让 JavaScript 脱离浏览器的限制,运行在服务端,这是因为 node 集成了 Google 的 V8 引擎对 JavaScript 进行解释。
Node.js 的出现,让我们应该将 JavaScript 和 PHP、Python、Java 等其他编程语言同等对待,不应该将 Node.js 视为小工具。
1.1、Node.js 的特点
为什么说 Node.js 天生异步呢?因为 Node.js 的设计思路就是如此。
Node.js 的异步 I/O 能力是依赖 Libuv 实现的。例如:同时写入一百张图片,Node.js 可以借助 Libuv 同时写入,而不用一张一张写入。
Libuv 官网:libuv.org/
V8 引擎让 Node.js 运行高效。
1.2、为什么是 Node.js
- 写应用比较快,可以快速实现自己的灵感,锻炼设计的能力,平常写一些小工具很不错。
- 前端都会 JavaScript。
二、十八般武艺
1、Web 服务
作为前端程序员,在多次吐槽后端数据结构不合理之后,可能就会身临其境的把自己代入后端的角色,自己给接口时,数据会如何如何设计。现在好了,前端借助 Node.js 可以绕过后端实现自给自足。
常见的框架有:Express、Koa2、Egg、Midway 等,持久化一般使用 MySQL、MongoDB、Redis、GraphQL 等。
举例:哆啦A梦、基于 JSON 文件的 API(节假日接口)
2、Web聊天室(IM)
基于 Socket.io 实现,可以实现实时通讯
3、爬虫
基于 Cheerio、request 实现,可以解析目标网页的 DOM 结构
举例:哆啦A梦文章订阅、UED Landing 页专栏部分、豆瓣电影 Top250
4、本地代理
基于 http-proxy 实现,监听本地端口后转发,可同时监听多个本地端口
举例:本地代理
5、博客
基于 Hexo 实现,建议一个静态的个人博客网站
举例:liuxianyu.cn
6、Web 论坛
基于 node-club 实现,使用了 Node.js 和 MongoDB,页面简洁,功能丰富
举例:cnodejs.org/
7、Web 幻灯片
基于 Cleaver 实现,可以将 markdown 文件生成演示文稿
8、SSR
服务端渲染
举例:袋鼠云官网、UED Landing 页
9、基础工具
开发各类 npm 包
举例:ko、常见的前端框架脚手架
10、I/O 密集型应用
开发 I/O 密集型的服务,流服务器等
举例:网盘相册缩略图处理、文件格式转换
11、BFF
Backend For Frontend,服务前端的后端
举例:前端从三个地方获取数据,这时就可以基于 BFF 设计,在逻辑上进行分层,统一获取数据后返回给前端,也可以称之为数据整合
12、Serverless、Microservices
无服务架构;微服务,小型服务,独立进程,编程语言不限。借助于 Node.js 的轻量,可以快速实现
13、人工智能
人脸识别,加上圣诞帽
14、与硬件交互
通过 websocket 和 serialport 实现对硬件的控制
15、桌面端应用
举例:Electron、VScode
16、客户端 APP
使用 node-webkit 将 Web 页面打包成 APP
17、操作系统
node-os
举例:node-os.com/
18、你的想象力
三、行走江湖
1、了解服务端的伙伴
学习了 Node.js 后,你会了解到后端伙伴的输入输出是什么。在日常一些场景中,你会发现自己做过或思考过,那和后端的伙伴合作会有一定的效率提升。无法要求后端更了解前端,那只能更靠近后端。
比如在技术方案讨论时,哪些事情由后端来做更合适,而不是听之任之,不合理的地方可以及时提出,保证项目顺利推进。在 battle 时,了解服务端和不了解服务端,将是两种不同的状态和结果。
在这里 Node.js 不是必要条件,需要真正学习的是后端的一些思维。
2、承担更多工作
前端只能写页面吗,后端只能写接口吗?当然不是这样。
前端部门的所有接口不可能都等待后端提供,其他团队的页面也不可能都等前端来实现,一些工具性、或业务复杂度不高的,应该在部门内闭环,这样会解耦部门间非业务必要的关联,也就提高了工作效率。