Node.js作為中間層實現(xiàn)前后端分離

2016年3月于烏鎮(zhèn)

零勒叠、用koa2實現(xiàn)前后端分離的點贊+1的功能(歡迎clone和star)

Github:https://github.com/pengxiaohua/praise-by-koa
簡書:http://www.reibang.com/p/c3215333655a

一隘击、前后端不分離存在什么問題

之前做一個Python+django+jQuery項目時候,經(jīng)常碰到很尷尬的問題凉泄,前后端想分離,卻始終分不開蚯根,或者說是分的不徹底后众,前端代碼的開發(fā)總是要依賴Python的環(huán)境,環(huán)境崩潰了或者缺個插件颅拦,項目起不來蒂誉,前端看不到頁面效果,沒法開發(fā)距帅。
如果硬生生的把前端代碼從整個項目中拉出來右锨,單獨開發(fā),那前后端開發(fā)完碌秸,還是需要合并代碼聯(lián)調(diào)绍移,還是得合在一起解決問題,開發(fā)效率很低讥电。
前后端儼然成了牛郎織女一般蹂窖,斷了連,連了斷恩敌,強行拆開瞬测,也想偷偷幽會,捉急呀纠炮。

前后端如漆似膠.jpg

二月趟、為什么要前后端分離

1、開發(fā)效率高

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

2、職責清晰看疗,找bug方便

以前有了bug沙峻,前端推后端,后端推前端两芳,不知道該誰去該摔寨,前后端分離,是誰的問題就該誰去處理怖辆,處理問題方便很多是复,后期代碼重構(gòu)方便删顶,做到了高可維護性。

三淑廊、怎么實現(xiàn)前后端分離

  • 前端:負責View和Controller層路由的分發(fā)
  • 后端:只負責Model層逗余,業(yè)務(wù)和數(shù)據(jù)處理等

最近一段時間學習了Node.js和koa框架后,總的來說Node.js優(yōu)點還是挺多的:

  • 都是js季惩,前端熟悉的語言录粱,學習成本低
  • 事件驅(qū)動,非阻塞I/O
  • 適合IO密集型業(yè)務(wù)

現(xiàn)在決定嘗試一下用Node.js作為中間層画拾,PHP寫后端簡單的接口啥繁,Node.js封裝PHP接口,前端axois請求封裝后的接口青抛,將需要的數(shù)據(jù)返回到對應(yīng)的view層頁面旗闽,既解決了跨域問題(Node.js作為服務(wù)端,服務(wù)端沒有跨域一說)脂凶,同時又不需要配后端環(huán)境宪睹,只需要一個PHP接口〔锨眨基本邏輯如下圖所示:

Node.js作為中間層作用

對此做了一個點贊+1的Demo,邏輯不復雜鹅很,但達到了Node.js作為中間層實現(xiàn)前后端分離的目的嘶居。

Github:https://github.com/pengxiaohua/praise-by-koa

1、截圖:
點贊+1截圖
2促煮、功能介紹
  • 用PHP+MySQL完成點贊接口邮屁,實現(xiàn)用戶點擊一次更新數(shù)據(jù)庫點贊總數(shù)+1
  • 用koa2+ES6封裝PHP點贊接口,并建立路由菠齿。
  • praise項目遷移進入koa2佑吝,通過index/index路由進行訪問
  • 將用戶點擊事件通過axios連接到koa2點贊接口
  • 對用戶連續(xù)點擊事件進行稀釋(或叫節(jié)流)
  • 基本測試:完成點贊接口的自動化測試(mocha)、點贊+1功能的自動化測試(karma)绳匀、真實頁面的點擊自動化測試(selenium-webdriver)
3芋忿、項目代碼結(jié)構(gòu)

為了適配更多瀏覽器,代碼中和.es6后綴的文件同名的.js文件是babel轉(zhuǎn)碼后的es5文件疾棵,這里省掉了對應(yīng)的.js文件

├── app.es6                        <-- node啟動頁面
├── config
│   ├── config.es6                 <-- 配置端口號戈钢、文件名
├── controller
│   ├── indexController.es6        <-- 創(chuàng)建路由
│   ├── initController.es6         <-- 分發(fā)路由
├── karma.conf.js                  <-- karma配置文件
├── models
│   ├── model.es6                  <-- 后端php接口的封裝
├── public
│   ├── css
│   │   └── main.css               <-- css文件
│   └── js
│       ├── connect-api.es6        <-- axois連接koa點贊接口
│       ├── index.es6              <-- 點贊+1
│       ├── thumb.es6              <-- 實例化index.es6
├── server
│   ├── db.php
│   ├── get_count.php              <-- 獲取當前點贊數(shù)原始php接口
│   └── post_count.php             <-- 點贊+1原始php接口
├── test
│   ├── e2e.js                     <-- 端對端自動化測試
│   ├── geckodriver                <-- 端對端自動化測試Firefox啟動程序
│   ├── index.spec.js              <-- 點贊+1功能自動化測試
│   ├── server.es6                 <-- 點贊+1接口測試
└── views
    ├── index.html                 <-- 主頁面
    └── layout.html                <-- 模板

server文件夾,存放的是php接口代碼文件是尔,為了方便查看放到了項目中殉了,其實是可以任意放到其他地方,或者其他服務(wù)器上的拟枚,只需要給出后端接口地址就行薪铜。
models文件夾众弓,存放的代碼是ES6和koa對后端接口的封裝
controller文件夾,存放的代碼是對路由的處理
public文件夾隔箍,存放的代碼是css和js
views文件夾谓娃,存放的代碼是模板文件和html主頁
config文件夾,存放的是配置端口號和文件名的代碼
test文件夾鞍恢,存放的是測試代碼

4傻粘、安裝
① clone the repo
$ git clone https://github.com/pengxiaohua/news-responsive-by-react.git
$ cd news-responsive-by-react
② Install dependencies
$ npm install
5、啟動

此項目在XAMPP環(huán)境下運行的php接口和數(shù)據(jù)庫,開啟Apache服務(wù)器

localhost:8080

MySQL數(shù)據(jù)庫創(chuàng)建:

('localhost','root','','praise',3506)

數(shù)據(jù)庫名praise帮掉,接口3506弦悉,表名praise_count,2個字段‘id’和‘count’蟆炊,id默認值為1稽莉,count默認值為0
瀏覽器輸入:

http://localhost:8081/index/index
6、測試
① 點贊+1功能自動化測試(unit單元測試)
karma start
② 點贊+1接口自動化測試(service測試)
cd test
 mocha server.js
③端對端測試(UI測試)

使用的是 selenium-webdriver涩搓,安裝瀏覽器啟動程序這里選擇的是Firefox啟動程序geckodriver macos v0.18.0版本,下載解壓后和測試文件e2e.js放在一個目錄下污秆,開始測試
開啟2個終端窗口
一個開啟服務(wù):

node app.js

另一個窗口測試:

cd test
node e2e.js
7、最后

想down下代碼在本地試試的童鞋昧甘,可以進我的github下載良拼,別忘了star喲。
有問題歡迎隨時留言充边。

四庸推、總結(jié):

Node.js作為中間層實現(xiàn)前后端分離后:

前端 前端 后端
瀏覽器 服務(wù)器 服務(wù)器
HTML+CSS+JavaScript Node.js PHP(或其他后端語言)
跑在瀏覽器上的JS 跑在服務(wù)器上的JS 服務(wù)層
CSS、JS加載運行 轉(zhuǎn)發(fā)數(shù)據(jù)浇冰,串接服務(wù) 提供數(shù)據(jù)接口
DOM操作 路由設(shè)計贬媒,控制邏輯 維持數(shù)據(jù)穩(wěn)定
公用模板、路由 渲染頁面肘习,體驗優(yōu)化 封裝業(yè)務(wù)邏輯
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末际乘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漂佩,更是在濱河造成了極大的恐慌脖含,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仅仆,死亡現(xiàn)場離奇詭異器赞,居然都是意外死亡,警方通過查閱死者的電腦和手機墓拜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門港柜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事夏醉∷叮” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵畔柔,是天一觀的道長氯夷。 經(jīng)常有香客問我,道長靶擦,這世上最難降的妖魔是什么腮考? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮玄捕,結(jié)果婚禮上踩蔚,老公的妹妹穿的比我還像新娘。我一直安慰自己枚粘,他們只是感情好馅闽,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馍迄,像睡著了一般福也。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀圈,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天暴凑,我揣著相機與錄音,去河邊找鬼赘来。 笑死搬设,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撕捍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼泣洞,長吁一口氣:“原來是場噩夢啊……” “哼忧风!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起球凰,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤狮腿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呕诉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘厢,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年甩挫,在試婚紗的時候發(fā)現(xiàn)自己被綠了贴硫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖英遭,靈堂內(nèi)的尸體忽然破棺而出间护,到底是詐尸還是另有隱情,我是刑警寧澤挖诸,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布汁尺,位于F島的核電站,受9級特大地震影響多律,放射性物質(zhì)發(fā)生泄漏痴突。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一狼荞、第九天 我趴在偏房一處隱蔽的房頂上張望辽装。 院中可真熱鬧,春花似錦粘秆、人聲如沸如迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殷勘。三九已至,卻和暖如春昔搂,著一層夾襖步出監(jiān)牢的瞬間玲销,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工摘符, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贤斜,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓逛裤,卻偏偏與公主長得像瘩绒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子带族,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容