SPA單頁面應用容器 開源地址: https://github.com/yuzd/Spa 功能介紹 前端應用開發完後打包後自助上傳部署發佈 配合服務端腳本(javascript)實現服務端業務邏輯編寫渲染SSR功能 可以快速回滾到上一個版本 可以設置環境變數供SSR功能使用 服務端腳本提供執行日誌 ...
SPA單頁面應用容器 開源地址: https://github.com/yuzd/Spa
功能介紹
- 前端應用開發完後打包後自助上傳部署發佈
- 配合服務端腳本(javascript)實現服務端業務邏輯編寫渲染SSR功能
- 可以快速回滾到上一個版本
- 可以設置環境變數供SSR功能使用
- 服務端腳本提供執行日誌 redis db三大組件打造強大的基於js的ssr服務端運行腳本功能
快速部署(支持docker),各功能介紹使用 請查看wiki
截圖介紹
首頁
新建單頁面應用
重新部署上傳,回滾上一個上傳版本
全局配置
服務端SSR腳本編輯器
日誌查看
01.快速開始
將本項目clone到本地 git clone https://github.com/yuzd/Spa.git 或者 下載zip到本地
然後用vs 2017或以上版本 打開!
打開appsettings.json 進行您所使用環境的配置參數:
參數名稱 | 說明 |
---|---|
BackUpLimit | 每個單頁面上傳會進行備份,這個參數是應用維度下最多保留幾次上傳歷史 |
BasicAuth | 設置進入系統的賬號密碼 |
RedisConnection | 配置redis的連接字元串(為啥用redis請看ssr相關介紹) |
ConnectionString | 配置mysql的連接字元串(為啥用mysql請看ssr相關介紹) |
F5 運行
然後打開 http://localhost:5000/admin
02.單頁面應用規範
系統跑起來之後,我們的前端容器就已經搞定了。
什麼是單頁面應用呢?
- 就是指一個系統只載入一次資源,之後的操作交互、數據交互是通過路由、ajax來進行,頁面並沒有刷新。
- 特點是載入次數少,載入以後性能較高
對於本套系統的規範
- 不管你用什麼前端技術,只要是 靜態的html,js,css 的前端資源,就可以部署到本系統!
- 需要有一個約束 需要有index.html
例如下麵的例子:
03.單頁面應用部署,回滾
下麵我們開發一個最簡單單頁應用
有2個文件
- index.html
- index.js
然後我打包成 detai.zip 文件
進入系統 新建一個單頁面應用
- 單頁面名稱我這裡填 detail 發佈成功後可以通過
- 選擇剛剛的zip 然後點擊【創建並部署】
- 然後打開 http://localhost:5000/detail 進行確認是否成功 如下圖
接下來我要修改index.html 然後重新部署
重新打包zip 然後
重新訪問 http://localhost:5000/detail 進行確認是否修改成功 如下圖
大家應該註意到了,前端有改動 只要重新上傳立刻生效!
如果發佈之後發佈改錯了咋辦,當然是立刻回滾到上一次的上傳版本!
如下圖 回滾功能:
重新訪問 http://localhost:5000/detail 進行確認是否回滾成功 如下圖
04.單頁面應用做服務端渲染SSR
首先得理解下麵兩點
- 什麼是服務端渲染? 關鍵詞:後端代碼+模板引擎
- 什麼場景下需要用到服務端渲染?關鍵詞:seo:動態的標題 Description 等meta信息
什麼是服務端渲染?下麵是我的理解
我寫了一個網頁,部署到web容器後,我打開瀏覽器請求,服務端收到請求後 先在服務端讀取我的網頁的內容,然後結合 後端代碼+模板引擎的方式重新渲染再 返回給瀏覽器展示
什麼場景下需要用到服務端渲染?下麵是我的理解
當你的頁面的標題,Description 等meta信息 需要動態指定的時候。 比如:
產品分享頁面:
productId=1 productName = "產品A" http://localhost:5000/detai?productId=1
需要Title要指定為 "產品A"
productId=2 productName = "產品B" http://localhost:5000/detai?productId=2
需要Title要指定為 "產品B"
要滿足這個需求 僅僅靠前端是沒有辦法完成的。因為你頁面在頁面ready後再去調用ajax方法是沒有辦法動態指定Title的。這點可以大家實驗實驗!
解決方案: 服務端代碼+模板引擎
本系統最大的亮點來了:模板引擎約定好,前端自己就能搞定服務端js代碼
是用上面的 產品分享頁面 為例:
如下圖,進入單應用的SSR腳本編輯功能
預設 腳本編輯器裡面會 寫好代碼模板, 如下:
module.exports = {
main:function (path){
}
};
當提交保存 腳本代碼後,訪問 http://localhost:5000/detai?productId=2 會先把當前頁面的請求url 作為path參數傳到 腳本的 main 方法!
我們用 log 組件進行打日誌記錄下:
查看日誌:
業務代碼 做如下改寫SSR腳本:
let log = require('log');
module.exports = {
main:function (path){
log.Info(path);
var requestparams = module.exports.GetRequest(path);
var productTid = requestparams.productId;
if(!productTid) return;
if(productTid == 1){
return {
ProductName:'產品A'
};
}
else if (productTid == 2){
return {
ProductName:'產品B'
};
}
else {
return {
ProductName:'其他產品'
};
}
},
/**
* [獲取URL中的參數名及參數值的集合]
* 示例URL:http://localhost:5000/detail?productId=2
* @param {[string]} urlStr [當該參數不為空的時候,則解析該url中的參數集合]
* @return {[string]} [參數集合]
*/
GetRequest:function (urlStr) {
var url = "?" + urlStr.split("?")[1];
var theRequest = {};
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for (var i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = decodeURI(strs[i].split("=")[1]);
}
}
return theRequest;
}
};
註意:上面我把main方法改造了 返回了 一個 對象
{
"ProductName" : "xxxxxx"
}
模板引擎其實很簡單:
SSR腳本返回了什麼對象 在html中用 @Model.xxxx 的形式使用!!簡單吧!!如下圖:
邏輯和上面的SSR腳本一致!
如上我們用SSR腳本代碼的業務邏輯 + 模板引擎 解決服務端渲染!
上面的腳本代碼我們用了log組件=》方便的把腳本的執行過程中記錄日誌, 當然了 正常業務的服務端渲染邏輯肯定不是這麼簡單的,不用擔心我們接下來介紹另外2個組件: redis組件 和 db組件