什麼是服務器端渲染(SSR)?html
Vue.js 是構建客戶端應用程序的框架。默認狀況下,能夠在瀏覽器中輸出 Vue 組件,進行生成 DOM 和操做 DOM。然而,也能夠將同一個組件渲染爲服務器端的 HTML 字符串,將它們直接發送到瀏覽器,最後將這些靜態標記"激活"爲客戶端上徹底可交互的應用程序。vue
服務器渲染的 Vue.js 應用程序也能夠被認爲是"同構"或"通用",由於應用程序的大部分代碼均可以在服務器和客戶端上運行。java
緩存webpack
雖然 Vue 的服務器端渲染(SSR)至關快速,可是因爲建立組件實例和虛擬 DOM 節點的開銷,沒法與純基於字符串拼接(pure string-based)的模板的性能至關。在 SSR 性能相當重要的狀況下,明智地利用緩存策略,能夠極大改善響應時間並減小服務器負載。ios
vue服務區緩存分爲頁面緩存、組建緩存和接口緩存程序員
頁面緩存 :web
在server.js中設置面試
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
const LRU = require(
'lru-cache'
)
const microCache = LRU({
max: 100,
// 最大緩存的數目
maxAge: 1000
// 重要提示:條目在 1 秒後過時。
})
const isCacheable = req => {
//判斷是否須要頁面緩存
if
(req.url && req.url ===
'/'
) {
return
req.url
}
else
{
return
false
}
}
app.get(
'*'
, (req, res) => {
const cacheable = isCacheable(req)
if
(cacheable) {
const hit = microCache.get(req.url)
if
(hit) {
return
res.end(hit)
}
}
const errorHandler = err => {
if
(err && err.code === 404) {
// 未找到頁面
res.status(404).sendfile(
'public/404.html'
);
}
else
{
// 頁面渲染錯誤
res.status(500).end(
'500 - Internal Server Error'
)
console.error(`error during render : ${req.url}`)
console.error(err)
}
}
const context = {
title:
'vue'
,
keywords:
'vue-ssr服務端腳手架'
,
description:
'vue-ssr-template, vue-server-renderer'
,
version: v,
url: req.url,
cookies: req.cookies
}
renderer.renderToString(context, (err, html) => {
if
(err) {
return
errorHandler(err)
}
res.end(html)
microCache.set(req.url, html)
// 設置當前緩存頁面的內容
})
})
|
組建緩存 :json
在server.js中設置以下:axios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
function
createRenderer(bundle, template) {
return
require(
'vue-server-renderer'
).createBundleRenderer(bundle, {
template,
cache: LRU({
max: 1000,
maxAge: 1000 * 60 * 5
// 組建緩存時間
})
})
}
let renderer
if
(isProd) {
// 生產環境使用本地打包文件來渲染
const bundle = require(
'./output/vue-ssr-bundle.json'
)
const template = fs.readFileSync(resolve(
'./output/index.html'
),
'utf-8'
)
renderer = createRenderer(bundle, template)
}
else
{
// 開發環境使用webpack熱更新服務
require(
'./build/dev-server'
)(app, (bundle, template) => {
renderer = createRenderer(bundle, template)
})
}
|
要緩存的組建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
export
default
{
name:
'Home'
,
title() {
return
{
title:
'vue-ssr'
,
keywords:
'vue-ssr服務端腳手架, home'
,
description:
'vue-ssr-template, vue-server-renderer, home'
}
},
created() {
},
computed: {},
asyncData({ store }) {},
methods: {},
serverCacheKey: props => props.id
}
|
serverCacheKey 返回的 key 應該包含足夠的信息,來表示渲染結果的具體狀況。若是渲染結果僅由 props.item.id 決定,則上述是一個很好的實現。可是,若是具備相同 id 的 item 可能會隨時間而變化,或者若是渲染結果依賴於其餘 prop,則須要修改 serverCacheKey 的實現,以考慮其餘變量。若是 serverCacheKey 返回常量將致使組件始終被緩存,這對純靜態組件是有好處的。
接口緩存:
在create-api-server.js中設置緩存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import qs from
'qs'
import axios from
'axios'
import md5 from
'md5'
import LRU from
'lru-cache'
const microCache = LRU({
max: 100,
maxAge: 5000
// 設置數據多久過時
})
export
function
createAPI({baseUrl, timeout}) {
let api
if
(process.__API__) { api = process.__API__ }
else
{
// 定義全局變量 process.__API__
api = process.__API__ = {
get(url, params = {}) {
const key = md5(url + JSON.stringify(params))
// 判斷是否有緩存,直接返回緩存結果
if
(params.cache && microCache.get(key)) {
console.log(
'返回緩存'
)
return
Promise.resolve(microCache.get(key))
}
return
new
Promise((resolve, reject) => {
axios({
url,
params,
headers: {
'X-Requested-With'
:
'XMLHttpRequest'
// 'Cookie': parseCookie(SSR.cookies)
},
method:
'get'
}).then(res => {
// 判斷是否須要緩存 若是須要緩存緩存數據
if
(params.cache && microCache) {
microCache.set(key, res.data)
}
console.log(
'返回新數據'
)
resolve(res.data)
}).
catch
(error => {
reject(error)
})
})
},
post(url, params = {}) {
const key = md5(url + JSON.stringify(params))
// 判斷是否有緩存,直接返回緩存結果
if
(params.cache && microCache.get(key)) {
return
Promise.resolve(microCache.get(key))
}
return
new
Promise((resolve, reject) => {
axios({
url,
data: qs.stringify(params),
method:
'post'
,
headers: {
'X-Requested-With'
:
'XMLHttpRequest'
,
'Content-Type'
:
'application/x-www-form-urlencoded'
// 'Cookie': parseCookie(SSR.cookies)
}
}).then(res => {
// 判斷是否須要緩存 若是須要緩存緩存數據
if
(params.cache && microCache) {
microCache.set(key, res.data)
}
resolve(res.data)
}).
catch
(error => {
reject(error)
})
})
}
}
}
return
api
}
|
Java Socket應用---通訊是這樣練成的 下載地址:百度網盤下載
java基礎面試題精選(包含答案) 下載地址:百度網盤下載
史上最全面的JavaWeb視頻教程 下載地址:百度網盤下載
傳智java基礎+就業班32期完整版 50G 下載地址:百度網盤下載
SpringMvc(Spring4版本)+Axure RP7.0從入門到精通 視頻教程 下載地址:百度網盤下載
JavaEE就業班第168期高清不加密版 (全)視頻教程 百度雲網盤下載 72G 下載地址:百度網盤下載
傳智播客java第33期基礎班+就業班 視頻教程 教學視頻 百度網盤下載 55G 下載地址:百度網盤下載
傳智播客上海java培訓就業班 視頻教程 教學視頻 百度網盤下載 32G 下載地址:百度網盤下載
潭州學院大型企業內部技術 java課程 視頻教程 教學視頻 百度網盤下載(價值400元) 下載地址:百度網盤下載
Java零基礎入門教程+就業實戰全套視頻教程 下載地址:百度網盤下載
北大青鳥java學士後培訓視頻教程全套 下載地址:百度網盤下載
傳智播客.NET培訓第24期 就業班 視頻教程 教學視頻 百度網盤下載 37G 下載地址:百度網盤下載
傳智播客.NET培訓 基礎+就業班 視頻教程 教學視頻 百度網盤下載 下載地址:百度網盤下載
黑馬JavaEE + Android就業班視頻教程 教學視頻 百度網盤下載 60G 下載地址:百度網盤下載
達內Java 菜鳥零基礎學習JAVA視頻教程 教學視頻 百度網盤下載 下載地址:百度網盤下載
天下網校 Java教程視頻 基礎入門到精通 核心技術程序設計 教學視頻 下載地址:百度網盤下載
web層最火框架——SpringMVC 下載地址:百度網盤下載
傳智播客黑馬程序員JavaEE28期就業班 下載地址:百度網盤下載
黑馬程序員傳智播客16期淘淘商城完整版視頻教程 下載地址:百度網盤下載
2016.07.17黑馬就業班32期JavaEE 下載地址:百度網盤下載