我們?yōu)槭裁匆獓L試前后端分離
這不是一篇純技術(shù)文章,而是一篇分享我個人在前后端分離路上收獲的點點滴滴的文章,以此來為準(zhǔn)備嘗試前后端分離或者想了解前后端分離的童鞋做一個大體的講解。
嘗試與改變
如果你沒有嘗試過前后端分離的工作流程,那么可以先試想一下這樣的流程改變:
把流程從
PM:“我要這個功能”
后端:“這個先找前端做個模板”
前端:“模板做完了”
后端:“我來對接一下,這里樣式不對”
前端:“我改完了”
后端:“功能交付”
PM:“春節(jié)要加這個活動”
后端:“這個先找前端改個模板”
前端:“模板做完了”
后端:“我來對接一下,這里樣式不對”
前端:“我改完了”
后端:“功能交付”
變成
PM:“我要這個功能”
前端:“我要接口”
后端:“接口完成了”
前端:“我來對接一下,功能交付”
PM:“春節(jié)要加這個活動”
前端:“需要增加接口”
后端:“接口完成了”
前端:“我來對接一下,功能交付”
由此可見,前后端分離的主要概念就是:后臺只需提供API接口,前端調(diào)用AJAX實現(xiàn)數(shù)據(jù)呈現(xiàn)。
現(xiàn)狀與分歧
作為一名前端開發(fā)人員,我們應(yīng)該嘗試一些新穎的技術(shù),完善每一個細節(jié)性的問題,不斷突破自我。雖然前后端分離已經(jīng)算不上什么新穎的技術(shù)或思路,但是目前很多后臺開發(fā)人員甚至前端開發(fā)人員都沒有接觸過。
據(jù)我個人的了解,如果在一個部門里,部門人員全是后臺開發(fā)人員,前端的一些頁面也是由后臺人員完成的,那么前后端分離對于他們而言可能是一片未知的領(lǐng)域,項目大多是前后端強耦合的,甚至不存在前端的概念。
在不重視前端的公司或部門,不了解前后端分離這也無可厚非。在我剛進入一個全是后臺開發(fā)人員的部門的時候,整個部門就我一個前端,我剛開始的主要職責(zé)就是負(fù)責(zé)項目前端頁面的制作和JS功能的實現(xiàn),雖然部門有前后端分離的意識,但都不知該如何去實踐。在那時,部門的后臺人員認(rèn)為前后端分離就是后臺不再需要寫HTML和JS了,可以交給前端來做了,然而這只能叫做前后端分工。
以上講述的是一種情況: 不了解前后端分離,也不知如何去實踐的。下面還有一種情況:了解前后端分離,但不想去嘗試的。
針對第二種情況,很多人也做過相應(yīng)的解釋,其實這就涉及到“前后端分離的利弊”問題。很多后臺人員會認(rèn)為自己所做的那一套沒有問題,即便后臺套用前端html也是司空見慣,一直是大勢所趨,后臺MVC框架也是這么推薦使用的,很合理。這時候前端開發(fā)人員在部門中的話語權(quán)往往是不夠的,或者認(rèn)為后臺開發(fā)人員的意見永遠是對的,沒有主觀性。
相反,也有可能是后臺開發(fā)人員非常推薦前后端分離,而前端開發(fā)人員不想去實踐的。這時候前端會認(rèn)為后臺開發(fā)人員在瞎折騰,之前前后端不分離項目做起來都很順利,分離了反而會給自己帶來額外的工作量和學(xué)習(xí)成本,而這就取決于前端的技術(shù)能力和見識了。
當(dāng)然,這也是我個人認(rèn)為的前后端分離所存在的一些現(xiàn)狀和分歧所在。
場景與要求
對于前后端分離的應(yīng)用場景,不是所有的場景都適合,但是大多數(shù)項目都能夠通過前后端分離來實現(xiàn)。
由于我主要從事企業(yè)級后臺應(yīng)用的前端開發(fā)工作,個人認(rèn)為對于后臺應(yīng)用的開發(fā)來說,前后端分離帶來的利是遠大于弊的。
大多數(shù)后臺應(yīng)用我們都可以做成SPA應(yīng)用(單頁應(yīng)用),而單頁應(yīng)用最主要的特點就是局部刷新,這通過前端控制路由調(diào)用AJAX,后臺提供接口便可以實現(xiàn),而且這樣的方式用戶體驗更加友好,網(wǎng)頁加載更加快速,開發(fā)和維護成本也降低了不少,效率明顯提升。
同樣的,在展示類網(wǎng)站和移動APP頁面中前后端分離也同樣試用。前后端不分離的情況下,服務(wù)端要單獨針對Web端做處理,返回完整HTML,這樣勢必增加服務(wù)端的復(fù)雜度,可維護性差,而web端需要加載完整的HTML,一定程度上影響網(wǎng)頁性能,這對于移動端性能為王的地方非常的不友好。
隨著前端技術(shù)的發(fā)展和迭代,前端MVC框架應(yīng)運而生,利用目前主流的前端框架,如React、Vue、Angular等我們可以輕松的構(gòu)建起一個無需服務(wù)器端渲染就可以展示的網(wǎng)站,同時這類框架都提供了前端路由功能,后臺可以不再控制路由的跳轉(zhuǎn),將原本屬于前端的業(yè)務(wù)邏輯全部丟給前端,這樣前后端分離可以說是最為徹底。下面是一段前端控制路由的代碼:
- 'use strict'
- export default function (router) {
- router.map({
- '/': {
- component: function (resolve) {
- require(['./PC.vue'], resolve)
- }
- },
- '/m/:params': {
- component: function (resolve) {
- require(['./Mobile.vue'], resolve)
- }
- },
- '/p': {
- component: function (resolve) {
- require(['./PC.vue'], resolve)
- },
- subRoutes: {
- '/process/:username': {
- component: function (resolve) {
- require(['./components/Process.vue'], resolve)
- }
- }
- }
- }
- })
- }
前后端分離的實現(xiàn)對技術(shù)人員尤其是前端人員的要求會上升一個層次,前端的工作不只是切頁面寫模板或是處理一些簡單的js邏輯,前端需要處理服務(wù)器返回的各種數(shù)據(jù)格式,還需要掌握一系列的數(shù)據(jù)處理邏輯、MVC思想和各種主流框架。
優(yōu)勢與意義
對于前后端分離的意義我們也可以看做是前端渲染的意義,我主要總結(jié)了下面四點:
1. 徹底解放前端
前端不再需要向后臺提供模板或是后臺在前端html中嵌入后臺代碼,如:
- <!--服務(wù)器端渲染 -->
- <select>
- <option value=''>--請選擇所屬業(yè)務(wù)--</option>
- {% for p in p_list %}
- <option value="{{ p }}">{{ p }}</option>
- {% endfor %}
- </select>
這是前后端耦合的,可讀性差。
- <!--前端渲染 -->
- <template>
- <select id="rander">
- <option value=''>--請選擇所屬業(yè)務(wù)--</option>
- <option v-for="list in lists" :value="list" v-text="list"></option>
- </select>
- </template>
- <script>
- export default {
- data: {
- return {
- lists: ['選項一', '選項二', '選項三', '選項四']
- }
- },
- ready: function () {
- this.$http({
- url: '/demo/',
- method: 'POST',
- })
- .then(function (response) {
- this.lists = response.data.lists // 獲取服務(wù)器端數(shù)據(jù)并渲染
- })
- }
- }
- </script>
上面是前端渲染的一段代碼,前端通過AJAX調(diào)用后臺接口,數(shù)據(jù)邏輯放在前端,由前端維護。
2. 提高工作效率,分工更加明確
前后端分離的工作流程可以使前端只關(guān)注前端的事,后臺只關(guān)心后臺的活,兩者開發(fā)可以同時進行,在后臺還沒有時間提供接口的時候,前端可以先將數(shù)據(jù)寫死或者調(diào)用本地的json文件即可,頁面的增加和路由的修改也不必再去麻煩后臺,開發(fā)更加靈活。
3. 局部性能提升
通過前端路由的配置,我們可以實現(xiàn)頁面的按需加載,無需一開始加載首頁便加載網(wǎng)站的所有的資源,服務(wù)器也不再需要解析前端頁面,在頁面交互及用戶體驗上有所提升。
4. 降低維護成本
通過目前主流的前端MVC框架,我們可以非常快速的定位及發(fā)現(xiàn)問題的所在,客戶端的問題不再需要后臺人員參與及調(diào)試,代碼重構(gòu)及可維護性增強。
心得與體會
一路走來,項目一個接著一個,從一開始的后臺控制路由、后臺渲染頁面到現(xiàn)在的前端控制路由、前端渲染數(shù)據(jù),工作流程和方式都發(fā)生了很大的變化。每當(dāng)遇到下面情形的時候,我都會為前后端分離帶來的優(yōu)勢而感慨一番:
- 項目一開始制作前端頁面的時候,我不再需要后臺給我配置服務(wù)器環(huán)境了
- 項目的前端文件可以在需要調(diào)用后臺接口的時候丟進服務(wù)器就好了,完全不需要事先放進去
- 增加一個項目頁面需要配置路由的時候不再需要讓后臺同事給我加了,自己前端搞定
- 前端文件里不再摻雜后臺的代碼邏輯了,看起來舒服多了
- 頁面跳轉(zhuǎn)比之前更加流暢了,局部渲染局部加載非??焖?/li>
- 頁面模板可以重復(fù)使用了,前端組件化開發(fā)提高了開發(fā)效率
等等。面對快速發(fā)展的前端,我們應(yīng)該去適應(yīng)其帶來的工作方式和流程的改變,目前的前后端分離的工作方式必然是今后的趨勢所在,作為一個前端開發(fā)人員,我們應(yīng)當(dāng)承擔(dān)這個普及前端新知識和改變現(xiàn)狀的職責(zé)。
只有嘗試了才知道適不適合,只有切身體會才能辨別誰是誰非,本文并非推崇一定要前后端分離,而是希望大家在合適的應(yīng)用場景下去嘗試前后端分離,在豐富經(jīng)驗的同時或許也會擦出火花。