Angular 2 Universal + Akamai
问题描述:
我想看看我是否可以创建基于CDN和角度2通用的堆栈。因此,当用户导航有CDN以获取资产时,并且如果用户第一次访问将具有Universal提供的完整HTML。Angular 2 Universal + Akamai
我在想:
客户< ===> Akamai的< ===>光油< ===>源服务器(与通用的node.js)
这听起来好?你有没有尝试过? 另外我正在考虑为整个堆栈添加nginx和ELB。
现在的问题是: - 这个堆栈可以按预期工作吗?
答
是的,它可以做到!最大的问题是如何使Angular中任意数量的http请求无效以确定呈现的页面。使用某种头部模式来失效可能会有所帮助。
假设你正在使用的官方NG-Express引擎,这样的服务可以让你定义从角运行时的反应:
import { RESPONSE } from '@nguniversal/express-engine/tokens'
import { Inject, Injectable, Optional } from '@angular/core'
import { Response } from 'express'
export interface IServerResponseService {
getHeader(key: string): string
setHeader(key: string, value: string): this
setHeaders(dictionary: { [key: string]: string }): this
appendHeader(key: string, value: string, delimiter?: string): this
setStatus(code: number, message?: string): this
setNotFound(message?: string): this
setError(message?: string): this
}
@Injectable()
export class ServerResponseService implements IServerResponseService {
private response: Response
constructor(@Optional() @Inject(RESPONSE) res: any) {
this.response = res
}
getHeader(key: string): string {
return this.response.getHeader(key)
}
setHeader(key: string, value: string): this {
if (this.response)
this.response.header(key, value)
return this
}
appendHeader(key: string, value: string, delimiter = ','): this {
if (this.response) {
const current = this.getHeader(key)
if (!current) return this.setHeader(key, value)
const newValue = [...current.split(delimiter), value]
.filter((el, i, a) => i === a.indexOf(el))
.join(delimiter)
this.response.header(key, newValue)
}
return this
}
setHeaders(dictionary: { [key: string]: string }): this {
if (this.response)
Object.keys(dictionary).forEach(key => this.setHeader(key, dictionary[key]))
return this
}
setStatus(code: number, message?: string): this {
if (this.response) {
this.response.statusCode = code
if (message)
this.response.statusMessage = message
}
return this
}
setNotFound(message = 'not found'): this {
if (this.response) {
this.response.statusCode = 404
this.response.statusMessage = message
}
return this
}
setError(message = 'internal server error'): this {
if (this.response) {
this.response.statusCode = 500
this.response.statusMessage = message
}
return this
}
}
感谢您的回答!你的意思是使akamai缓存无效,对吧? –
正确。在Node服务器上进行的http请求必须以某种方式捆绑在一起以通知缓存使用了哪些数据来生成呈现的页面。 –