为什么 2020 还要学 Node.js
前言
前些日子刷知乎看到个 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 教程
相信朴老师的《深入浅出 NodeJS》是不少同学早期学习 Node.js 的启蒙读物,个人在 2014 年左右学习 Node.js 读的也是这本书。书的质量非常的高,朴老师确实也做到了深入浅出,让我不但理解、入门了 Node.js,更是帮我打开了后端世界的大门,至今在工作中仍然大量的使用。
这本书唯一的问题就是 2013 年出版,已经 2020 年了还没有出第二版。这几年间不只是 Node.js 本身已经从书中的 v0.x 升级到了v14,JavaScript 社区也发生了翻天覆地的变化,书中介绍的很多技巧已经通过语言本身的优化解决。
还有一个不是问题的问题,朴老师在很多知识的介绍上还是非常深入的,篇幅也比较大,个人感觉对初学者还是有一些门槛,在有一定基础后去阅读反而收益更大,会劝退一些有兴趣学习的同学。
之前兼职做过一些前端培训,最开心的就是看到同学通过我的课程学到了知识,找到了工作。希望通过个人的理解,配合两个简单的实践,帮助到更多的同学喜欢上 Node.js,在 Web 开发中找到价值,不再纠结哪个是最好的语言。
教程在编写的时候 Node.js 最新版本是 v14,后面的文档中不再赘述
教程结构
教程可以分为上下两部分,前四章主要侧重 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 协议 做最开始的了解
附
因为英文水平有限,写教程过程中大量参考腾讯 Node.js 文档中文翻译,真诚的表示感谢,希望这份教程也可以帮助一些学习 Node.js 的同学
更多技术交流可以关注公众号或者添加微信好友【undefinedStyle】
为什么 2020 还要学 Node.js的更多相关文章
- 打算写一个《重学Node.js》系列,希望大家多多支持
先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...
- 一起来学node.js吧 node school简介
node.js这几年火爆的简直丧心病狂,去lagou.com查查node.js的职位,那叫一个多. 要说火爆到什么程度,竟然有一个网站专门去教大家学习node.js, Node School. 进去逛 ...
- .NET程序员也学Node.js——初识Node.js
清明在石门休了八天假,一眨眼,4月又到中旬了...看到.NET在天朝彻底沦陷而又无能为力,我开始尝试去学习一些新的东西来充实自己,我自然是打死不会去学java的,没有为什么,于是乎,最近开始学习一些前 ...
- 手把手教你学node.js 之使用 eventproxy 控制并发
使用 eventproxy 控制并发 目标 建立一个 lesson4 项目,在其中编写代码. 代码的入口是 app.js,当调用 node app.js 时,它会输出 CNode(https://cn ...
- 手把手教你学node.js之使用 superagent 与 cheerio 完成简单爬虫
使用 superagent 与 cheerio 完成简单爬虫 目标 建立一个 lesson 3 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/ 时,输出 CNo ...
- 手把手教你学node.js之学习使用外部模块
学习使用外部模块 目标 建立一个 lesson2 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/?q=alsotang 时,输出 alsotang 的 md5 ...
- 手把手教你学node.js之一个简单的express应用
一个简单的express应用 目标 建立一个 lesson1 项目,在其中编写代码.当在浏览器中访问 http://localhost:3000/ 时,输出 Hello World. 挑战 访问 ht ...
- nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客
GitHub: https://github.com/nswbmw/N-blog N-blog 使用 Express + MongoDB 搭建多人博客 开发环境 Node.js: 6.9.1 Mong ...
- 【重学Node.js 第4篇】实现一个简易爬虫&启动定时任务
实现一个简易爬虫&启动定时任务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https://gith ...
随机推荐
- BZOJ1294 洛谷P2566 状态压缩DP 围豆豆
传送门 题目描述 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值 ...
- Java编程技术之浅析Java容器技术
Java容器 集合是一种存储数据的容器,是Java开发中使用最频繁的对象类型之一. 或许提起Collection,都会第一时间意识到List和Set以及Map等相关关键词.因为这几乎是我们日常开发里接 ...
- PHP使用array_filter查找二维数组中符合字段和字段值的数据集合
1.方法: /** * 获取符合字段和字段值的数组集合 * @param array $data 待过滤数组 * @param string $field 要查找的字段 * @param $value ...
- JavaScript学习 Ⅴ
十. 一些对象 Date 对象 Date对象用来表示一个时间 创建Date对象 如果直接使用构造函数创建一个Date对象,则会封装为当前代码执行的时间 var d = new Date(); 创建一个 ...
- Scala 基础(五):Scala变量 (二) 数据类型
1 scala数据类型介绍 Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型 Scala数据类型分为两大类 AnyVal(值类型) ...
- vue 修改浏览器标题
主要思路: 1.可以从路由获取当前页面的标题,再通过document.title设值,或者在最外层的index.html页面添加<title>标签 import router from ' ...
- 使用Java带你打造一款简单的英语学习系统
[一.项目背景] 随着移动互联网的发展,英语学习系统能结构化的组织海量资料.针对用户个性需求,有的放矢地呈现给用户,从而为英语学习者提供便利,提升他们的学习效率. [二.项目目标] 1. 实现美观的界 ...
- 太实用了!自己动手写软件——GUI编程
这几天我有一个想法就是将我之前做测试写的一些协议脚本(如:ssh.FTP.SMTP.MySQL.Oracle等)综合在一起做一个密码PJ器,这么多的协议放在一起,每个协议都有自己特殊的参数,如果还是和 ...
- maven 将jar包添加本地仓库源
有如下jar包 zxing3.2.1.jar zxingcore.jar QRCode.jar 存在于本机目录 D:\Program Files\eclipse_workspace\webapp\We ...
- C++算法 链式前向星存图
这个东西恶心了我一阵子,那个什么是什么的上一个一直是背下来的,上次比赛忘了,回来有个题也要用,只能再学一遍,之前也是,不会为什么不学呢.我觉得是因为他们讲的不太容易理解,所以我自己给那些不会的人们讲一 ...