圖解基于 Node.js 實現前后端分離 - CSDN博客

因為會上出了個意外,ppt圖片全部丟失,只好對著白板跟大家交流了半個多小時。由于我做演講不喜歡寫太多的文字,沒有圖片的情況下講漏了一些內容。這篇文章是我在會上分享內容對照ppt進行地整理。

基本介紹

首先從一個重要的概念“模板”說起。 廣義上來說,web中的模板就是填充數據后可以生成文件的頁面。 嚴格意義上來說,應該是模板引擎利用特定格式的文件和所提供的數據編譯生成頁面。模板大致分為前端模板(如ejs)和后端模板(如freemarker)分別在瀏覽器端和服務器端編譯。

由于當場有一部分同學對node.js并不是很了解,這里補充一下node.js的相關知識。官網上的給他的定義事件驅動、異步什么的就不說了。這里借用樸靈書上的一張圖來解釋一下node.js這個玩意的結構。如果懂java的同學可以將其理解為js版本的jvm。 瀏覽器一般包括渲染器和js腳本引擎,以chrome瀏覽器為例,用的webkit內核的渲染器,V8的腳本引擎,而node.js用到了v8引擎。總而言之它就是一個js的運行環境,就好比瀏覽器的F12調試工具,只不過node.js沒有DOM和BOM。

這張圖描述的是node.js周邊的一些信息,比如npm這個出色的包管理器和cnode社區以及github,都在一定程度上促進了node.js的繁榮,提供了技術保障。

大公司通常都是技術的風向標,例如google的angular、facebook的react現在都很火。這里只列了3個大公司當作例子。淘寶的中途島架構就不用說了,國內node.js的先行者樸靈就來自淘寶。去哪兒也出了個應該叫做“QTX”的技術框架。360月影帶領的75團隊出了個基于ES6/ES7的web服務器框架——thinkjs,當時我們技術總監很看好,但是由于鄙人沒有時間學習ES6再加上插件不夠豐富,所以還是選用了較為成熟的Express。

言歸正傳,這個表格列出了我所接觸過的3種前后端分離的開發方式。 第一種是最常見的使用java之類的后端語言模板,SEO友好,緩存利用率和減輕瀏覽器渲染負擔方面都比較好,最大的問題就是模板文件的耦合度太高,出了問題誰都不想來解決,前端人員看不到數據,后端人員不懂頁面,模板文件就像是一個燙手的山芋。 第二種是目前我們項目移動端的實現方案,利用angular這種框架(angular的指令可以看成是前端模板)和nginx這種反向代理服務器,讓前后端徹底解耦,只通過ajax交互數據。這種方案和前一種的優缺點剛好相反。前端模板的性能始終是個問題,尤其是在移動端,更尤其是在低端的移動設備上。 最后一種是新項目使用的用node.js做前端服務器,將前端的職責從瀏覽器劃分到了模板這一層,解決了以上所有的問題,不過確實也有新的問題,這種問題稍后再分析。

當然全棧開發在小型項目中也是非常適合的。對于傳統的jsp/php開發來說,全棧開發的溝通成本更低,開發人員能更容易理解整個功能模塊,從而更好的還原產品的設計。尤其現在出現的以js語言為基礎的全棧開發:meteor和MEAN技術,更是使得前后端開發用一種語言直接搞定,再配上Mongodb,數據從瀏覽器到數據庫都無需轉義直接使用,還不用寫sql,開發成本又大大降低。

這次搭建node.js服務器用到的一些插件。 鼎鼎大名的express不用多介紹了,輕量級web服務器框架。 用handlebars模板引擎也屬巧合,因為express4默認就是它,handlebars不愧為“弱邏輯”的模板引擎,主張的是減少模板邏輯,盡量只用變量和分頁,基于它的設計理念,我只擴充了兩個helper。具體文章:https://yalishizhude.github.io/2016/01/22/handlebars/superagent的使用還是因為express4,因為它的測試代碼用的是supertest,supertest是基于superagent,所以用了superagent來轉發和發起請求。superagent還是太弱了,長連接都無法建立,還是推薦request插件。 restfuleAPI就沒什么好介紹了,前端服務器與瀏覽器,前端服務器與后端服務器都是用的這一套規范,基本上就是url指向資源,增刪改查又具體的請求方法表示,狀態碼表示結果等~ gulp打包工具,webpack研究了很久,發現每增加一個頁面都要修改配置文件,這個太蛋疼,遂放棄。

開發流程

如果這次分享主要是講怎樣將node.js做為前端服務器來實現前后端分離的話那也沒什么好講的,看看淘寶UED的文章就好了。前后端分離其實最大的問題是帶來溝通成本的上升,具體來說就是接口的定義和調試。在上圖的傳統開發流程中,接口的定義會放在接口服務器中,然后前后端各自根據接口文檔造假數據進行本地調試,之后進行聯調。這個環節就是前后端開始撕逼的時候了,這個參數不對,那個返回值不對,總之很浪費時間。接下來看這個問題在我們項目中是怎么解決的~

前后端因為接口撕逼的問題一直存在,作為保守主義的我相信迭代開發,所以第一步做的只是增加了一個mock服務器。這個服務器的神奇之處就是根據接口文檔自動生成假數據,實現了接口即API,前端同學再也不用把數據寫死進行測試了。沒辦法,誰叫我是前端開發,首先想到自己人,嘿嘿~當然這個只在一定程度上有利于前端開發,后端的接口和文檔不一致聯調時也會出現問題。怎么辦?

偶然在破浪大神的博客上看到老馬的一篇專門講前后端分離的文章,其中一個重要的概念就是契約測試也叫雙邊測試吧。核心概念就是為了解決遠程聯調的問題。對前后端的參數都進行校驗,要求大家按照接口文檔進行開發。受其啟發,加入json-schema規則,實現了對http請求的參數校驗,誰不按規矩來誰改。

這個redmine是我們最早的接口文檔管理器,除了記錄和查看功能再無其他作用。

swagger號稱世界最流行的接口文檔服務器,界面美觀,插件也還比較多,可以針對后端語言直接生成測試代碼。不過部署的時候始終沒玩懂,而且yaml格式不如json習慣,放棄了它。

這就是現在我們項目上用的文檔服務器和mock服務器,基于MEAN技術實現的服務器,基本功能:

  • 利用mockjs插件,可以動態生成隨機數據
  • 基于json-schema對接口參數實行校驗和接口測試,并保存測試狀態和接口響應時間。
  • 簡單的json編輯器
  • 帶有登陸校驗功能,可登陸后進行接口調試
  • mock服務器按照api服務器來響應請求,接口更新時自動更新

一些問題

node.js是前端工程師的翅膀,而插上翅膀是變成天使還是變成惡魔?這個要看能不能解決的使用它時帶來的問題了。

  • 首先前端的工作量毫無疑問地會增加,但溝通成本會降低。
  • node.js單線程的服務器穩定性確實不夠好,不過代碼的健壯性和完善的日志可以有效的規避。
  • 回調。這個問題解決方法就太多了,node.js的q/async模塊以及ES6/ES7。
  • node.js調試。雖然我一直排斥IDE,但不得不承認webstorm在調試上確實很方便。我用的node-inspector也還湊合,界面類似chrome開發者工具,看上去挺熟悉的。

如果對于后端程序員,更加應該擁簇node.js了。接口整合的工作交給了前端服務器進行處理,同時和前端耦合度大大降低,工作量和工作效率都減少了。

心得體會有兩點

  • node.js的使用雖然有一定的學習成本,但對于前端開發人員還是很友好的。而且前端使用node.js的話,無論是技術含量還是工作量都會有所提升,從而提升了崗位的重要性。當前端開發人員能創造更多價值的時候才有資格要求更高的薪水~
  • 工作中建議少提建議多給可行性方案,同時進行技術預研而不是寫個簡單的helloworld。

總結

可能有人說你介紹的這一套東西這么復雜,用起來太麻煩了,還不如面對面溝通。?對于這樣的質疑我只能用騰訊高級UI工程師余果在《web全棧工程師的自我修養》中講到的一個例子。有一次他電面一家小公司的前端負責人問他怎么管理代碼時,對方說直接用ftp上傳,同時抱怨手下人老是更新錯代碼,又問他為什么不用svn或git,他說還不如手動更新方便。 這個故事的道理就是我面對質疑的回答~

轉自:http://web.jobbole.com/85886/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248851.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248851.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248851.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java基礎之XML

目錄 java基礎之XML1. XML解析概述2. DOM4J介紹2.1 常用包2.2 內置元素2.2 Element類2.3 Attribute類2.4 常用操作3. 代碼演示3.1 DOM4J讀取xml文件3.2 DOM4J創建xml文件3.2 DOM4J修改xml文件java基礎之XML XML是一種通用的數據交換格式,它的平臺無關性、語言無關性、系統無關性…

CF176E Archaeology(set用法提示)

題目大意: 給一棵樹,每次激活或熄滅一個點,每次問這些點都聯通起來所需的最小總邊權 分析: 若根據dfs序給所有點排序,為$v1,v2,v3....vk$,那么答案就是$(dis(v1,v2)dis(v2,v3)...dis(vk-1,vk)dis(vk,v1))/2…

網上整理的對于Rest和Restful api的理解 - 那啥快看 - 博客園

一、什么是Rest? REST不是"rest"這個單詞,而是幾個單詞縮寫 -- REpresentational State Transfer 直接翻譯:表現層狀態轉移,但這個翻譯正常人根本看不懂,找到的一種最好理解的說法是,URL定位資源&#xff…

P1101 單詞方陣(DFS)

題目描述 給一n \times nnn的字母方陣,內可能蘊含多個“yizhong”單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著 88個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間可以交叉,因此有可能共用字母。輸出時,…

企業級rancher搭建Kubernetes(采用rancher管理平臺搭建k8s)

一、簡介 Rancher簡介 來源官方:https://www.cnrancher.com/ Rancher是一個開源的企業級容器管理平臺。通過Rancher,企業再也不必自己使用一系列的開源軟件去從頭搭建容器服務平臺。Rancher提供了在生產環境中使用的管理Docker和Kubernetes的全棧化容器部…

[工具]java_sublime的快速使用

目錄 使用 : 怎么運行: 調整字體: 使用 : 新建--->寫好代碼后-->另存為尾綴是.java的文件 怎么運行: 在你另存為的目錄下cmd調用控制臺輸入dos指令--->執行javac 文件名.java(有.java尾綴)(編譯為.class文件)--->java 文件名(沒有.class尾綴設計者認為執行的是…

基于SOA的銀行系統架構

Part-1 【簡述】 1.通過引入面向服務架構(SOA),企業服務總線(ESB),適配器(Adapter)及面向構件等技術,嘗試打造一個統一業務流程服務平臺,實現面向流程的服務…

一次前后端分離的實踐

前后端分離該如何做? 這個問題,不同的技術人員,由于所處的崗位不一樣,給出的答案都不一樣。 前后端分離的問題,不僅僅是技術上的選型問題,還涉及到整個團隊在認知、職責、流程上面重新定義的問題,這也是為…

queryList爬蟲獲取內容的幾種方法總結 queryList給抓取的內容增加html追加元素html 代碼實例...

//簡略內容: 1. $data1 $ql->find(.two img)->map(function($item){return $item->alt; }); // 等價下面這句話 $data2 $ql->find(.two img)->attrs(alt);2. $texts $ql->find(.two>a)->texts(); $htmls $ql->find(#one span)->htmls();3. $…

C++解析-外傳篇(1):異常處理深度解析

0.目錄 1.異常的最終處理 2.結束函數terminate() 3.小結 1.異常的最終處理 問題: 如果在main函數中拋出異常會發生什么? 如果異常不處理,最后會傳到哪里? 下面的代碼的輸出什么? 示例——異常的最終處理?&a…

《淺談架構之路:前后端分離模式》 - 山人行 - 博客園

前言:分離模式 對前后端分離研究了一段時間,恰逢公司有一個大項目決定嘗試使用前后端分離模式進行,便參與其中。該項目從2016年初立項至今,平平穩穩得度過,但也涌現出越來越多的問題,絕對不是說前后端分離模…

springboot快速集成swagger

今天技術總監說:小明,我們本次3.0改造,使用swagger2.0作為前后端分離的接口規范,它可以一鍵生成前后端的API,一勞永逸……小明:??? Spring Boot 框架是目前非常流行的微服務框架&…

php curl處理get和post請求

CURL 是一個利用URL語法規定來傳輸文件和數據的工具,支持很多協議,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 CURL 庫。使用PHP的CURL 庫可以簡單和有效地去抓網頁。你只需要運行一個腳本,然后分析一下你所抓取的網頁&#xff0…

【Web】JavaWeb項目為什么我們要放棄jsp?為什么要前后端解耦?為什么要前后端分離?2.0版,為分布式架構打基礎。 - CSDN博客

前戲 前后端分離已成為互聯網項目開發的業界標準使用方式,通過nginxtomcat的方式(也可以中間加一個nodejs)有效的進行解耦, 并且前后端分離會為以后的大型分布式架構、彈性計算架構、微服務架構、多端化服務(多種客戶…

MongoDB升級導致啟動失敗

起因 最近項目使用MongoDB,但是作為一個技術菜鳥,NoSQL數據庫我還真不會用,于是我就在自己的阿里云服務器上安裝了一個MongoDB4.0.9。 現象 但是當我使用yum -y update升級以后,MongoDB無法啟動了,即使重裝刪除了MongDB的文件了還…

測者的測試技術手冊:揭開java method的一個秘密--巨型函數

揭開java method的一個秘密:巨型函數 相信,很多人都不知道Java的Method的上限為64K。本文將超過這個上限的函數叫做巨型函數。 巨型函數的問題 1、如果代碼超過了這個限制,Java編譯器就報"Code too large to complier"的錯誤。 2、…

前端攻略系列(二) - 前端各種面試題

幸運且光榮的被老大安排了一個任務 - “去整理些前端面試題”。年前確實不是招人的好時候,所以我們前端團隊經過了超負荷的運轉,終于堅持過了春節。春節以后就開始招人啦,這套題考察的目標就是基礎基礎再基礎,嘿嘿。 事先聲明&…

html 初識

一、web請求流程模擬 python編寫的簡易服務器應用程序 import socketserversocket.socket() ip_port (127.0.0.1,8080) server.bind(ip_port) server.listen()while 1:conn, addr server.accept()from_browser_msgconn.recv(1024)print(from_browser_msg)conn.send(bHTTP/1.1 …

Iframe的那些事

在web開發中,經常會用到iframe,難免會碰到需要在父窗口中使用iframe中的元素、或者在iframe框架中使用父窗口的元素 js 在父窗口中獲取iframe中的元素 1、 格式:window.frames["iframe的name值"].document.getElementByIdx_x(…

異常處理try...catch...throw

C 引入了異常處理機制。其基本思想是:函數 A 在執行過程中發現異常時可以不加處理,而只是“拋出一個異常”給 A 的調用者,假定為函數 B。 拋出異常而不加處理會導致函數 A 立即中止,在這種情況下,函數 B 可以選擇捕獲 …