一、node中間層做用:前端也是mvc,NodeJS以後,前端能夠更加專一於視圖層,而讓更多的數據邏輯放在Node層處理 javascript
二、node中間層做用:當發現全部請求量太多應付不過來的時候就能夠考慮作這樣的分離,將處理頁面渲染的請求分給另外一個服務,擋在前面,本身只負責數據相關的請求。nodejs擅長處理io密集型任務,很適合作處理頁面渲染的服務html
三、node中間層做用:功能分離,減輕板塊負擔 前端
四、善用學習網站(不僅善用搜索引擎):去菜鳥教程或者別的裏面首頁能夠了解例如node.js的做用vue
五、node.js:部署在服務器上的js,能夠部署一些高性能服務。java
簡單的說 Node.js 就是運行在服務端的 JavaScript。node
Node.js 是一個基於Chrome JavaScript 運行時創建的一個平臺。nginx
Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎,V8引擎執行Javascript的速度很是快,性能很是好。git
若是你是一個前端程序員,你不懂得像PHP、Python或Ruby等動態編程語言,而後你想建立本身的服務,那麼Node.js是一個很是好的選擇。程序員
Node.js 是運行在服務端的 JavaScript,若是你熟悉Javascript,那麼你將會很容易的學會Node.js。github
固然,若是你是後端程序員,想部署一些高性能的服務,那麼學習Node.js也是一個很是好的選擇。
以前在知道創宇的項目中有用到過nodejs做中間層,當時還不太理解其背後真正的緣由;後來在和一位學長交談的過程當中,也瞭解到螞蟻金服也在使用相似的方法,使用nodejs做爲中間層去請求真實後臺的數據;以後人到北京,也見到如今的公司也在往nodejs後端方向靠攏。隨着知識的增長,加之本身查閱資料,慢慢總結出了一些原理。
最近出於愛好,寫了個音樂播放器的微信小程序(本來想用vue寫的,後來由於公司業務緣由,年後可能去作微信小程序,因此就換了前端技術棧),源碼在個人GitHub上: wx-audio 。
思考:後端出於性能和別的緣由,提供的接口所返回的數據格式也許不太適合前端直接使用,前端所需的排序功能、篩選功能,以及到了視圖層的頁面展示,也許都須要對接口所提供的數據進行二次處理。這些處理雖能夠放在前端來進行,但也許數據量一大便會浪費瀏覽器性能。於是現今,增長node端即是一種良好的解決方案。
在個人微信小程序demo的server端代碼中,我經過http模塊對真實後臺(網易雲音樂API)發起http請求,而後經過express模塊搭建後端服務。
發起請求:
// http.js
var formatURL = require('./formatURL.js'); var http = require('http'); const POSThttp = function(request){ return new Promise((resolve, reject) => { let body = ''; // http模塊拿到真實後臺api的數據 http.get(formatURL(request.body.musicname), function(res){ res.on('data', (data) => { body += data; }).on('end', () => { // 格式化 const { name, audio: musicUrl, page, album: { name: musicName, picUrl, }, artists: [{ name: singer, }], } = JSON.parse(body).result.songs[0]; const reply = { name, picUrl, musicUrl, page, singer, }; resolve(reply); }); }); }); }; module.exports = POSThttp;
獲得數據傳回前端:
var express = require('express'); var POSThttp = require('./POSThttp.js'); var bodyParser = require('body-parser'); // 使用body-parser解析post請求的參數,若是沒有,req.body爲undefined。 var app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.post('/', (req, res) => { POSThttp(req).then((data) => { res.send(data); }).catch((err) => { res.send(err); }); }); app.listen(3000, () => { console.log('open wx-audio server successful!') });
這幾十行代碼也就實現了一個簡單的中間層的demo,並作到了在中間層格式化參數,便於前端進行使用的過程。
其實這個問題,我認爲跟面試常考的題:「爲何須要先後端分離?」是相似的,其緣由能夠概括爲如下幾點:
以前有向一位在百度有多年工做經驗的老前輩交談這類問題,我所提到的搜狐公司代碼冗餘、先後端耦合的問題,他是這麼回答而且給予我這樣的建議:
其實,提煉出來,現今大公司的老項目(包括百度、搜狐等公司所採用的後端渲染等),或多或少都會存在這樣的一些 問題 :
參考 淘寶先後端分離解決方案
開始:咱們所嘗試的CLIENT-SIDE MV* 框架,後端暴露數據接口、處理業務邏輯,前端接收數據、處理渲染邏輯。
關於MVC的定義:
MVC是一種設計模式,它將應用劃分爲3個部分:數據(模型)、展示層(視圖)和用戶交互(控制器)。換句話說,一個事件的發生是這樣的過程:
1. 用戶和應用產生交互。
2. 控制器的事件處理器被觸發。
3. 控制器從模型中請求數據,並將其交給視圖。
4. 視圖將數據呈現給用戶。
咱們不用類庫或框架就能夠實現這種MVC架構模式。關鍵是要將MVC的每部分按照職責進行劃分,將代碼清晰地分割爲若干部分,並保持良好的解耦。這樣能夠對每一個部分進行獨立開發、測試和維護。
如:Backbone, EmberJS, KnockoutJS, AngularJS等框架。
但這樣的方式仍舊存在問題:
有了NodeJS以後,前端能夠更加專一於視圖層,而讓更多的數據邏輯放在Node層處理。
咱們使用Node層:
其實更爲重要的是,對於前端來講,NodeJS的學習成本是至關低的:咱們無需學習一門新的語言,就能作到之前開發幫咱們作的事情,一切都顯得那麼天然。
技術在不斷變化中,惟有跟上技術革新的浪潮,才能不被時代所淘汰,無論是人仍是企業。
問題:
沒接觸過node,常常看文章說node作中間層,不知道具體指什麼意思?好比在程序中解決了什麼問題,若是說解決了渲染問題,那也是頁面端,前端框架已經解決了,難道說是後端渲染前端框架,而後整個塞到前端嗎?
解答:
不少項目中後端應用每每不止一個服務,而是一羣各司其職的服務,好比nginx的存在就是由於服務器上運行着多個服務,而不一樣的網絡請求由不一樣的服務處理,須要在這些服務前假設一層nginx作爲代理,將請求分發給不一樣的服務,nginx在這裏的角色就至關於中間層。
對於一個比較複雜的web站點,頁面中的請求一般分爲兩種,請求頁面與請求數據(ajax)。若是後端是個單體應用,當發現全部請求量太多應付不過來的時候就能夠考慮作這樣的分離,將處理頁面渲染的請求分給另外一個服務,擋在前面,本身只負責數據相關的請求。nodejs擅長處理io密集型任務,很適合作處理頁面渲染的服務,因而不少人選擇了nodejs。淘寶也是相似的架構,聽說如今全部淘寶的頁面都是由node服務渲染的。
講道理就是用nodejs作靜態資源管理和請求轉發。
作到後端只管數據接口,前端負責路由,靜態資源。
加了node的中間層,可讓前端處理view層和control層,後端只負責處理model層。先後端分離比較完全,分工更明確一些吧。
另外就是有些框架在服務器不是node的時候SEO比較難作。加了node中間層後比較好作SEO
node就是鏈狀執行
請求接收 -> 中間件1 -> 中間件2 -> ... 中間件n ... -> 返回
中間件就是某一個處理操做