最近的項目系列1——core整合SPA


1、前言

  當前,前后端分離大行其道,我本人之前不少項目也是純前后端分離,但總有些場景,春前后端分離整起來比較痛苦,比如我手頭這個公眾號項目吧,它涉及到第三方鑒權,第三方憑證,以及微信憑證這些,都不適合放到前端去做,外加一些本身業務層面的認證授權,這些終歸是放服務端處理合適一些的。另一層面原因,是不想系統所有功能全懟到一個SPA中,還是希望不同功能模塊,去拆分到不同頁面中的, 俗稱的多頁。

  但作為公眾號系統,富客戶體驗,還是需要一些SPA體驗的,具體來講我的做法是每個功能模塊一個單頁。這便是為啥系列文章中有這個core整合SPA這一篇。

2、邊界上下文

  core端的不說了,MVC,地球人都清楚,這里重點說前端整合。具體來講,我希望把前端體驗中SPA、路由、組件等一系列優秀實踐整合到MVC中。這里以Vue、router、axios為例來說明。

3、實現方式

1) Layout的處理

  Layout殼子頁,大家都知道,定義整個站點的布局,以及引入公共前端文件。既然我們采用Vue系列,那就要把對應的文件引用替換,大致如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width,user-scalable=no, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0" />
    <title>Fuck Frontend</title>
    <environment include="Development">
        <link rel="stylesheet" href="~/lib/mint-ui/dist/style.min.css" />
        <link rel="stylesheet" href="~/css/main.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://cdn.staticfile.org/mint-ui/2.2.13/style.min.css"
              asp-fallback-href="~/lib/mint-ui/dist/style.min.css"
              asp-fallback-test-class="box-sizing"
              asp-fallback-test-property="background-color"
              asp-fallback-test-value="border-box"
              crossorigin="anonymous" />
        <link rel="stylesheet" href="~/css/main.min.css" />
    </environment>
    @RenderSection("CSS", required: false)
</head>
<body>
    <div id="app">
        @RenderBody()
    </div>
    <environment include="Development">
        <script src="~/lib/vue/dist/vue.min.js"></script>
        <script src="~/lib/mint-ui/dist/index.js"></script>
        <script src="~/lib/vue-router/dist/vue-router.min.js"></script>
        <script src="~/lib/axios/dist/axios.min.js"></script>
        <script src="~/js/main.js"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js"
                asp-fallback-src="~/lib/vue/dist/vue.min.js"
                asp-fallback-test="window.Vue"
                crossorigin="anonymous">
        </script>
        <script src="https://cdn.staticfile.org/mint-ui/2.2.13/index.js"
                asp-fallback-src="~/lib/mint-ui/dist/index.js"
                asp-fallback-test="window.MINT"
                crossorigin="anonymous">
        </script>
        <script src="https://cdn.staticfile.org/vue-router/3.1.3/vue-router.min.js"
                asp-fallback-src="~/lib/vue-router/dist/vue-router.min.js"
                asp-fallback-test="window.VueRouter"
                crossorigin="anonymous">
        </script>
        <script src="https://cdn.staticfile.org/axios/0.19.0/axios.min.js"
                asp-fallback-src="~/lib/axios/dist/axios.min.js"
                asp-fallback-test="window.axios"
                crossorigin="anonymous">
        </script>
        <script src="~/js/main.min.js"></script>
    </environment>
    @RenderSection("Scripts", required: false)
</body>
</html>

2) 前端JS代碼結構

  這里咱們不去講webpack中那一套,咱們只看在傳統MVC中那一套。上圖:

 

   CSS、img不說,重點說JS文件結構,大概這么幾個層次:

  js根目錄下放置公共js文件及其打包&壓縮后的.min.js文件,例如圖中的main.js、main.min.js,以及各功能模塊打包&壓縮后的.min.js,如上圖中order.min.js;

  JS根目錄下的文件夾,對應各個功能模塊,如這里的order文件夾對應order功能模塊,內置order的各個前端js文件;

  功能模塊文件夾內部,對應功能模塊內部的Vue組件,以及模塊內部公共js文件,例如這里order內部,有index.js和component文件夾,index內主要是order相關的前端路由,視圖掛載,component是order模塊用到的幾個視圖組件。

  

  這便是具有后端風格的前端文件組織方式。打包&壓縮暫時不講,在后續系列文章中單獨說。

3)前端異常處理AOP

  回到JS根目錄,在mian.js中有這么一段:

 

 此處全局攔截Axios響應結果,如果非正常響應,如401,403,500等,則根據是否有重定向地址,決定是重定向到對應頁,還是前端彈框提示錯誤信息。此處的AOP實現是依據node中間件的概念,跟core里邊的中間件如出一轍。

4)ajax請求標識

   一般而言,后端需要識別前端過來的請求是頁面請求還是ajax請求,如果不依賴前端傳遞的特定標識的話,服務端是沒法識別這個的,所以在ajax請求中我們加入特定標頭,這里還是在man.js:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM