前言
前些日子刷知乎看到个 2019 年初的问题 2019年nodejs凉了吗?凉到什么程度了?才看到问题的时候吃了一惊,是不是我在的公司大量使用 Node.js 让我有了幸存者偏差,前端社区已经沧海桑田了么?读了大部分答案不禁有些感慨,写一下自己的理解
Node.js 从来不是为取代 Java 而生的
很多同学在纠结每个公司必然使用 Java、有后端,而觉得 Node.js 到了穷途末路,这样的担忧大可不必,因为 Node.js 从来不是为了取代 Java 而生的,就像 Nginx 不是为了取代 Apache 一样
从2005 年 Google 使用 Ajax 为 map 带来全新的体验开始,前端不再是后端、设计师的附属角色,随着前端创造的价值越来越大,前端进入了一个尴尬期
- 前端开发链路越来越复杂,不再是有文本编辑器就可以开发,需要大量的开发配套工具,包括专门的 IDE,但这些只能使用服务器语言开发
- 业务逻辑越来越复杂,使用的服务需要组装、转化之后才能交给客户端使用,后端同学来开发需要大量的时间和前端约定数据的视图模型、封装成业务接口
- 前端主导的内部平台甚至专门服务前端的平台,还是只能让后端写服务,前端写界面
两个原因让这种现象难以为继
- 后端理解前端的需求成本太高
- 后端解决前端的问题主观能动性不足
能力越大,责任越大,前端的问题本应该由前端来专业、高效解决,这些都是 Node.js 存在的理由——一门对前端开发者极其友好的服务器语言,在处理 Web 场景(IO 密集)有得天独厚的优势
和 Node.js 一样,前端或者所谓全栈也从来不是为了取代谁,只是为了为客户提供专业的体验
很开心看到我们公司的前端团队已经改名为体验技术团队,在 Web、Server、App 等全端解决用户体验问题
Node.js 并不难学,收益反而很大
很多同学会因为自己的公司没有使用 Node.js 而放弃学习 Node.js,这是非常可惜的,毕竟 Node.js 对于前端的上手成本实在是太低了,身为前端已经会了 Node.js 的语法,如果是计算机相关专业出身,对 Web、Server 本身有一定程度的认知,一个月时间就可以熟练使用 Node.js 编写一些命令行工具、Web 应用,辅助日常的工作
使用 Node.js 并不意味着一定要上线一个 Node.js 的 Web 应用,甚至把数据库操作都处理了,能够解决本地开发问题,线上页面的模板渲染或者数据模型转换(BFF)都是了不起的事情
前端学习 Node.js 无论对个人技能还是公司业务,投入产出比不是一般的高,在 Node.js 已经是 BAT 大厂前端必备技能的念头,最起码跳槽还能写到简历上,何乐而不为
Node.js 可以做什么
- 前端提效、工程工具:随着前端复杂性增加,现在几乎没有裸写前端代码机会了,需要本地开发套件、发布包工具,前端的问题自然是前端来解决最合理
- BFF:Back-end For Front-end,尤其是 serverless 的兴起,仅仅是后端 DO 转 VO 就有很大前端想象空间
- 客户端产品:Electron 让前端也可以写一些复杂的跨平台客户端应用,我们最熟悉的应该是 VS code
- Web 应用:这也是 Node 诞生要解决的主要问题,相对于多线程,Node.js 异步 I/O 是更理想的解决方案,现在也有了 egg、nest 等优秀的企业级 web 框架,前端可以轻松开发 web 应用
当然上面的几个事情如果前端学习 python、php 等语言也可以做,但持续学习一个并不会经常用的语言需要一定成本,一门语言的掌握除了学习基本语法,还需要关注社区的发展,Node 使用 JavaScript 对前端无疑更友好
可以通过问卷调查看看 2020 开发者在用 Node.js 做什么 2020 年 Node.js 开发者调查报告
deno 是不是更好的选择?
Node.js 作者 Ryan Dahl 在 2020 年 5 月发布了 deno 1.0 版本,引起了很多 Node.js 初学者的焦虑:Node.js 是不是要凉了,该去学 deno?
Ryan 在 JS Conf Berlin 上总结了 Node.js 的 7 个设计失误
- 没有坚持使用 Promise,这个问题现在影响其实并不大了
- 安全问题:作者直说当时要是好好想想 Node.js 安全性可以更好,没有做太多说明
- 构建问题:开始 V8 用的 GPY 构建,Node.js 就跟着用了,没想到后来 V8 换成了 GN,结果只有 Node.js 用 GPY 了
- package.json:npm 变成了中心化的模块管理仓库,package.json 里面的信息太多了
- node_modules:这个大家都懂
- 允许不带
.js
拓展名 require(‘module’) ,对模块加载器有写负担(需要分析 .js .json .node),和浏览器也不兼容 - 默认引用
index.js
有了 package.json 的 main 字段后这个设计没意义
在 JS Conf Berlin 上 Ryan 也提了一下只有一个月大的 deno 设计目标,结合上 1.0 发布后 deno 主要差异化特性有
- 最大相同点是依然基于 V8
- 安全控制增强,网络/文件的读写权限需要额外声明
- 内置 TS 编译器,支持 webassembly
- 没有 npm、node_module、package.json
- 内置了很多常见工具:bundle、fmt、test、lint 等
语法层面特性注定会被弥补,不如 top-level await,也就是不用在 async 里面使用 await,Node.js v14 已经支持了,Promise、回调等很大层面上在 Node.js 也不再是问题。至于拓展名 .js 和 index.js 可能影响的只有强迫症
deno 在安全性上的提升还是很值得称道的,内置 TS runtime 和大量常用工具失选择困难症的福音,但这也等于没了选择,百家争鸣对一个生态来说并不一定是坏事
node_modules 绝对是 Node.js 中令人遗憾的设计,但 npm、package.json 并一定不是,在 deno 中包的引用
import * as log from "https://deno.land/std/log/mod.ts";
点击代码块进入预览复制代码
包通过网络地址下载到缓存文件夹,虽说没了 node_modules 文件夹,但在一定程度上只是换了一个路径,npm 中心化部署,但很好的保证了稳定性,而且 npm 也有去中心化部署的方式,比如大家熟知的 cnpm
Deno 是对 Node.js 的升级,在很多特性上让人眼前一亮,但 Node.js 出现的时机太好了,十年间形成了自己的开发生态,deno 同样依赖 V8 意味着在性能上并没有革命性的增强,对两者有些个人看法
- deno 会和 IO.js 一样敦促 Node.js 在安全性、新特性(Web Assembly 等)等快速增强
- Node.js 已经支持了 ES module,在未来说不定会支持 TS
- deno 会吸引很多开发者使用,但很难替代 Node.js
为什么现在出 Node.js 教程
教程地址:https://www.yuque.com/sunluyong/node
相信朴老师的《深入浅出 NodeJS》是不少同学早期学习 Node.js 的启蒙读物,个人在 2014 年左右学习 Node.js 读的也是这本书。书的质量非常的高,朴老师确实也做到了深入浅出,让我不但理解、入门了 Node.js,更是帮我打开了后端世界的大门,至今在工作中仍然大量的使用。
这本书唯一的问题就是 2013 年出版,已经 2020 年了还没有出第二版。这几年间不只是 Node.js 本身已经从书中的 v0.x 升级到了v14,JavaScript 社区也发生了翻天覆地的变化,书中介绍的很多技巧已经通过语言本身的优化解决。
还有一个不是问题的问题,朴老师在很多知识的介绍上还是非常深入的,篇幅也比较大,个人感觉对初学者还是有一些门槛,在有一定基础后去阅读反而收益更大,会劝退一些有兴趣学习的同学。
之前兼职做过一些前端培训,最开心的就是看到同学通过我的课程学到了知识,找到了工作。希望通过个人的理解,配合两个简单的实践,帮助到更多的同学喜欢上 Node.js,在 Web 开发中找到价值,不再纠结哪个是最好的语言。
文档在编写的时候 Node.js 最新版本是 v14,后面的文档中不再赘述
教程结构
教程地址:https://www.yuque.com/sunluyong/node
教程可以分为上下两部分,前四章主要侧重 Node.js 基础原理 & 核心 API 使用,不看教程完全可以按照官方 API 学习,腾讯的 Node.js 中文网翻译质量也很高。但 API 介绍如同 JavaScript 犀牛书,虽说面面俱到,但没有按照学习顺序组织、而且内容量大,老手查资料很方便,新人上手按照 API 学习成本高。教程按照新人学习顺序组织了一些重要 Node.js 知识和 API 介绍,删减了使用频率低或者需要深入应用才能掌握的知识,相关内容在后面的实战章节再循序渐进、娓娓道来
从第五章开始主要侧重 Web 开发和前端工程,偏重 Node.js 在前端日常工作中的实际应用,因此每个章节都穿插了一个实战项目,让大家可以更加了解 Node.js 在前端领域的重要作用,学习后可以使用 Node.js 解决工作中遇到的实际问题
这不是一个 Node.js 全面的教程,内容深度也远远不及朴灵老师的《深入浅出 Node.js》,如果可以帮助前端新人从上手到熟练使用 Node.js 就善莫大焉
前置知识
为了控制教程篇幅,降低阅读成本,教程假定学习者了解一些 JavaScript 前置知识,教程中对使用的 ES6 语法不做讲解
- JavaScript 基础知识
- ES6 常用语法
- let、const
- 箭头函数
- Promise、async/await
- 变量解构
- 扩展运算符
- 字符串模板
教程中的示例运行需要安装 Node.js 运行环境,可以在 Node.js 官网首页下载安装,也可以进入下载页面使用更多工具安装,安装完成后无需特殊配置,安装完成后可以按照官网 Getting Started 教程两分钟体验 Node.js Hello World
在开始学习第五章 Web 应用之前最好对 HTTP 协议有一个最基础的概念,可以通过 半小时认识 HTTP 协议 做最开始的了解