前端每週清單半年盤點之 Node.js 篇

王下邀月熊發表於2017-08-17

前端每週清單專注前端領域內容,以對外文資料的蒐集為主,幫助開發者瞭解一週前端熱點;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源專案、巔峰人生等欄目。歡迎關注【前端之巔】微信公眾號(ID:frontshow),及時獲取前端每週清單;本文則是對於半年來發布的前端每週清單中的 Node.js 相關的教程實踐與開源專案的盤點,可以檢視這裡獲得往期清單或者其他盤點篇。

教程實踐

  • 掌握 Node.js 核心模組之檔案系統:本文介紹 Node.js 核心模組中與檔案系統、檔案流等相關的部分,同時還介紹了實際開發中常用的第三方檔案庫。本文首先介紹了基本的讀取與寫入操作,然後介紹了許可權控制、監聽等功能,最後討論了使用 graceful-fs、mock-fs、lockFile 等優秀的第三方庫來輔助開發。( parg.co/bMj )

  • 《關於Node.js存在反序列化遠端程式碼執行漏洞的安全公告》:近日,國家資訊保安漏洞共享平臺(CNVD)收錄了Node.js反序列化遠端程式碼執行漏洞(CNVD-2017-01206,對應 CVE-2017-594)。攻利用漏洞執行遠端執行作業系統指令,獲得伺服器許可權。由於目前驗證程式碼已經公開,極有可能誘發大規模網站攻擊。Node.js反序列化模組node-serialize庫中的unserialize()函式未做安全處理,該漏洞通過傳遞呼叫JavaScript IIFE函式表示式的方式實現遠端任意程式碼執行的效果。攻擊者可通過遠端攻擊獲得當前伺服器執行環境許可權,由於實際部署中node.js執行環境較多為作業系統root許可權,因此可完全控制伺服器主機。CNVD對該漏洞的綜合評級為“高危”。目前,相關利用方式已經在網際網路上公開,近期出現攻擊嘗試爆發的可能。不過根據原作者表述,實際上這個庫在 GitHub 上一共只有 20 個 star,還有幾個是漏洞文章釋出後引來的,而且下載量也是非常少。如果想要避免此類安全問題,需要解決的就是確保使用者輸入的安全。方法比如通過安全傳輸方式(內網 & 加密)傳輸序列化字串、使用如 RSA 等簽名演算法對字串進行完整化校驗。

  • 《一次一個微優化,改進Node.js應用的吞吐量》:本文是多個提高 Node.js 應用吞吐量的小優化技巧介紹,包括儘可能地使用聚合 IO 操作,以批量寫的方式來最小化系統呼叫的次數、需要將釋出的開銷考慮進內,清除應用中不同的定時器、CPU 分析器能夠給你提高一些有用資訊,但是並不能完整地反饋整個流程、謹慎使用 ECMAScript 高階語法,特別是你還未使用最新的 JavaScript 引擎或者類似於 Babel 這樣的轉換器的時候、要洞察你的依賴樹的組成並且對你使用的依賴進行適當的效能評測。當我們希望去優化某個包含了 IO 功能的應用效能時,我們需要對於應用耗費的 CPU 週期以及那些妨礙到應用並行化執行的因素瞭如指掌。本文則是分享作者在提升 Apache Cassandra 專案中的 DataStax Node.js 驅動時的一些思考與總結出的導致應用吞吐量降級的關鍵因素。

  • 《併發與並行:理解 Node.js 中 IO 底層機制》:本系列希望能幫助開發者深入瞭解開發併發應用的相關知識,而本文則是著眼於相對基礎的作業系統級別的排程、應用的 IO 這些知識。

  • 《Node.js 社群的發展之道:質量與速度並重》: Node.js 社群的核心目標之一就是在快速迭代的同時保證程式碼質量,新發布的版本務必與之前的版本保持相同的穩定性,避免造成生產環境下應用的崩潰。Node.js 社群並沒有一味的尋求妥協,而是不斷突破自己,從而在保證變更速度的同時達成較高的質量要求。文字則是 Node.js 社群對於他們釋出版本、變更流程以及自動化測試、效能測試等多方面的介紹。

  • 《為何使用 Node.js ?》:本文來自於 Node.js 的技術專家 Tomislav Capan,此文最早釋出於 2013 年,詳細介紹了 Node.js 的內部原理,並且論述了 Node.js 適用的業務場景與典型的範模式。( suo.im/3sFwvm )

  • 《你應該知道的關於 Node.js 中模組匯入的知識》:在 Node.js 開發中我們時刻都在於其模組機制打交道,而本文作者則深入淺出地介紹了 Node.js 中負責處理模組依賴的兩個核心模組:require 與 module;並且介紹了不同的匯入物件在 Node.js 中實際的遞迴處理流程以及最終在 module 中形成的後設資料描述。( parg.co/bQl )

  • 《Node.js 應用監控實踐指南》:本文介紹生產環境下 Node.js 應用監控實踐指南,包括了監控的意義、監控的物件、目前開源的監控解決方案以及一些 SaaS 解決方案等。( parg.co/bhb )

  • 《使用 Faker.js 為 Node.js 應用建立模擬資料》:在應用開發中我們往往會頭疼於如何構建大量的隨機資料,特別是那些符合某些固定模式的資料,我們可能會要用這些資料仿製 RESTful 介面、進行單元測試等等。而 Faker.js 則為我們提供了這樣的隨機資料生成器。( parg.co/bhU )

  • 《Node.js 執行時介紹》:本文是一篇不錯的 Node.js 入門介紹的文章,包括了 Node.js 中常見的概念知識、JavaScript 併發模型以及基於 Event Loop 的實現、Node.js 內建的物件,以及 Node.js 緣何取名為 Node.js 等等。( parg.co/b4I )

  • 《TypeScript 在 Slack 的實踐分享》:維護大型的跨平臺的 JavaScript 程式碼庫是一件非常具有挑戰性的工作,無論是從 Chrome 的 JavaScript 中傳遞物件給 Objective-C 或者單純的接受來自 Node.js 中的回撥結果,你都需要保證不同的程式碼對於通訊物件的期望之間的一致性。而本文即是在開發跨平臺多終端的應用中,Slack 使用 TypeScript 來約束型別,從而避免意外的型別不一致導致的崩潰的實踐經驗分享。( parg.co/bRR )

  • 《Node.js 中 Object Streams 的終極指南》:Node.js 中的流為我們提供了強大的功能,允許我們非同步地處理輸入與輸出,或者在多個獨立步驟中進行資料轉換。而本文則是首先回顧了流相關的理論,然後介紹瞭如何像 Gulp 那樣進行物件流的轉換操作。( parg.co/bfV )

  • 《在 Node.js 應用中如何使用 ESLint》:ESLint 是開源的 JavaScript Linting 工具,它能夠幫助開發者解決 JavaScript 無型別語言本身帶來的一些錯誤。ESLint 遵循元件化的設計思想,它允許開發者動態地設定使用的規則,而本文即是介紹基礎的 ESLint 環境搭建與使用方法的文章。( parg.co/bN4 )

  • 《8 小時內學習 Node.js》:Node.js 是基於 Google Chrome V8 引擎的 JavaScript 框架,其能夠用於開發類似於視訊直播、單頁應用等 IO 密集型的 Web 專案。而本文則是提供了完整的從零到一的 Node.js 學習路線圖,包含了基礎的環境構建、Console 使用、核心模組使用、基本的 Web 伺服器搭建等等內容。( parg.co/bNy )

  • 《掌握 Node.js 核心模組之檔案系統》:本文介紹 Node.js 核心模組中與檔案系統、檔案流等相關的部分,同時還介紹了實際開發中常用的第三方檔案庫。本文首先介紹了基本的讀取與寫入操作,然後介紹了許可權控制、監聽等功能,最後討論了使用 graceful-fs、mock-fs、lockFile 等優秀的第三方庫來輔助開發。( parg.co/bMj )

  • 《使用 Electrino 減少近 99% 的應用大小》:Electro 是非常不錯的利用 Web 技術開發跨平臺桌面應用的執行時,不過其缺陷在於打包的應用中往往需要攜帶 Node.js 與 Chromium 的完整框架,導致了即使是最簡單的 HelloWorld 應用也有近 115MB。而 Electrino 提供了類似於 Electron 的介面,不過使用系統自帶的 Web 執行時來替代 Chromium,從而保證最後打包出來的應用僅有原來的 0.1% 大小。Electrino 適用於那些不依賴於作業系統本身功能的應用,專案也處於開發狀態。( parg.co/bM2 )

  • 《除錯 Node.js 應用的最佳工具》:除錯,也就是尋找與修復軟體中存在問題的過程一直是 Node.js 專案構建過程中的挑戰之一,而本文則是介紹瞭如何利用那些優秀的工具來輔助進行 Node.js 程式碼除錯。本文首先介紹日誌相關內容,恰當的日誌能夠幫助開發者在生產環境中迅速定位到錯誤所在;然後本文介紹瞭如何在開發環境中直接除錯 Node.js 應用。( parg.co/bMB )

  • 《Node.js 根本沒有 float:浮點反序列化錯誤背後的故事》:在 Node.js 中,當我們把一個浮點數序列化,再反序列化,居然出錯了,這是為什麼呢?作者通過刨根問底的追查,發現 Node.js 根本沒有 float!( parg.co/bMX )

  • 《編寫安全的 Node.js 程式碼》:本文是對於 Danny Grander 演講的總結,他首先回顧瞭如何黑掉有漏洞的 Node.js 應用,同時也深度闡述了數個流行的 npm 包中存在的安全威脅;最後作者給出了修復這些漏洞以及在未來應用開發中保證 Node.js 程式碼安全性的建議。( parg.co/bVL )

  • 《需要掌握的 Node.js Streams 相關知識》:Node.js steams 一直以來都被詬病難以理解與使用,近年來也有不少的開發者建立了封裝庫以便於使用 Node.js streams;不過本文追本溯源,著重於介紹 Node.js Streams 的基本語法並且理清常見的誤解。本文首先以簡單的利用 Stream 讀取檔案的例子來介紹 Stream 的概念,然後介紹了 Node.js 中四個流以及其具體實現方式。( parg.co/bJN )

  • 《N-API:下一代編寫 Node.js 原生模組的介面》:Node.js 有著非常龐大而又生機勃勃的模組生態圈,這也是其一直保有活力與魅力的源泉。而現在的很多基於 C/C++ 編寫的原生模組直接依賴於 V8 或者 NAN 介面,導致了它們缺乏穩定性的暴走,並且需要隨著 Node.js 版本的更迭而不斷變化或者重編譯。而 N-API 則致力於解決這個問題,文字即是對於 N-API 的基本語法與當前狀態的介紹。( parg.co/bip )

  • 《Yarn 與 npm5 比較》:隨著 Node.js 8.0.0 一起釋出的 npm 5.0.0 不僅在效能上得到了極大提升,還通過引入類似於 yarn.lock 的 package-lock.json 檔案來實現所謂可確定的包管理。本文則是介紹了所謂可確定的包管理的具體含義,以及 yarn 與 npm5 各自不同的實現方式與優缺性的比較。( parg.co/bir )

  • 《JavaScript 模組現狀》:近日隨著各大瀏覽器紛紛開始支援 ESM(ECMAScript Moduls),Node.js 中也計劃引入 *.mjs 作為 ESM 的副檔名,關於 JavaScript 模組化的未來發展也在社群引發了熱切討論。本文則是首先介紹了 ESM 在瀏覽器、Webpack 等構件工具以及 Node.js 中未來的實現,然後討論了個人對於 ESM 未來發展以及對於程式開發本身的潛在影響。( parg.co/bi0 )

  • 《Node.js 8 中 util.promisify 介紹》:Node.js 8 為我們提供了新的工具函式 util.promisify(),它能夠將某個基於回撥的函式封裝為基於 Promise 的函式。本文介紹了 util.promisify() 的基本使用,首先介紹了對於檔案讀取寫入相關介面的封裝使用,然後討論瞭如何引入 async 語法,最後還介紹了自定義 promisify 函式的用法。

  • 《你應該掌握的關於 Node.js 子程式的知識》:Node.js 最初以單程式單執行緒非阻塞方式提供了強大的效能表現,不過在目前多核時代下僅使用單程式已遠遠不能承載日益增長的應用壓力。本文即介紹在 Node.js 中如何使用 spawn()、exec()、execFile()、fork() 等多程式相關模組的用法與各自的特點,依次介紹了使用 spawn 來建立實現了 EventEmit 介面的子程式、使用 exec 執行子命令、使用 fork 建立自帶通訊通道的子程式等。( parg.co/bLq )

  • 16 行程式碼構建基於 Node.js 的天氣應用:本文是一篇淺顯易懂的 Node.js 入門實踐介紹,作者利用 Node.js 抓取來自 OpenWeatherMap 的開放資料並且列印在控制檯中。本文依次介紹瞭如何註冊並且獲得 OpenWeatherMap 的 ApiKey、如何使用 npm 初始化專案、如何利用 request 抓取資料、如何優化命令列互動顯示等等。( parg.co/byY )

  • 基於 Prometheus 的 Node.js 應用效能監控:本文致力於幫助已有生產環境下 Node.js 應用的開發者,瞭解如何利用開源應用 Prometheus 搭建監測平臺;Prometheus 為我們提供了強大的資料壓縮與針對時序資料的快速查詢功能。本文首先討論了 Node.js 應用監控的設計理念與指標,然後對比了當前存在的幾種監控解決方案的優缺點。最後介紹瞭如何在專案中引入 Prometheus,並且整合 Kubernetes、Grafana 等第三方外掛;更多 Node.js 相關資料參考 https://parg.co/be0 。( parg.co/bed )

  • 擴充套件 Node.js 應用:Node.js 設計的初衷之一即是保證其可擴充套件性,本文則詳細介紹了開發者應該瞭解的可用於擴充套件 Node.js 應用的內建工具。本文首先介紹了複製、分解、分割等常用的設計思想,然後討論瞭如何利用 Node.js 內建的 Cluster 模組來保證應用的可擴充套件性與如何提供零停機重啟的特性。

  • Node.js 實戰第二版:該倉庫是 Azat Mardan 的著作 Practical Node.js 第二版參考的開源釋出地址,包含了十二個章節與相關的示範程式碼,非常值得一讀。該書依次介紹了 Node.js 環境搭建與 Express.js 初探、基於 Mocha 的單元測試、模板引擎、資料持久化與效能優化、專案除錯、部署與釋出等章節;更多 Node.js 相關資料參考 https://parg.co/be0

  • 使用 Apollo Server 快速開發基於 Node.js 的 GraphQL 服務端:Apollo Server 是由社群維護的開源 GraphQL 服務端,它支援目前主流的 Node.js HTTP 服務端框架:Express、Connect、Hapi、Koa、AWS Lambda、Restify 以及 Micro。本文首先介紹 Apollo Server 遵循著開放、簡單、高效能的原則,然後介紹了基於 Express 的基礎用法以及效能監控等內容;更多 GraphQL 相關資料參考 https://parg.co/b1e

  • swagger-decorator:swagger-decorator 是旨在一處註解多處使用的 JavaScript & Node.js 應用中實體類與方法註解庫,其能夠用於實體類生成與校驗、Sequelize ORM 實體類生成、面向 Koa 的路由註解與 Swagger 文件自動生成的場景。

  • 基於 Node.js 與 HTML5 的視訊流:本文一步一步地介紹如何構建基礎的 Node.js 介面,並且新增某個路由從而將視訊檔案傳送給前端。本文首先介紹了 Node.js 中流的基礎概念與如何獲取檔案體積、從檔案建立流並且獲取塊的大小等基本 API,然後介紹瞭如何搭建伺服器並且新增合適的路由以返回視訊流,最後介紹了前端如何利用 HTML5 的 video 標籤實現視訊播放與控制;更多 Node.js 相關資料參考 https://parg.co/be0

  • Node.js 微服務實踐:微服務架構目前正在大行其道,不過作者發現由於很多人有自己獨到的見解,微服務架構的變種與複雜度在持續增加;作者則希望通過本文使初學者快速地利用 Node.js 開發出簡單的微服務。本文首先介紹了微服務出現的背景以及微服務的五個原則:零配置、高冗餘、可容錯、自我修復、自動發現;然後介紹了使用 cote 這個微服務庫一步一步地實現 Node.js 微服務叢集,依次建立 Requester、Responder 等基礎元件以最終實現系統中的幾個相互依賴的模組。更多 Node.js 相關資料參考 https://parg.co/be0

  • Node.js 實踐教程:本教程是希望以一些有名的模組/功能為基礎, 在實現的過程中講解各項知識點,主要分為控制流、Web、儲存等幾個部分。目前完成的模組包括 async 介紹、Promise 實現、coroutine 實現、co 模組介紹、HTTP Client 實現、HTTP Server 實現等;更多 Node.js 相關資料參考 https://parg.co/be0

  • Node.js 如何解析 Form 上傳?:NPM 和 GitHub 裡的開源元件幫我們解決了很多繁瑣的工作,但是也讓我們失去了很多深入技術細節的機會。在現有元件無法滿足我們需求的時候,就需要我們來自己動手豐衣足食了。 作者前段時間遇到了一個需要手動解析 Form 表單上傳的機會,也藉此為各位解析一下 Node.js 解析 Form 上傳的實現細節。更多 Node.js 相關資料參考 https://parg.co/be0

  • 利用 Node.js 構建 API Gateway:隨著現代業務複雜度的增加,微服務的理念正在得到更多的落地實踐;作為微服務架構的重要組成部分,API Gateway 能夠為所有的後端服務提供統一的許可權校驗與客戶端協議相容的抽象層。本文首先介紹了微服務的基礎架構與 API Gateway 的概念,然後介紹了面向前端團隊的 Node.js API Gateway 組成;接下來詳細的分析了 API Gateway 的基礎功能需求:路由與版本、迭代式設計、許可權校驗、資料聚合、資料序列化與反序列化、限流與快取等等,最後討論了基於 Express 的 API Gateway 的實現。更多 Node.js 相關資料參考這裡

  • 利用 std/esm 在 Node.js 開發中使用 ES Modules:隨著主流瀏覽器逐步開始支援 ES Modules 標準,越來越多的目光投注於 Node.js 對於 ESM 的支援實現上;Node.js 擬計劃在 2020 年釋出的 9.x 版本中引入內建的 ESM 支援。而近日正式釋出的 @std/esm 為我們提供了高效能的 Node.js 中 CommonJS 與 ES Modules 模組間呼叫,其能夠作用於 Node.js 4.x 以上版本;它能夠順滑地整合到現有的 Webpack、Babel 環境中,並且支援不同模組使用不同的依賴版本。不同於目前的解決方案需要是釋出編譯之後的 CommonJS 格式的檔案,@std/esm 能夠以最小的代價的、按需轉化的、動態快取的方式來進行原始碼轉化。更多 Node.js 相關資料參考這裡

  • 你看到的 Node.js 許可權校驗指南可能都存在著錯誤:許可權校驗幾乎是每個服務端應用程式的標配,本文作者在搜尋學習 Node.js / Express.js 相關的許可權校驗教程時發現大部分都或多或少地存在著問題,因此編撰了這篇文章以提醒其他開發者。常見的誤區可能包括憑證的儲存方式、密碼的重置策略、API Tokens 的生成與校驗、限流等多個方面;更多 Node.js 相關資料參考這裡

開源專案

  • 《pkg》:pkg 能夠將 Node.js 專案打包為單個可執行檔案,其允許開發者釋出商業級應用而不用擔心原始碼洩露的風險。pkg 會自動掃描你的 node_modules,然後將需要用到的本地內容打包到可執行檔案中。( github.com/zeit/pkg )

  • doppio: doppio 是基於 TypeScript 0.5.0 版本編寫的 Java 虛擬機器(JVM),其支援 Node.js 6.0 以上版本,並且內建了 Java 8 JDK 環境;doppio 是個有趣的嘗試打破瀏覽器語言柵欄的嘗試,瀏覽其原始碼也可以學習如何編寫 Java 虛擬機器。

  • notifme-sdk:notifme-sdk 是用於簡化通知傳送流程的 Node.js 庫,它允許我們靈活地整合郵件、簡訊、推送、WebPush 等不同的渠道來傳送通知;notifme-sdk 還允許我們自由註冊服務提供商,內建的 Fallback 與輪詢機制也能進行簡單的容錯,同時 notifme-sdk 還提供了簡單的 UI 控制檯以方便我們僅介面化監控。

  • 《使用 create-graphql-server 快速搭建 GraphQL 伺服器》:本文介紹瞭如何用幾個簡單的命令快速搭建 GraphQL 伺服器,其使用 Node.js 作為應用後端、Mongodb 作為資料儲存。( parg.co/bfQ )

  • 《Caporal.js》:特性全面的可用於建立 Node.js 命令列工具的框架,包括了幫助資訊生成、自動補全等。 ( github.com/mattallty/C… )

延伸閱讀

相關文章