最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解從NodeJS搭建中間層再談前后端分離

 更新時間:2018年11月13日 09:29:27   作者:mountain_tea  
這篇文章主要介紹了詳解從NodeJS搭建中間層再談前后端分離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

之前在知道創(chuàng)宇的項(xiàng)目中有用到過nodejs作中間層,當(dāng)時還不太理解其背后真正的原因;后來在和一位學(xué)長交談的過程中,也了解到螞蟻金服也在使用類似的方法,使用nodejs作為中間層去請求真實(shí)后臺的數(shù)據(jù);之后人到北京,也見到現(xiàn)在的公司也在往nodejs后端方向靠攏。隨著知識的增加,加之自己查閱資料,慢慢總結(jié)出了一些原理。

為什么要前后端分離

1、開發(fā)效率高
前端開發(fā)人員不用苦苦地配置各種后端環(huán)境,安裝各種莫名的插件,擺脫對后端開發(fā)環(huán)境的依賴,一門心思寫前端代碼就好,后端開發(fā)人員也不用時不時的跑去幫著前端配環(huán)境。

2、職責(zé)清晰,找bug方便
以前有了bug,前端推后端,后端推前端,不知道該誰去該,前后端分離,是誰的問題就該誰去處理,處理問題方便很多,后期代碼重構(gòu)方便,做到了高可維護(hù)性。

從做微信小程序引發(fā)的思考

最近出于愛好,寫了個音樂播放器的微信小程序(原本想用vue寫的,后來因?yàn)楣緲I(yè)務(wù)原因,年后可能去做微信小程序,所以就換了前端技術(shù)棧),源碼在我的GitHub上: wx-audio

思考:后端出于性能和別的原因,提供的接口所返回的數(shù)據(jù)格式也許不太適合前端直接使用,前端所需的排序功能、篩選功能,以及到了視圖層的頁面展現(xiàn),也許都需要對接口所提供的數(shù)據(jù)進(jìn)行二次處理。這些處理雖可以放在前端來進(jìn)行,但也許數(shù)據(jù)量一大便會浪費(fèi)瀏覽器性能。因而現(xiàn)今,增加node端便是一種良好的解決方案。

在我的微信小程序demo的server端代碼中,我通過http模塊對真實(shí)后臺(網(wǎng)易云音樂API)發(fā)起http請求,然后通過express模塊搭建后端服務(wù)。

發(fā)起請求:

// http.js
var formatURL = require('./formatURL.js');
var http = require('http');
const POSThttp = function(request){
 return new Promise((resolve, reject) => {
  let body = '';
  // http模塊拿到真實(shí)后臺api的數(shù)據(jù)
  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;

得到數(shù)據(jù)傳回前端:

var express = require('express');
var POSThttp = require('./POSThttp.js');
var bodyParser = require('body-parser');
// 使用body-parser解析post請求的參數(shù),如果沒有,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!')
});

這幾十行代碼也就實(shí)現(xiàn)了一個簡單的中間層的demo,并做到了在中間層格式化參數(shù),便于前端進(jìn)行使用的過程。

為什么需要中間層?

其實(shí)這個問題,我認(rèn)為跟面試??嫉念}:“為什么需要前后端分離?”是類似的,其原因可以歸納為以下幾點(diǎn):

現(xiàn)今網(wǎng)站存在問題

之前有向一位在百度有多年工作經(jīng)驗(yàn)的老前輩交談這類問題,我所提到的搜狐公司代碼冗余、前后端耦合的問題,他是這么回答并且給予我這樣的建議:

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

  • 前端代碼越來越復(fù)雜
  • 前后端依舊高度耦合
  • 無法良好的支持跨終端

前輩們提出的解決方案

參考 淘寶前后端分離解決方案

  • 前端代碼越來越復(fù)雜,我們希望盡可能地減少工作量,開始使用類似MV*的分層結(jié)構(gòu),使前端后分離成為必要。
  • 前端需要處理更多的工作,希望有權(quán)操控View,Router(如:SPA的嘗試)
  • 各種終端設(shè)備的興起,需要我們把頁面適配到更多的地方。

開始:我們所嘗試的CLIENT-SIDE MV* 框架,后端暴露數(shù)據(jù)接口、處理業(yè)務(wù)邏輯,前端接收數(shù)據(jù)、處理渲染邏輯。

關(guān)于MVC的定義:

MVC是一種設(shè)計模式,它將應(yīng)用劃分為3個部分:數(shù)據(jù)(模型)、展現(xiàn)層(視圖)和用戶交互(控制器)。換句話說,一個事件的發(fā)生是這樣的過程:
  1. 用戶和應(yīng)用產(chǎn)生交互。
  2. 控制器的事件處理器被觸發(fā)。
  3. 控制器從模型中請求數(shù)據(jù),并將其交給視圖。
  4. 視圖將數(shù)據(jù)呈現(xiàn)給用戶。

我們不用類庫或框架就可以實(shí)現(xiàn)這種MVC架構(gòu)模式。關(guān)鍵是要將MVC的每部分按照職責(zé)進(jìn)行劃分,將代碼清晰地分割為若干部分,并保持良好的解耦。這樣可以對每個部分進(jìn)行獨(dú)立開發(fā)、測試和維護(hù)。

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

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

各層職責(zé)重疊

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

性能問題

  • 渲染,取值都在客戶端進(jìn)行,有性能的問題
  • 需要等待資源到齊才能進(jìn)行,會有短暫白屏與閃動
  • 在移動設(shè)備低速網(wǎng)路的體驗(yàn)奇差無比

重用問題

  • 模版無法重用,造成維護(hù)上的麻煩與不一致
  • 邏輯無法重用,前端的校驗(yàn)后端仍須在做一次
  • 路由無法重用,前端的路由在后端未必存在

跨終端問題

  • 業(yè)務(wù)太靠前,導(dǎo)致不同端重復(fù)實(shí)現(xiàn)
  • 邏輯太靠前,造成維護(hù)上的不易

渲染都在客戶端,模版無法重用,SEO實(shí)現(xiàn) 麻煩

NodeJS作為中間層的全棧開發(fā)方案

有了NodeJS之后,前端可以更加專注于視圖層,而讓更多的數(shù)據(jù)邏輯放在Node層處理。

我們使用Node層:

  • 轉(zhuǎn)發(fā)數(shù)據(jù),串接服務(wù)
  • 路由設(shè)計,控制邏輯
  • 渲染頁面,體驗(yàn)優(yōu)化
  • 中間層帶來的性能問題,在異步ajax轉(zhuǎn)成同步渲染過程中得到平衡
  • 更多的可能

其實(shí)更為重要的是,對于前端來說,NodeJS的學(xué)習(xí)成本是相當(dāng)?shù)偷模何覀儫o需學(xué)習(xí)一門新的語言,就能做到以前開發(fā)幫我們做的事情,一切都顯得那么自然。

技術(shù)在不斷變化中,唯有跟上技術(shù)革新的浪潮,才能不被時代所淘汰,不管是人還是企業(yè)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Nodejs實(shí)現(xiàn)的一個簡單udp廣播服務(wù)器、客戶端

    Nodejs實(shí)現(xiàn)的一個簡單udp廣播服務(wù)器、客戶端

    這篇文章主要介紹了Nodejs實(shí)現(xiàn)的一個簡單udp廣播服務(wù)器、客戶端,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • yarn安裝依賴速度太慢的解決辦法

    yarn安裝依賴速度太慢的解決辦法

    本文介紹如何通過修改配置文件解決yarn安裝依賴速度太慢的問題,文中通過圖文結(jié)合講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • node使用promise替代回調(diào)函數(shù)

    node使用promise替代回調(diào)函數(shù)

    這篇文章主要介紹了node使用promise替代回調(diào)函數(shù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • node.js降低版本的方式詳解(解決sass和node.js沖突問題)

    node.js降低版本的方式詳解(解決sass和node.js沖突問題)

    這篇文章主要介紹了node.js降低版本的方式(解決sass和node.js沖突),本文是因?yàn)閟ass版本和node版本不匹配(可以找一下對應(yīng)的版本),本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-02-02
  • 淺談node的事件機(jī)制

    淺談node的事件機(jī)制

    本篇文章主要介紹了node的事件機(jī)制,本文通過實(shí)現(xiàn)一個簡易的、具有發(fā)布/訂閱模式的事件機(jī)制,以此來理清EventEmitter類的實(shí)現(xiàn)思路,有興趣的可以了解一下
    2017-10-10
  • 淺談關(guān)于axios和session的一些事

    淺談關(guān)于axios和session的一些事

    這篇文章主要給大家介紹了關(guān)于axios和session的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看詳細(xì)的介紹吧。
    2017-07-07
  • node.js中g(shù)et和post接口教程

    node.js中g(shù)et和post接口教程

    這篇文章主要介紹了node.js中g(shù)et和post接口學(xué)習(xí),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • 我的Node.js學(xué)習(xí)之路(四)--單元測試

    我的Node.js學(xué)習(xí)之路(四)--單元測試

    在專業(yè)化的軟件開發(fā)過程中,無論什么平臺語言,現(xiàn)在都需要UnitTest單元測試. Node.js有built-in的Assert。 今天讓我們來看一下Node.js的單元測試。在這兒我們使用nodeunit
    2014-07-07
  • nodejs中實(shí)現(xiàn)修改用戶路由功能

    nodejs中實(shí)現(xiàn)修改用戶路由功能

    這篇文章主要介紹了nodejs中實(shí)現(xiàn)修改用戶路由功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • pm2與Verdaccio搭建私有npm庫過程詳解

    pm2與Verdaccio搭建私有npm庫過程詳解

    這篇文章主要介紹了pm2與Verdaccio搭建私有npm庫過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論

舟曲县| 宜兴市| 溧阳市| 浏阳市| 丁青县| 股票| 绥中县| 安远县| 吉林省| 台北县| 富宁县| 临朐县| 五常市| 南郑县| 天祝| 尖扎县| 来宾市| 正镶白旗| 芜湖市| 任丘市| 万州区| 额济纳旗| 南投县| 宁陵县| 达日县| 永安市| 苗栗县| 临沭县| 科尔| 集贤县| 汶川县| 垣曲县| 横峰县| 海淀区| 章丘市| 盐源县| 华阴市| 措勤县| 东台市| 安义县| 焦作市|