為什麼 2020 還要學 Node.js

謙行 發表於 2020-08-01

更佳閱讀體驗 https://www.yuque.com/sunluyong/node

前言

前些日子刷知乎看到個 2019 年初的問題 2019年nodejs涼了嗎?涼到什麼程度了?才看到問題的時候吃了一驚,是不是我在的公司大量使用 Node.js 讓我有了倖存者偏差,前端社群已經滄海桑田了麼?讀了大部分答案不禁有些感慨,寫一下自己的理解

Node.js 從來不是為取代 Java 而生的

很多同學在糾結每個公司必然使用 Java、有後端,而覺得 Node.js 到了窮途末路,這樣的擔憂大可不必,因為 Node.js 從來不是為了取代 Java 而生的,就像 Nginx 不是為了取代 Apache 一樣


從2005 年 Google 使用 Ajax 為 map 帶來全新的體驗開始,前端不再是後端、設計師的附屬角色,隨著前端創造的價值越來越大,前端進入了一個尷尬期

  1. 前端開發鏈路越來越複雜,不再是有文字編輯器就可以開發,需要大量的開發配套工具,包括專門的 IDE,但這些只能使用伺服器語言開發
  2. 業務邏輯越來越複雜,使用的服務需要組裝、轉化之後才能交給客戶端使用,後端同學來開發需要大量的時間和前端約定資料的檢視模型、封裝成業務介面
  3. 前端主導的內部平臺甚至專門服務前端的平臺,還是隻能讓後端寫服務,前端寫介面


兩個原因讓這種現象難以為繼

  1. 後端理解前端的需求成本太高
  2. 後端解決前端的問題主觀能動性不足


能力越大,責任越大,前端的問題本應該由前端來專業、高效解決,這些都是 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. 前端提效、工程工具:隨著前端複雜性增加,現在幾乎沒有裸寫前端程式碼機會了,需要本地開發套件、釋出包工具,前端的問題自然是前端來解決最合理
  2. BFF:Back-end For Front-end,尤其是 serverless 的興起,僅僅是後端 DO 轉 VO 就有很大前端想象空間
  3. 客戶端產品:Electron 讓前端也可以寫一些複雜的跨平臺客戶端應用,我們最熟悉的應該是 VS code
  4. Web 應用:這也是 Node 誕生要解決的主要問題,相對於多執行緒,Node.js 非同步 I/O 是更理想的解決方案,現在也有了 eggnest 等優秀的企業級 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 個設計失誤

  1. 沒有堅持使用 Promise,這個問題現在影響其實並不大了
  2. 安全問題:作者直說當時要是好好想想 Node.js 安全性可以更好,沒有做太多說明
  3. 構建問題:開始 V8 用的 GPY 構建,Node.js 就跟著用了,沒想到後來 V8 換成了 GN,結果只有 Node.js 用 GPY 了
  4. package.json:npm 變成了中心化的模組管理倉庫,package.json 裡面的資訊太多了
  5. node_modules:這個大家都懂
  6. 允許不帶 .js 擴充名 require('module') ,對模組載入器有寫負擔(需要分析 .js .json .node),和瀏覽器也不相容
  7. 預設引用 index.js 有了 package.json 的 main 欄位後這個設計沒意義


在 JS Conf Berlin 上 Ryan 也提了一下只有一個月大的 deno 設計目標,結合上 1.0 釋出後 deno 主要差異化特性有

  1. 最大相同點是依然基於 V8
  2. 安全控制增強,網路/檔案的讀寫許可權需要額外宣告
  3. 內建 TS 編譯器,支援 webassembly
  4. 沒有 npm、node_module、package.json
  5. 內建了很多常見工具: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 意味著在效能上並沒有革命性的增強,對兩者有些個人看法

  1. deno 會和 IO.js 一樣敦促 Node.js 在安全性、新特性(Web Assembly 等)等快速增強
  2. Node.js 已經支援了 ES module,在未來說不定會支援 TS
  3. 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 語法不做講解

  1. JavaScript 基礎知識
  2. ES6 常用語法
    1. let、const
    2. 箭頭函式
    3. Promise、async/await
    4. 變數解構
    5. 擴充套件運算子
    6. 字串模板

教程中的示例執行需要安裝 Node.js 執行環境,可以在 Node.js 官網首頁下載安裝,也可以進入下載頁面使用更多工具安裝,安裝完成後無需特殊配置,安裝完成後可以按照官網 Getting Started 教程兩分鐘體驗 Node.js Hello World

在開始學習第五章 Web 應用之前最好對 HTTP 協議有一個最基礎的概念,可以通過 半小時認識 HTTP 協議 做最開始的瞭解

  1. Node.js 發展史
  2. Design Mistakes in Node.pdf

因為英文水平有限,寫教程過程中大量參考騰訊 Node.js 文件中文翻譯,真誠的表示感謝,希望這份教程也可以幫助一些學習 Node.js 的同學

更多技術交流可以關注公眾號或者新增微信好友【undefinedStyle】

為什麼 2020 還要學 Node.js