2019-02-17
κ°μΈμ μΈ κ³΅λΆ λ ΈνΈλ‘, μ€λ₯κ° μμ μ μμ΅λλ€.
μΊμμ μ΄μμ νλμ€μ΄λ‘ "hiding place for stores"λΌλ μλ―Έμ΄λ€. (μΆμ²)
μΊμλ λμΌν request(λμΌν μ΄λ¦μ 리μμ€)μ λνμ¬ λΈλΌμ°μ κ°(λλ λ€νΈμν¬ λ¨μμ) κ°κ³ μλ response μ 볡μ¬λ³Έμ΄λ€. λΈλΌμ°μ λ μ΄μ μ μλ΅μ κΈ°μ΅νκ³ μλ€κ° λμΌν request κ° μ¬ λ μλ²μ λ€μ μμ²νμ§ μκ³ λ³΅μ¬λ³Έμ λ°ννλ€. μλ²λ₯Ό κ±°μΉμ§ μκΈ° λλ¬Έμ λΉ λ₯΄κ³ , λΆνλ μ λ€. μμ€κ° λ°λ λκΉμ§ μΊμλ 볡μ¬λ³Έμ λ°ννλλ‘ ν μ μκΈ° λλ¬Έμ μ μ ν νμ©νλ©΄ μ¬μ©μκ° μλ΅μ λ°λ μλλ₯Ό νμ ν μ€μΌ μ μλ€.
webpack
// webpack.config.js
module.exports = {
...
output: {
filename: "static/js/main.[hash:8].js",
},
...
}
file-loader
μμ μλμ κ°μ΄ ν΄μκ°μ λΆμΌ μ μλ€.module: {
rules: [
{
test: [/\.jpeg?g$/, /\.png$/],
use: [
{
loader: "file-loader",
options: {
name: "[name].[hash:8].[ext]",
outputPath: "img/",
publicPath: "img/"
}
}
]
}
...
];
}
html, css, js λ± λ¦¬μμ€μ λνμ¬ cache-control
HTTP header λ₯Ό μ§μ νλ©΄ λμ± κ³΅κ²©μ μΌλ‘ μΊμ±μ ν μ μλ€. cache-control
μ λ€μ΄κ°λ κ°μ ,
λ‘ κ΅¬λΆλ λ¬Έμμ΄μ΄λ€.
$ tree .
dist
βββ favicon.ico
βββ index.html
βββ static
βββ css
β βββ main.[hash:8].css
βββ js
β βββ main.[hash:8].js
βββ media
βββ image.png
μλ₯Ό λ€μ΄ μμ κ°μ λλ ν 리 κ΅¬μ‘°λ‘ Single Page Application μ κ°λ°ν κ²½μ°, κ°κ°μ 리μμ€μ λνμ¬ λ€μκ³Ό κ°μ΄ cache-control μ μ€μ ν μ μλ€.
index.html
- "no-cache"
no-cache
: 맀 μμ²λ§λ€ μ½ν
μΈ κ° λ°λμλμ§ μλ²μμ κ²μ¦νλ round-trip μ νλ² νλ€. 리μμ€κ° λ°λμ§ μμκ³ μΊμκ° μμ κ²½μ°, 리μμ€λ₯Ό μμ²νμ§ μκ³ μΊμμμ κ°μ Έμ¨λ€.main.[hash:8].js
- "private, max-age=31536000"
private
: js νμΌμλ μ€μν μ¬μ©μ μ λ³΄κ° μμ μ μκΈ° λλ¬Έμ κ³΅μ© cache λ₯Ό μ¬μ©νμ§ μκ³ private cache (ν΄λΌμ΄μΈνΈμ λΈλΌμ°μ )λ₯Ό μ¬μ©νλ€.max-age
: μ΄(second) κ°μ λ°μΌλ©° λͺ
μλ μκ°λμ μΊμλ₯Ό μ¬μ©νλΌλ μλ―Έμ΄λ€. js νμΌμ μμ€κ° λ³κ²½λμ΄ μλ‘ λΉλλμμ κ²½μ°, url μ hash κ°μ΄ λ°λκΈ° λλ¬Έμ μΊμ±μ΄ λμ§ μλλ€. max-age=31536000
λ λ°λμ§ μλ 리μμ€μ λνμ¬ 1 λ
κ° μΊμ±ν¨μ μλ―Ένλ€.main.css
- "max-age=31536000"
max-age=31536000
: js νμΌκ³Ό λ§μ°¬κ°μ§λ‘ hash κ° λΆκΈ° λλ¬Έμ λ°λμ§ μμ νμΌμ λνμ¬ 1 λ
κ° μΊμ±νλ€.μ΄λ―Έμ§ - "max-age=86400"
max-age
: url μ΄ λ°λμ§ μμ κ²½μ° 1 μΌ, hash λ₯Ό λΆμΌ κ²½μ°(μΉν©μμ require()
λ₯Ό μ¬μ©ν΄ λΉλνλ κ²½μ°)μλ 1 λ
μΌλ‘ ν μ μλ€.cache-control
s3 λ₯Ό μ΄μ©νμ¬ μ μ νμΌμ νΈμ€ν
ν κ²½μ°, Metadata μ€μ μ ν΅ν΄μ cache-control
μ μ§μ ν μ μλ€. AWS SDK for JavaScript λ₯Ό μ¬μ©νμ¬ μ μ νμΌμ s3 μ μ
λ‘λ/λ°°ν¬ν κ²½μ°, μλμ κ°μ΄ cache-control
μ μ€μ ν μλ μλ€.
s3.upload(
{
Bucket: bucket, // S3 bucket name
Key: key, // file name
Body: file,
ACL: "public-read",
ContentType: "application/javascript",
CacheControl: "private, max-age=86400"
},
function(err, data) {
...
}
);
Cloudfront λ₯Ό μ¬μ©ν κ²½μ°, cache invalidation μ ν΅ν΄ μμ€κ° λ°λμμ§λ§ μ΄λ¦μ λ°λμ§ μμ 리μμ€μ λνμ¬ μμλ‘ cache λ₯Ό μ§μμ€ μλ μλ€.
λ μμ보기
etag
- https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/ETag
Sources: