1. 程式人生 > >為什麼 2020 還要學 Node.js

為什麼 2020 還要學 Node.js

> 更佳閱讀體驗 https://www.yuque.com/sunluyong/node ## 前言 前些日子刷知乎看到個 2019 年初的問題 [2019年nodejs涼了嗎?涼到什麼程度了?](https://www.zhihu.com/question/313414600/answer/631267373)才看到問題的時候吃了一驚,是不是我在的公司大量使用 Node.js 讓我有了倖存者偏差,前端社群已經滄海桑田了麼?讀了大部分答案不禁有些感慨,寫一下自己的理解
### Node.js 從來不是為取代 Java 而生的 很多同學在糾結每個公司必然使用 Java、有後端,而覺得 Node.js 到了窮途末路,這樣的擔憂大可不必,因為 Node.js 從來不是為了取代 Java 而生的,就像 Nginx 不是為了取代 Apache 一樣

從2005 年 Google 使用 Ajax 為 map 帶來全新的體驗開始,前端不再是後端、設計師的附屬角色,隨著前端創造的價值越來越大,前端進入了一個尷尬期
1. 前端開發鏈路越來越複雜,不再是有文字編輯器就可以開發,需要大量的開發配套工具,包括專門的 IDE,但這些只能使用伺服器語言開發 1. 業務邏輯越來越複雜,使用的服務需要組裝、轉化之後才能交給客戶端使用,後端同學來開發需要大量的時間和前端約定資料的檢視模型、封裝成業務介面 1. 前端主導的內部平臺甚至專門服務前端的平臺,還是隻能讓後端寫服務,前端寫介面
兩個原因讓這種現象難以為繼 1. 後端理解前端的需求成本太高 1. 後端解決前端的問題主觀能動性不足
能力越大,責任越大,前端的問題本應該由前端來專業、高效解決,這些都是 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 可以做什麼 1. 前端提效、工程工具:隨著前端複雜性增加,現在幾乎沒有裸寫前端程式碼機會了,需要本地開發套件、釋出包工具,前端的問題自然是前端來解決最合理 1. BFF:Back-end For Front-end,尤其是 serverless 的興起,僅僅是後端 DO 轉 VO 就有很大前端想象空間 1. 客戶端產品:[Electron](http://www.electronjs.org/) 讓前端也可以寫一些複雜的跨平臺客戶端應用,我們最熟悉的應該是 VS code 1. Web 應用:這也是 Node 誕生要解決的主要問題,相對於多執行緒,Node.js 非同步 I/O 是更理想的解決方案,現在也有了 [egg](https://eggjs.org/)、[nest](https://nestjs.com/) 等優秀的企業級 web 框架,前端可以輕鬆開發 web 應用
當然上面的幾個事情如果前端學習 python、php 等語言也可以做,但持續學習一個並不會經常用的語言需要一定成本,一門語言的掌握除了學習基本語法,還需要關注社群的發展,Node 使用 JavaScript 對前端無疑更友好 可以通過問卷調檢視看 2020 開發者在用 Node.js 做什麼 [2020 年 Node.js 開發者調查報告](https://zhuanlan.zhihu.com/p/131377284) ## deno 是不是更好的選擇? Node.js 作者 Ryan Dahl 在 2020 年 5 月釋出了 deno 1.0 版本,引起了很多 Node.js 初學者的焦慮:_Node.js 是不是要涼了,該去學 deno?_ Ryan 在 JS Conf Berlin 上總結了 Node.js 的 7 個設計失誤 1. 沒有堅持使用 Promise,這個問題現在影響其實並不大了 1. 安全問題:作者直說當時要是好好想想 Node.js 安全性可以更好,沒有做太多說明 1. 構建問題:開始 V8 用的 GPY 構建,Node.js 就跟著用了,沒想到後來 V8 換成了 GN,結果只有 Node.js 用 GPY 了 1. package.json:npm 變成了中心化的模組管理倉庫,package.json 裡面的資訊太多了 1. node_modules:這個大家都懂 1. 允許不帶 `.js` 拓展名 require('module') ,對模組載入器有寫負擔(需要分析 .js .json .node),和瀏覽器也不相容 1. 預設引用 `index.js` 有了 package.json 的 main 欄位後這個設計沒意義
在 JS Conf Berlin 上 Ryan 也提了一下只有一個月大的 deno 設計目標,結合上 1.0 釋出後 deno 主要差異化特性有 1. 最大相同點是依然基於 V8 1. 安全控制增強,網路/檔案的讀寫許可權需要額外宣告 1. 內建 TS 編譯器,支援 webassembly 1. 沒有 npm、node_module、package.json 1. 內建了很多常見工具: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 中包的引用 ```javascript import * as log from "https://deno.land/std/log/mod.ts"; ``` 包通過網路地址下載到快取資料夾,雖說沒了 node_modules 資料夾,但在一定程度上只是換了一個路徑,npm 中心化部署,但很好的保證了穩定性,而且 npm 也有去中心化部署的方式,比如大家熟知的 [cnpm](https://github.com/cnpm/cnpm)

Deno 是對 Node.js 的升級,在很多特性上讓人眼前一亮,但 Node.js 出現的時機太好了,十年間形成了自己的開發生態,deno 同樣依賴 V8 意味著在效能上並沒有革命性的增強,對兩者有些個人看法 1. deno 會和 IO.js 一樣敦促 Node.js 在安全性、新特性(Web Assembly 等)等快速增強 1. Node.js 已經支援了 ES module,在未來說不定會支援 TS 1. deno 會吸引很多開發者使用,但很難替代 Node.js ## 為什麼現在出 Node.js 教程 > 教程地址:[https://www.yuque.com/sunluyong/node](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 開發中找到價值,不再糾結哪個是最好的語言。
> [教程](https://www.yuque.com/sunluyong/node)在編寫的時候 Node.js 最新版本是 v14,後面的文件中不再贅述 ## 教程結構 > 教程地址:[https://www.yuque.com/sunluyong/node](https://www.yuque.com/sunluyong/node) 教程可以分為上下兩部分,前四章主要側重 Node.js 基礎原理 & 核心 API 使用,不看教程完全可以按照官方 API 學習,騰訊的 [Node.js 中文網](http://nodejs.cn/)翻譯質量也很高。但 API 介紹如同 JavaScript 犀牛書,雖說面面俱到,但沒有按照學習順序組織、而且內容量大,老手查資料很方便,新人上手按照 API 學習成本高。教程按照新人學習順序組織了一些重要 Node.js 知識和 API 介紹,刪減了使用頻率低或者需要深入應用才能掌握的知識,相關內容在後面的實戰章節再循序漸進、娓娓道來 從第五章開始主要側重 Web 開發和前端工程,偏重 Node.js 在前端日常工作中的實際應用,因此每個章節都穿插了一個實戰專案,讓大家可以更加了解 Node.js 在前端領域的重要作用,學習後可以使用 Node.js 解決工作中遇到的實際問題

這不是一個 Node.js 全面的教程,內容深度也遠遠不及樸靈老師的《深入淺出 Node.js》,如果可以幫助前端新人從上手到熟練使用 Node.js 就善莫大焉 ## 前置知識 為了控制教程篇幅,降低閱讀成本,教程假定學習者瞭解一些 JavaScript 前置知識,教程中對使用的 ES6 語法不做講解 1. [JavaScript 基礎知識](https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics) 1. [ES6 常用語法](http://es6.ruanyifeng.com/) 1. let、const 1. 箭頭函式 1. Promise、async/await 1. 變數解構 1. 擴充套件運算子 1. 字串模板 教程中的示例執行需要安裝 Node.js 執行環境,可以在 [Node.js 官網首頁](https://nodejs.org/en/)下載安裝,也可以進入[下載頁面](https://nodejs.org/en/download/)使用更多工具安裝,安裝完成後無需特殊配置,安裝完成後可以按照官網 [Getting Started](https://nodejs.org/zh-cn/docs/guides/getting-started-guide/) 教程兩分鐘體驗 Node.js Hello World 在開始學習第五章 Web 應用之前最好對 HTTP 協議有一個最基礎的概念,可以通過 [半小時認識 HTTP 協議](https://www.yuque.com/sunluyong/fe/dcngvy) 做最開始的瞭解 ## 附 1. [Node.js 發展史](https://cloud.tencent.com/developer/article/1456827) 1. [Design Mistakes in Node.pdf](https://www.yuque.com/attachments/yuque/0/2020/pdf/87727/1590826354074-134a41e2-8bff-4783-af2a-ec67281f53cb.pdf?_lake_card=%7B%22uid%22%3A%221590826353945-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fpdf%2F87727%2F1590826354074-134a41e2-8bff-4783-af2a-ec67281f53cb.pdf%22%2C%22name%22%3A%22Design+Mistakes+in+Node.pdf%22%2C%22size%22%3A193615%2C%22type%22%3A%22application%2Fpdf%22%2C%22ext%22%3A%22pdf%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22veGoV%22%2C%22card%22%3A%22file%22%7D) > 因為英文水平有限,寫教程過程中大量參考騰訊 [Node.js 文件中文翻譯](http://nodejs.cn/api/),真誠的表示感謝,希望這份教程也可以幫助一些學習 Node.js 的同學 更多技術交流可以關注公眾號或者新增微信好友【undefinedStyle】 ![](https://img2020.cnblogs.com/blog/349217/202008/349217-20200801111726639-17204169