node中間層

node中間層

1、總結

一、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也是一個很是好的選擇。

 

2、從NodeJS搭建中間層再談先後端分離

以前在知道創宇的項目中有用到過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,並作到了在中間層格式化參數,便於前端進行使用的過程。

爲何須要中間層?

其實這個問題,我認爲跟面試常考的題:「爲何須要先後端分離?」是相似的,其緣由能夠概括爲如下幾點:

現今網站存在問題

以前有向一位在百度有多年工做經驗的老前輩交談這類問題,我所提到的搜狐公司代碼冗餘、先後端耦合的問題,他是這麼回答而且給予我這樣的建議:

其實,提煉出來,現今大公司的老項目(包括百度、搜狐等公司所採用的後端渲染等),或多或少都會存在這樣的一些 問題 :

  • 前端代碼愈來愈複雜
  • 先後端依舊高度耦合
  • 沒法良好的支持跨終端

前輩們提出的解決方案

參考 淘寶先後端分離解決方案

  • 前端代碼愈來愈複雜,咱們但願儘量地減小工做量,開始使用相似MV*的分層結構,使前端後分離成爲必要
  • 前端須要處理更多的工做,但願有權操控View,Router(如:SPA的嘗試)
  • 各類終端設備的興起,須要咱們把頁面適配到更多的地方

開始:咱們所嘗試的CLIENT-SIDE MV* 框架,後端暴露數據接口、處理業務邏輯,前端接收數據、處理渲染邏輯。

關於MVC的定義:

MVC是一種設計模式,它將應用劃分爲3個部分:數據(模型)、展示層(視圖)和用戶交互(控制器)。換句話說,一個事件的發生是這樣的過程:
  1. 用戶和應用產生交互。
  2. 控制器的事件處理器被觸發。
  3. 控制器從模型中請求數據,並將其交給視圖。
  4. 視圖將數據呈現給用戶。
咱們不用類庫或框架就能夠實現這種MVC架構模式。關鍵是要將MVC的每部分按照職責進行劃分,將代碼清晰地分割爲若干部分,並保持良好的解耦。這樣能夠對每一個部分進行獨立開發、測試和維護。

如:Backbone, EmberJS, KnockoutJS, AngularJS等框架。

但這樣的方式仍舊存在問題:

各層職責重疊

  • Client-side Model 是 Server-side Model 的加工
  • Client-side View 跟 Server-side是 不一樣層次的東西
  • Client-side的Controller 跟 Sever-side的Controller 各搞各的
  • Client-side的Route 可是 Server-side 可能沒有

性能問題

  • 渲染,取值都在客戶端進行,有性能的問題
  • 須要等待資源到齊才能進行,會有短暫白屏與閃動
  • 在移動設備低速網路的體驗奇差無比

重用問題

  • 模版沒法重用,形成維護上的麻煩與不一致
  • 邏輯沒法重用,前端的校驗後端仍須在作一次
  • 路由沒法重用,前端的路由在後端未必存在

跨終端問題

  • 業務太靠前,致使不一樣端重複實現
  • 邏輯太靠前,形成維護上的不易

渲染都在客戶端,模版沒法重用,SEO實現 麻煩

NodeJS做爲中間層的全棧開發方案

有了NodeJS以後,前端能夠更加專一於視圖層,而讓更多的數據邏輯放在Node層處理。

咱們使用Node層:

  • 轉發數據,串接服務
  • 路由設計,控制邏輯
  • 渲染頁面,體驗優化
  • 中間層帶來的性能問題,在異步ajax轉成同步渲染過程當中獲得平衡
  • 更多的可能

其實更爲重要的是,對於前端來講,NodeJS的學習成本是至關低的:咱們無需學習一門新的語言,就能作到之前開發幫咱們作的事情,一切都顯得那麼天然。

技術在不斷變化中,惟有跟上技術革新的浪潮,才能不被時代所淘汰,無論是人仍是企業。

 

 

3、node作中間層是什麼意思,能具體詳說麼?

問題:

沒接觸過node,常常看文章說node作中間層,不知道具體指什麼意思?好比在程序中解決了什麼問題,若是說解決了渲染問題,那也是頁面端,前端框架已經解決了,難道說是後端渲染前端框架,而後整個塞到前端嗎?

 

解答:

不少項目中後端應用每每不止一個服務,而是一羣各司其職的服務,好比nginx的存在就是由於服務器上運行着多個服務,而不一樣的網絡請求由不一樣的服務處理,須要在這些服務前假設一層nginx作爲代理,將請求分發給不一樣的服務,nginx在這裏的角色就至關於中間層

對於一個比較複雜的web站點,頁面中的請求一般分爲兩種,請求頁面與請求數據(ajax)。若是後端是個單體應用,當發現全部請求量太多應付不過來的時候就能夠考慮作這樣的分離將處理頁面渲染的請求分給另外一個服務,擋在前面,本身只負責數據相關的請求nodejs擅長處理io密集型任務,很適合作處理頁面渲染的服務,因而不少人選擇了nodejs。淘寶也是相似的架構,聽說如今全部淘寶的頁面都是由node服務渲染的。

 

講道理就是用nodejs作靜態資源管理和請求轉發。
作到後端只管數據接口,前端負責路由,靜態資源。

 

加了node的中間層,可讓前端處理view層和control層,後端只負責處理model層。先後端分離比較完全,分工更明確一些吧。

另外就是有些框架在服務器不是node的時候SEO比較難作。加了node中間層後比較好作SEO

 

node就是鏈狀執行

請求接收 -> 中間件1 -> 中間件2 -> ... 中間件n ... -> 返回

中間件就是某一個處理操做

相關文章
相關標籤/搜索