以前的開發選擇的是徹底捨棄服務端,僅保留最簡單web服務器提供angular經打包的靜態資源,此外全部的業務與數據請求都訪問一個分離的WebApi來實現。不過最近碰到一個需求,有必要使用多個客戶端,而各客戶端自己都是webpack打包出來的js而已,不必每一個客戶端都本身建一個站點,這就有必要搭建一個服務端,根據參數動態渲染不一樣客戶端的腳原本服務多個客戶端了。主要須要解決兩個問題,一是防止先後端路由衝突各自有效工做,二是如何實現一套比較合理的部署方案。籠統一點看待這個問題,無非就是要實現如題目所描述的,如何將專一前端的強大框架(angular)整合到一個健壯的現有服務端(.Net)項目中去。html
第一步必然是要先獲得前端項目的打包資源,由強大的webpack來完成,目標是將angular的全部依賴以及應用主代碼分別打包到polyfill.js、vendor.js、main.js三個腳本中,以及異步懶加載的模塊各自打包成一個chunk.js。webpack博大精深,剛接觸會摸不着頭腦,好在其終究是用來給咱們帶來方便的一個工具而已,使用起來是頗有條理的。其主要的介紹能夠移步webpack的官方文檔【https://doc.webpack-china.org 】,認真吸取完遠遠足夠寫出angular-webpack-starter【 https://github.com/AngularClass/angular-starter 】這樣完善的啓動項目來了。
簡單來講webpack配置有四部曲:前端
entry: { 'polyfills': './src/polyfills.browser.ts', // 依賴項 'main': AOT ? './src/main.browser.aot.ts' : './src/main.browser.ts' // 主程序 },
打包規則有好一些須要配置的,包括了各類文件類型的打包,angular模塊的打包等,配置方式見官方文檔或直接參照現成的啓動項目,直接看不免懵逼,但不要怕,規則其實就那麼點,眼熟就成功了大半。webpack
webpack有很是多的插件,用來強化打包能力以及規則的擴展,能夠看看啓動項目中用到了哪些,這些插件在官方文檔裏都能找到介紹。git
輸出要分生產環境和開發環境,本文只講生產環境。先明確webpack打包好的項目是要交給服務端使用的,給出的輸出要有幾個需求: 1) 轉義兼容瀏覽器和ES5並壓縮。2)輸出文件名附帶哈希值,代碼發生更改從新打包時要有不一樣的哈希值,保證此時替換的資源不會被瀏覽器緩存而得不到第一時間更新。3)列出資源打包清單,由於附帶了哈希值致使每次文件名都是很長一串奇怪字符,使用合適的webpack配置附帶一個manifest清單列出都輸出了哪幾個文件,進一步在使用時動態讀取其中的清單來操做輸出的文件。github
順利的話開發完成的項目能獲得相似下圖的打包資源:web
其中webpack-assets.json中列出了三個依賴文件:json
以0、一、二、3打頭的四個chunk文件是由angular動態引入的懶加載模塊,不須要手動引入天然也不須要列出來,只須要保證angular能訪問到它們便可。
把這些東西全都放到一個.Net MVC項目中去:後端
而後在View視圖中引入三個腳本並配置base url:瀏覽器
如今運行MVC項目,定位到這個視圖能夠順利渲染出angular項目來。問題在於手動輸入前端路由的url時,此url會被MVC路由視爲404錯誤(由於MVC路由中確實未定義這一規則,真正使用此規則的angular客戶端尚未機會解析這個url就被一個錯誤頁取代了)。緩存
angular官方給出的指南是給服務端配置404的重定向,將全部的404錯誤都重定向到index.html,這樣前端就能順利開始解析輸入的url了。在MVC中作法也相似,只要在MVC的路由規則中,將必要路由(好比還定義了其餘的Api或者錯誤頁)以外的全部請求都指向指定的Action,好比筆者的這條規則,將全部其餘請求都指向AppController下的Index:
這樣除了/page/打頭的url外全部不知足默認路由的請求都會定位到/App/Index。
下一步是要在這個/App/Index中讀取前端打包生成的webpack-assets.json清單,將須要的文件渲染到視圖中,筆者項目添加了一個academyid來區分多客戶端,每一個客戶端都有以本身id命名的一個資源目錄,實現以下圖所示:
筆者的C#比較摳腳,因此定義了一個class來解析json文件,而後才把解析到的文件名放到ViewData中以供前端使用。如今視圖中就可使用Razer語法來渲染腳本依賴:
這樣子配置下來,服務端其實不須要再關心客戶端的更改,只關心從webpack-assets.json中解析要加載的依賴,並渲染這些依賴便可,每當客戶端代碼更改從新打包時,webpack-assets.json清單也會更新,絕不影響服務端。
水平有限致使本文存在許多的不足之處,包括一直未涉及的SEO方案以及其餘的隱藏問題,筆者還有不少須要學習完善的地方。