摘要:從事開發的程序員,對于前后端分離模式多半不陌生,這也是目前主流的開發模式,具體關于前后端分離的模式可以參看文章你不得不了解的前后端分離原理,在這里寫者不進行說明。原理圖如下,前后端在一個進程同一個端口中,通過熱替換更新的,而不是全量重啟。
從事 Web 開發的程序員,對于前后端分離模式多半不陌生,這也是目前主流的 Web 開發模式,具體關于前后端分離的模式可以參看文章《你不得不了解的前后端分離原理!》,在這里寫者不進行說明。
好了,讓我們進入主題 —— Node.js 前后端分離開發新思路
在進入新思路之前,我們現需要了解“老思路”是什么?(注意:后面的案例都是以全棧工程師為例,即前后端代碼在一起)
以一種具體情景為例:小牛是一名全棧工程師,喜歡前端后端全干,前端使用目前主流的 Webpack + React 全家桶(或 Vue 全家桶),后端使用 express(或 Koa),小牛在同時開發前后端過程中,開啟兩個進程(前后端各一個),同時使用 nodemon 熱重啟后臺服務,使用 Webpack Proxy 轉發實現跨域請求,然后哼哧哼哧開發。
如例子:一個前后端分離的簡單案例
Process 1 Process 2 ___________ ____________________ | | Proxy | | | | FrontEnd | <----> | Nodemon | BackEnd | | | | | (cp 1) | ------------- ----------------------
如上示意,該模式啟動需要啟動兩個進程(前端 和 Nodemon),其中 BackEnd 程序作為子進程掛載在 Nodemon 進程,而且前端和 Nodemon 進程通過 Proxy 轉發實現通信。
乍看一下這樣挺美好的,但是這種模式的缺陷也很容易暴露出來
傳統思路的缺陷BackEnd 程序復雜度提升后,啟動時間也變得不可控,每次熱啟動后臺服務時間過長;
需要同時開啟兩個進程,一定程度提高了開發成本
那么對于上述的問題,需要介紹一下我們今天的主角!
前后端分離開發新思路依舊是小牛的例子,大牛同樣使用小牛相同的前后端技術棧,但不同的是,大牛不使用 Nodemon 實現后端程序的熱重啟,而是使用類似 Webpack HMR(Hot Module Replacement) 的思路,熱更新 Node.js 中的 module,具體實現使用 hot-module-require。
原理圖如下,前后端在一個進程(同一個端口)中,通過 Fs Watcher 熱替換更新的 Module,而不是全量重啟。
Process _________________________ | | File Watcher | | Frontend | + | | | Backend | ---------------------------
其中核心的 Node.js 端 HMR 實現思路如下
Node.js 端 HMR 實現思路首先我們來看看一個程序的依賴圖關系
得到程序依賴圖
index.js 為程序入口,可以通過靜態代碼分析,得到 index.js 的直接依賴 express/index.js 和 lib/middleware.js,然后遞歸地進行,依次得到一個完整的依賴圖,算法具體實現參看 detect-dep。
監聽依賴圖中涉及到的文件
需要熱更新,那就離不開文件改動的監聽,所以進行依賴圖中文件的監聽(實際上只需要監聽本地的文件,排除 node builtin modules 和第三方模塊)
某個時候,lib/to-array.js 文件發生改動!
刪除更新模塊 A 緩存 (delete require.caches[modulePath])
以 A 為入口,更新依賴圖
發出 A 更新的信號
根據依賴圖,得到依賴 A 的模塊集合 B
向上回溯 B,再次從 0. 開始執行
其中這一步需要注意環狀依賴的處理,需要保證一條依賴路徑,不進行重復的依賴更新。
如 lib/to-array.js,存在兩條路徑:lib/to-array.js -> lib/middleware.js -> index/js 和 lib/to-array.js -> lib/express-utils.js -> lib/middleware.js -> index/js
以上算法的具體實現參看 hot-module-require,
具體的應用代碼可以參看這里
相比與傳統模式,新思路的優點十分突出。
優勢細化 Module 更新的顆粒度,避免不必要的更新開銷,大大縮減服務更新時間
只有一個進程,一定程度上縮減了進程調度,進程切換的開銷
用一個具體的場景對比舉例,如后端使用內存存儲用戶 session 數據。如使用傳統方式開發,則每一次更新后臺代碼,都會丟失內存中的用戶數據,所以每次都需要重新進行登錄;但是在新方式,只需要不修改用戶登錄模塊代碼,則不會重置用戶 session 數據,即不需重新登錄。
Backend 入口 / - - 登錄 --> Common <-- 某業務邏輯
如上簡易模塊依賴圖,A -> B 表示 A 依賴 B,所以上圖中,Backend 入口直接依賴 “登錄”和“某業務邏輯”,間接依賴“Common”;這時候我們只有在修改了“登錄”或“Common”的代碼,才會觸發登錄模塊的熱更新。
但是新方法也不是無缺陷
缺陷如代碼模塊中包含全局副作用代碼,可能會有各種奇怪問題出現
擴展使用 Node.js HMR 可以實現各種各樣的熱更新體驗,如熱更新 proxy,熱更新 mock 數據,熱更新配置文件...,非常 Cool!
相關材料靜態依賴分析
Node.js HMR 實現
Node.js HMR 在開發環境中的使用
Node.js 環狀依賴
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104977.html
摘要:異步最佳實踐避免回調地獄前端掘金本文涵蓋了處理異步操作的一些工具和技術和異步函數。 Nodejs 連接各種數據庫集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 編寫 Node.js Rest API 的 10 個最佳實踐 - 前端 - 掘金全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自...
摘要:基本邏輯如下圖所示對此做了一個點贊的,邏輯不復雜,但達到了作為中間層實現前后端分離的目的。 零、用koa2實現前后端分離的點贊+1的功能(歡迎clone和star) Github:https://github.com/pengxiaohua/praise-by-koa簡書:http://www.jianshu.com/p/c3215333655a 一、前后端不分離存在什么問題 之前做一...
摘要:我所在的美團酒店事業部去年月份成立,新的業務新的開發團隊,這一切使得我們的前后端分離推進的很徹底。日志監控平臺日志監控平臺是美團內部的一個日志收集系統,目前美團統一使用收集日志,具有接收格式日志的能力,而日志監控平臺也是以格式日志來收集。 轉自:美團技術團隊 作者:美團技術團隊 分享理由:很好的分享,可見,基于Node的前后端分離的架構是越顯流行和重要,前端攻城獅們,No...
摘要:因此今天要討論的話題就是前后端分離的開發,讓前端工程師的工作更飽滿,更具有價值如何實現前后端分離要實現前后端分離開發其實不是什么難事,前輩早就有很多經驗了,比如等。 為什么要做分離開發: 現在很多公司的web開發模式都是用jsp、php、asp等等開發,由服務端渲染,而前端工程師的工作就是完成切圖及靜態頁面的搭建,他們的精力都放在了輔助別人完成項目的工作,背鍋還不討好,責任劃分不明確。...
閱讀 1225·2021-11-25 09:43
閱讀 1979·2021-11-11 10:58
閱讀 1194·2021-11-08 13:18
閱讀 2693·2019-08-29 16:25
閱讀 3519·2019-08-29 12:51
閱讀 3317·2019-08-29 12:30
閱讀 756·2019-08-26 13:24
閱讀 3692·2019-08-26 10:38