μ΄μ κΈμμ CSR, SSR, SSGμ λν΄ κ°κ°μ μ°¨μ΄μ μ λν΄μ λ€λ€ 보μμ΅λλ€. Angular, React, Vueμμ κ°κ°μ λ°©μμΌλ‘ μ΄λ¬ν λ λλ§ λ°©μμΌλ‘ ꡬνμ ν μκ° μλλ°μ. λνμ μΌλ‘ Angularλ Universal, Reactλ NextJs, Vueλ Nuxt λ±μ λ§μ΄ μ¬μ©νλ κ² κ°λ€μ. Angularλ κ΅λ΄μμ μΈκΈ°κ° λ§μ΄ μμ΄μμΈμ§ ν΄λΉ λ΄μ©μ λ€λ£¨λ κΈμ΄ μλλ―νμ¬ μ΄λ² κΈ°νμ μ κ° μ¬μ©μ ν΄λ³΄κ³ κ°λ¨νκ²λλ§ μ 리ν΄λ³΄κ² μ΅λλ€.
λ λλ§ μ’ λ₯μ λν κΈμ μ¬κΈ°λ₯Ό μ°Έκ³
κ²°λ‘ λΆν° λ§μλ리면 κ΅μ₯ν μ½μ΅λλ€!
λ¨Όμ κ°λ¨νκ² κ°λ μ λλ§ λ€μ μ§κ³ λμ΄κ°κ² μ΅λλ€.
PreRendering
μ°λ¦¬μκ² κ°μ₯ μ΅μν ν΄λΌμ΄μΈνΈ λ λλ§(CSR) λ°©μμ μ μμ€ ν κ³ , μλ²μ¬μ΄λ λ λλ§(SSR)μ κ° νμ΄μ§μ λν μμ²μ λ°μΌλ©΄ λΈλΌμ°μ μμ§μ λμ ν΄μ μλ²μμ Nodeκ° λ λλ§νκ³ κ²°κ³Όλ¬Όμ ν΄λΌμ΄μΈνΈμμ μ λ¬ν΄μ£Όλ κ²μ΄κ³ , μ¬μ λ λλ§(PreRendering, SSG) λ§ κ·Έλλ‘ λ―Έλ¦¬ λ λλ§μ ν΄λκ³ μλ²μμ ν΄λΉ νμ΄μ§μ λν μμ²μ΄ μ€λ©΄ 미리 λ λλ§ν΄λμλ νμ΄μ§λ₯Ό μ λ¬!
μ μ΄μ λꡬλ μλ €μ£Όμ§ μμλ, Angular Universalμ μ΄μ©ν΄ νμ΄λΈλ¦¬λ λ λλ§μ ꡬνν΄ λ³΄κ² μ΅λλ€.
Universal
hybrid-rendering-app
μ΄λΌλ μλ‘μ΄ νλ‘μ νΈλ₯Ό μμ±νκ³ universal packageλ₯Ό μΆκ°ν΄μ€λλ€.
@nguniversal/express-engine
μ μΆκ° ν΄μ£Όλ©΄ main.server.ts
, app.server.module.ts
κ³Ό κ°μ λκ° λͺ»λ³΄λ νμΌλ€μ΄ μ겨λλ κ²μ 보μ€μ μμ΅λλ€. μ°λ¦¬λ μ§κΈκ» λΈλΌμ°μ νκ²½μμ ν΄λΌμ΄μΈνΈ λ λλ§μ μ¬μ©νμ§λ§, μ΄μ λΈλΌμ°μ νκ²½μ΄ μλκ³³μμ λ λλ§μ ν΄μΌ νκΈ° λλ¬Έμ Nodeκ° μ€νν΄μ€ νμΌμ΄ νμνκΈ° λλ¬Έμ
λλ€.
package.json
νμΌμ 보면 μ²μ 보λ scriptsλ€λ νμΈ ν μ μμ΅λλ€.
"dev:ssr": "ng run hybrid-rendering-app:serve-ssr",
"serve:ssr": "node dist/hybrid-rendering-app/server/main.js",
"build:ssr": "ng build && ng run hybrid-rendering-app:server",
"prerender": "ng run hybrid-rendering-app:prerender"
ν€κ°λͺ μΉμ 보면 λμΆ© μ΄λ€κ²μ νλκ²μ΄κ² ꡬλ.. νλ μ λμ κ°μ μ€μ ¨μ κ²λλ€.
λ¨Όμ prerendering
μ ν΄λ³΄κΈ° μν΄ route νμ΄μ§κ° νμνλ°, aboutμ contact λͺ¨λμ μΆκ°νκ³ λΌμ°ν°μ λ±λ‘ μμΌλ³΄κ² μ΅λλ€.
κ°κ°μ μ»΄ν¬λνΈλ₯Ό μμ±ν΄ routerμ λ±λ‘ν΄λ λμ§λ§ μλμ κ°μ λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μ½κ² μΆκ°ν μ μμ΅λλ€. (Angular νλ μμμ μ₯μ μ΄κΈ°λ νμ£ , 볡μ‘ν΄ λ³΄μ΄μ§λ§ 체κ³μ μ΄λ€? ^^;)
Run
λ°λ‘ μ¬μ λ λλ§μ ν΄λ³΄μ£ !
npm run prerender
01
dist λλ ν 리λ₯Ό 보μλ©΄ server, browser λκ°μ λλ ν λ¦¬λ‘ λλμ΄μ Έ μλ€μ. server/main.js μ΄ νμΌμ΄ nodeμμ μ€νν΄μ£Όλ νμΌμ΄ λλκ²μ΄κ³ μ, browser λλ ν 리 λ΄λΆμ μλ νμΌλ€μ΄ λ λλ§λ νμΌλ€μ
λλ€. κ·Έλ°λ° index.html νμΌλ§ μλκ² μλκ³ routerμ λ±λ‘ν about, contactμ index.htmlνμΌλ κ°κ°μ λλ ν 리μ μμ±μ΄ λμμ΅λλ€.
κ°κ°μ νμ΄μ§ μμ²μ΄ μ€λ©΄ 미리 λλλ§ν΄λ index.htmlνμΌμ μ λ¬νκΈ° μν¨μ΄μ£ .
Options
κ·Έλ¦¬κ³ angular.json
νμΌμ μ΅μ
μ 보λ₯Ό μ΄μ©ν΄μ μνλ νμ΄μ§λ§ μ¬μ λ λλ§μ ν΄λμκ° μμ΅λλ€. μλ₯Ό λ€μ΄ about νμ΄μ§λ§ μ¬μ λ λλ§μ ν΄λκ³ μΆλ€. κ·ΈλΌ "guessRoutes": false
, "routes"
λ°°μ΄μ λ λλ§ν νμ΄μ§λ§ μΆκ°ν΄μ€λλ€.
projects > hybrid-rendering-app > architect > prerender
"options" : {
"guessRoutes": false,
"routes": [
"/about"
]
}
"routesFile": "./routes.txt" νμΌμ κ²½λ‘λ€μ μ€μ ν μλ μμ΅λλ€.
λ μμΈν options
μ 보λ μ¬κΈ°μμ νμΈν΄ μ£ΌμΈμ
μ΄μ nodeλ‘ ν΄λΉ jsνμΌμ μ€νν΄μ£Όλ©΄ λ©λλ€.
Server Start
node dist\hybrid-rendering-app\server\main.js
Node Express server listening on http://localhost:4000
μλ²λ₯Ό ꡬλν΄μ£Όκ³ λΈλΌμ°μ μ μ μν΄μ Network νμ μ΄ν΄ 보면 κ° λΌμ°ν μ μ κ·Όν λλ§λ€ ν΄λΉ λ¬Έμλ₯Ό λ€μ΄λ°λ κ²μ νμΈν μ μμ΅λλ€.
main
main
about
about
contact
contact
μ΅μ΄ μ μμ index.html νμΌμ λ°μ κ·Έμμμ javascript νμΌμ μν΄ λμ μΌλ‘ λ¬Έμλ₯Ό λ³κ²½νλ SPAλ°©μκ³Όλ λ¬λ¦¬ λΌμ°ν° μ κ·Όμ μ¬μ μ λ λλ§λ λ¬Έμλ₯Ό μλ²μμ μ λ¬ν΄μ£Όκ² λ©λλ€.
κ±°μ λ³κ²½μ΄ μλ νμ΄μ§λ€μ κ²½μ° μ΄λ κ² μ¬μ μ λ λλ§μ ν΄λλ©΄ μ±λ₯μ μΈ λΆλΆμμ λ§€μ° ν¨νΌμ μΌ κ²μ΄μ§λ§, νμ΄μ§ λ΄μ©μ΄ μμ£Ό λ³κ²½μ΄ λλ€κ±°λ κ²μν κ°μ λμ μΈ λΌμ°ν
μ μ¬μ©νλ€λ©΄, options
μ λ λλ§ν νμ΄μ§λ§ λͺ
μν΄μ£Όλ©΄ μ νμ μΌλ‘ μ¬μ λ λλ§μ ν μ μκ² λλ κ² μ
λλ€.