μλ°μ€ν¬λ¦½νΈμ λͺ¨λ λ‘λ© λ¨κ³, μν¬νΈ μλͺ μ£ΌκΈ° κ΄λ¦¬, κ·Έλ¦¬κ³ μ ν리μΌμ΄μ μ μ±λ₯κ³Ό μ μ§λ³΄μμ±μ μ΅μ ννλ λ°©λ²μ μ¬μΈ΅μ μΌλ‘ λΆμν©λλ€. μ μΈκ³ κ°λ°μλ₯Ό μν κ°μ΄λμ λλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λ λ‘λ© λ¨κ³: μν¬νΈ μλͺ μ£ΌκΈ° κ΄λ¦¬
μλ°μ€ν¬λ¦½νΈ λͺ¨λμ νλ μΉ κ°λ°μ ν΅μ¬ μμλ‘, κ°λ°μκ° μ½λλ₯Ό μ¬μ¬μ© κ°λ₯νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ λ¨μλ‘ κ΅¬μ±ν μ μκ² ν΄μ€λλ€. μλ°μ€ν¬λ¦½νΈ λͺ¨λ λ‘λ© λ¨κ³μ μν¬νΈ μλͺ μ£ΌκΈ°λ₯Ό μ΄ν΄νλ κ²μ μ±λ₯μ΄ λ°μ΄λκ³ νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ μ μΈκ³ κ°λ°μλ₯Ό λμμΌλ‘ λͺ¨λ λ‘λ©μ 볡μ‘μ±μ κΉμ΄ νκ³ λ€μ΄ κ΄λ ¨λ λ€μν λ¨κ³, λͺ¨λ² μ¬λ‘, κ·Έλ¦¬κ³ μ€μ©μ μΈ μμ λ₯Ό λ€λ£¨μ΄ μλ°μ€ν¬λ¦½νΈ κ°λ°μ μ΄ νμμ μΈ μΈ‘λ©΄μ λ§μ€ν°νλ λ° λμμ μ€ κ²μ λλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λμ μ§ν
λ€μ΄ν°λΈ μλ°μ€ν¬λ¦½νΈ λͺ¨λμ΄ λ±μ₯νκΈ° μ , κ°λ°μλ€μ μ½λ ꡬμ±κ³Ό μμ‘΄μ± κ΄λ¦¬λ₯Ό μν΄ λ€μν κΈ°μ μ μμ‘΄νμ΅λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
- μ μ λ³μ(Global Variables): κ°λ¨νμ§λ§ λ€μμ€νμ΄μ€ μ€μΌμ μ·¨μ½νκ³ λκ·λͺ¨ νλ‘μ νΈμμ κ΄λ¦¬νκΈ° μ΄λ ΅μ΅λλ€.
- μ¦μ μ€ν ν¨μ ννμ(IIFEs): λΉκ³΅κ° μ€μ½νλ₯Ό λ§λ€μ΄ λ³μ μΆ©λμ λ°©μ§νλ λ° μ¬μ©λμμ§λ§, λͺ μμ μΈ μμ‘΄μ± κ΄λ¦¬ κΈ°λ₯μ΄ λΆμ‘±νμ΅λλ€.
- CommonJS: μ£Όλ‘ Node.js νκ²½μμ μ¬μ©λλ©°,
require()μmodule.exportsλ₯Ό μ¬μ©ν©λλ€. ν¨κ³Όμ μ΄μμ§λ§ λΈλΌμ°μ μμ λ€μ΄ν°λΈλ‘ μ§μλμ§ μμμ΅λλ€. - AMD (Asynchronous Module Definition):
define()λ°require()μ κ°μ ν¨μλ₯Ό μ¬μ©νλ λΈλΌμ°μ μΉνμ μΈ λͺ¨λ νμμ λλ€. κ·Έλ¬λ μ체μ μΈ λ³΅μ‘μ±μ κ°μ§κ³ μμμ΅λλ€.
ES6(ECMAScript 2015)μμ ES λͺ¨λ(ESM)μ΄ λμ λλ©΄μ μλ°μ€ν¬λ¦½νΈκ° λͺ¨λμ μ²λ¦¬νλ λ°©μμ νλͺ μ΄ μΌμ΄λ¬μ΅λλ€. ESMμ μ½λ ꡬμ±, μμ‘΄μ± κ΄λ¦¬ λ° λ‘λ©μ λν νμ€νλκ³ λ ν¨μ¨μ μΈ μ κ·Ό λ°©μμ μ 곡ν©λλ€. ESMμ μ μ λΆμ, ν₯μλ μ±λ₯, λ€μ΄ν°λΈ λΈλΌμ°μ μ§μκ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€.
μν¬νΈ μλͺ μ£ΌκΈ° μ΄ν΄νκΈ°
μν¬νΈ μλͺ μ£ΌκΈ°λ λΈλΌμ°μ λ μλ°μ€ν¬λ¦½νΈ λ°νμμ΄ μλ°μ€ν¬λ¦½νΈ λͺ¨λμ λ‘λνκ³ μ€νν λ κ±°μΉλ λ¨κ³λ₯Ό μ€λͺ ν©λλ€. μ΄ κ³Όμ μ μ½λκ° μ΄λ»κ² μ€νλλμ§ μ΄ν΄νκ³ μ±λ₯μ μ΅μ ννλ λ° μ€μν©λλ€. μν¬νΈ μλͺ μ£ΌκΈ°λ λͺ κ°μ§ λλ ·ν λ¨κ³λ‘ λλ μ μμ΅λλ€:
1. νμ±(Parsing)
νμ± λ¨κ³μμ μλ°μ€ν¬λ¦½νΈ μμ§μ λͺ¨λμ μμ€ μ½λλ₯Ό λΆμνμ¬ κ·Έ ꡬ쑰λ₯Ό μ΄ν΄ν©λλ€. μ¬κΈ°μλ μν¬νΈ λ° μ΅μ€ν¬νΈ λ¬Έ, λ³μ μ μΈ λ° κΈ°ν μΈμ΄ ꡬ문μ μλ³νλ μμ μ΄ ν¬ν¨λ©λλ€. νμ± μ€μ μμ§μ μ½λ ꡬ쑰μ κ³μΈ΅μ ννμΈ μΆμ ꡬ문 νΈλ¦¬(AST)λ₯Ό μμ±ν©λλ€. μ΄ νΈλ¦¬λ νμ λ¨κ³μ νμμ μ λλ€.
2. νμΉ(Fetching)
λͺ¨λμ΄ νμ±λλ©΄ μμ§μ νμν λͺ¨λ νμΌ κ°μ Έμ€κΈ°λ₯Ό μμν©λλ€. μ΄λ ν΄λΉ μμΉμμ λͺ¨λ μμ€ μ½λλ₯Ό κ²μνλ κ²μ ν¬ν¨ν©λλ€. νμΉ κ³Όμ μ λ€νΈμν¬ μλ λ° μΊμ± λ©μ»€λμ¦ μ¬μ©κ³Ό κ°μ μμΈμ μν΄ μν₯μ λ°μ μ μμ΅λλ€. μ΄ λ¨κ³μμλ HTTP μμ²μ νμ©νμ¬ μλ²μμ λͺ¨λ μμ€ μ½λλ₯Ό κ²μν©λλ€. μ΅μ λΈλΌμ°μ λ νμΉμ μ΅μ ννκΈ° μν΄ μΊμ± λ° λ―Έλ¦¬ λ‘λμ κ°μ μ λ΅μ μμ£Ό μ¬μ©ν©λλ€.
3. μΈμ€ν΄μ€ν(Instantiation)
μΈμ€ν΄μ€ν μ€μ μμ§μ λͺ¨λ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. μ΄λ λͺ¨λμ λ³μ λ° ν¨μλ₯Ό μν μ μ₯ 곡κ°μ λ§λλ κ²μ ν¬ν¨ν©λλ€. μΈμ€ν΄μ€ν λ¨κ³λ λν λͺ¨λμ κ·Έ μμ‘΄μ±μ μ°κ²°νλ μμ λ ν¬ν¨ν©λλ€. μλ₯Ό λ€μ΄, λͺ¨λ Aκ° λͺ¨λ Bμ ν¨μλ₯Ό μν¬νΈνλ©΄ μμ§μ μ΄λ¬ν μμ‘΄μ±μ΄ μ¬λ°λ₯΄κ² ν΄κ²°λλλ‘ λ³΄μ₯ν©λλ€. μ΄λ λͺ¨λ νκ²½μ λ§λ€κ³ μμ‘΄μ±μ μ°κ²°ν©λλ€.
4. νκ°(Evaluation)
νκ° λ¨κ³λ λͺ¨λμ μ½λκ° μ€νλλ κ³³μ λλ€. μ¬κΈ°μλ μ΅μμ λ¬Έ μ€ν, ν¨μ μ€ν λ° λ³μ μ΄κΈ°νκ° ν¬ν¨λ©λλ€. νκ° μμλ λ§€μ° μ€μνλ©° λͺ¨λμ μμ‘΄μ± κ·Έλνμ μν΄ κ²°μ λ©λλ€. λͺ¨λ Aκ° λͺ¨λ Bλ₯Ό μν¬νΈνλ©΄ λͺ¨λ Bκ° λͺ¨λ Aλ³΄λ€ λ¨Όμ νκ°λ©λλ€. μμλ λν μμ‘΄μ± νΈλ¦¬μ μν΄ μν₯μ λ°μ μ¬λ°λ₯Έ μ€ν μμλ₯Ό 보μ₯ν©λλ€.
μ΄ λ¨κ³λ DOM μ‘°μκ³Ό κ°μ λΆμ ν¨κ³Όλ₯Ό ν¬ν¨νμ¬ λͺ¨λ μ½λλ₯Ό μ€ννκ³ λͺ¨λμ μ΅μ€ν¬νΈλ₯Ό μ±μλλ€.
λͺ¨λ λ‘λ©μ ν΅μ¬ κ°λ
μ μ μν¬νΈ vs. λμ μν¬νΈ
- μ μ μν¬νΈ(
importλ¬Έ): λͺ¨λμ μ΅μμ λ 벨μμ μ μΈλλ©° μ»΄νμΌ μμ μ ν΄κ²°λ©λλ€. μ΄λ λκΈ°μ μ΄λ―λ‘ λΈλΌμ°μ λ λ°νμμ κ³μ μ§ννκΈ° μ μ μν¬νΈλ λͺ¨λμ κ°μ Έμ μ²λ¦¬ν΄μΌ ν©λλ€. μ΄ μ κ·Ό λ°©μμ μΌλ°μ μΌλ‘ μ±λ₯μμ μ΄μ λλ¬Έμ μ νΈλ©λλ€. μμ:import { myFunction } from './myModule.js'; - λμ μν¬νΈ(
import()ν¨μ): λμ μν¬νΈλ λΉλκΈ°μ μ΄λ©° λ°νμμ νκ°λ©λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λμ μ§μ° λ‘λ©(lazy loading)ν μ μμ΄ μ΄κΈ° νμ΄μ§ λ‘λ μκ°μ κ°μ ν©λλ€. μ΄λ μ½λ μ€ν리ν λ° μ¬μ©μ μνΈμμ©μ΄λ 쑰건μ λ°λΌ λͺ¨λμ λ‘λνλ λ° νΉν μ μ©ν©λλ€. μμ:const module = await import('./myModule.js');
μ½λ μ€ν리ν (Code Splitting)
μ½λ μ€ν리ν μ μ ν리μΌμ΄μ μ½λλ₯Ό λ μμ μ²ν¬λ λ²λ€λ‘ λλλ κΈ°μ μ λλ€. μ΄λ₯Ό ν΅ν΄ λΈλΌμ°μ λ νΉμ νμ΄μ§λ κΈ°λ₯μ νμν μ½λλ§ λ‘λν μ μμ΄ μ΄κΈ° λ‘λ μκ°μ΄ λΉ¨λΌμ§κ³ μ λ°μ μΈ μ±λ₯μ΄ ν₯μλ©λλ€. μ½λ μ€ν리ν μ μ’ μ’ Webpackμ΄λ Parcelκ³Ό κ°μ λͺ¨λ λ²λ€λ¬μ μν΄ μ΄μ§λλ©° λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μμ λ§€μ° ν¨κ³Όμ μ λλ€. λμ μν¬νΈλ μ½λ μ€ν리ν μ μ΄μ§νλ λ° μ€μν©λλ€.
μμ‘΄μ± κ΄λ¦¬(Dependency Management)
ν¨κ³Όμ μΈ μμ‘΄μ± κ΄λ¦¬λ μ μ§λ³΄μμ±κ³Ό μ±λ₯μ νμμ μ λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
- μμ‘΄μ± μ΄ν΄: μ΄λ€ λͺ¨λμ΄ μλ‘ μμ‘΄νλμ§ μλ©΄ λ‘λ© μμλ₯Ό μ΅μ ννλ λ° λμμ΄ λ©λλ€.
- μν μμ‘΄μ± νΌνκΈ°: μν μμ‘΄μ±μ μκΈ°μΉ μμ λμκ³Ό μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€.
- λ²λ€λ¬ μ¬μ©: λͺ¨λ λ²λ€λ¬λ μμ‘΄μ± ν΄κ²° λ° μ΅μ νλ₯Ό μλνν©λλ€.
λͺ¨λ λ²λ€λ¬μ κ·Έ μν
λͺ¨λ λ²λ€λ¬λ μλ°μ€ν¬λ¦½νΈ λͺ¨λ λ‘λ© κ³Όμ μμ μ€μν μν μ ν©λλ€. λͺ¨λνλ μ½λμ κ·Έ μμ‘΄μ±, ꡬμ±μ κ°μ Έμ λΈλΌμ°μ κ° ν¨μ¨μ μΌλ‘ λ‘λν μ μλ μ΅μ νλ λ²λ€λ‘ λ³νν©λλ€. μΈκΈ° μλ λͺ¨λ λ²λ€λ¬λ λ€μκ³Ό κ°μ΅λλ€:
- Webpack: μ μ°μ±κ³Ό κ°λ ₯ν κΈ°λ₯μΌλ‘ μ μλ €μ§ λ§€μ° κ΅¬μ± κ°λ₯ν λ리 μ¬μ©λλ λ²λ€λ¬μ λλ€. Webpackμ λκ·λͺ¨ νλ‘μ νΈμμ κ΄λ²μνκ² μ¬μ©λλ©° κ΄λ²μν μ¬μ©μ μ μ μ΅μ μ μ 곡ν©λλ€.
- Parcel: λΉλ νλ‘μΈμ€λ₯Ό λ¨μννλ μ λ‘ κ΅¬μ± λ²λ€λ¬λ‘, λ§μ νλ‘μ νΈμ λΉ λ₯Έ μ€μ μ μ 곡ν©λλ€. Parcelμ νλ‘μ νΈλ₯Ό μ μνκ² μ€μ νλ λ° μ’μ΅λλ€.
- Rollup: λΌμ΄λΈλ¬λ¦¬ λ° μ ν리μΌμ΄μ λ²λ€λ§μ μ΅μ νλμ΄ μμΌλ©°, λ¦°(lean)ν λ²λ€μ μμ±νμ¬ λΌμ΄λΈλ¬λ¦¬ μμ±μ μ ν©ν©λλ€.
- Browserify: ES λͺ¨λμ΄ λ리 μ§μλλ©΄μ λ μΌλ°μ μ΄ λμμ§λ§, Browserifyλ λΈλΌμ°μ μμ CommonJS λͺ¨λμ μ¬μ©ν μ μκ² ν©λλ€.
λͺ¨λ λ²λ€λ¬λ λ€μκ³Ό κ°μ λ§μ μμ μ μλνν©λλ€:
- μμ‘΄μ± ν΄κ²°: λͺ¨λ μμ‘΄μ±μ μ°Ύμ ν΄κ²°ν©λλ€.
- μ½λ μΆμ(Minification): λΆνμν λ¬Έμλ₯Ό μ κ±°νμ¬ νμΌ ν¬κΈ°λ₯Ό μ€μ λλ€.
- μ½λ μ΅μ ν: λ°λ μ½λ μ κ±° λ° νΈλ¦¬ μμ΄νΉκ³Ό κ°μ μ΅μ νλ₯Ό μ μ©ν©λλ€.
- νΈλμ€νμΌλ§(Transpilation): μ΅μ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ΄μ λ²μ μΌλ‘ λ³ννμ¬ λ λμ λΈλΌμ°μ νΈνμ±μ ν보ν©λλ€.
- μ½λ μ€ν리ν : μ±λ₯ ν₯μμ μν΄ μ½λλ₯Ό λ μμ μ²ν¬λ‘ λλλλ€.
μ±λ₯μ μν λͺ¨λ λ‘λ© μ΅μ ν
λͺ¨λ λ‘λ©μ μ΅μ ννλ κ²μ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μ±λ₯μ ν₯μμν€λ λ° λ§€μ° μ€μν©λλ€. λ‘λ© μλλ₯Ό κ°μ νκΈ° μν΄ μ¬λ¬ κΈ°μ μ μ¬μ©ν μ μμ΅λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
1. κ°λ₯ν κ²½μ° μ μ μν¬νΈ μ¬μ©
μ μ μν¬νΈ(import λ¬Έ)λ λΈλΌμ°μ λ λ°νμμ΄ μ μ λΆμμ μννκ³ λ‘λ© νλ‘μΈμ€λ₯Ό μ΅μ νν μ μκ² ν©λλ€. μ΄λ νΉν μ€μν λͺ¨λμ κ²½μ° λμ μν¬νΈμ λΉν΄ ν₯μλ μ±λ₯μΌλ‘ μ΄μ΄μ§λλ€.
2. μ§μ° λ‘λ©μ μν΄ λμ μν¬νΈ νμ©
λμ μν¬νΈ(import())λ₯Ό μ¬μ©νμ¬ μ¦μ νμνμ§ μμ λͺ¨λμ μ§μ° λ‘λ©ν©λλ€. μ΄λ νΉμ νμ΄μ§μμλ§ νμνκ±°λ μ¬μ©μ μνΈμμ©μ μν΄ νΈλ¦¬κ±°λλ λͺ¨λμ νΉν μ μ©ν©λλ€. μμ: μ¬μ©μκ° λ²νΌμ ν΄λ¦ν λλ§ μ»΄ν¬λνΈλ₯Ό λ‘λ©ν©λλ€.
3. μ½λ μ€ν리ν ꡬν
λͺ¨λ λ²λ€λ¬λ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ μ λ μμ μ½λ μ²ν¬λ‘ λλκ³ , νμμ λ°λΌ λ‘λλλλ‘ ν©λλ€. μ΄λ μ΄κΈ° λ‘λ μκ°μ μ€μ΄κ³ μ λ°μ μΈ μ¬μ©μ κ²½νμ ν₯μμν΅λλ€. μ΄ κΈ°μ μ SPAμμ λ§€μ° ν¨κ³Όμ μ λλ€.
4. μ΄λ―Έμ§ λ° κΈ°ν μμ° μ΅μ ν
λͺ¨λ μ΄λ―Έμ§ λ° κΈ°ν μμ°μ΄ ν¬κΈ°μ λ§κ² μ΅μ νλκ³ ν¨μ¨μ μΈ νμμΌλ‘ μ 곡λλμ§ νμΈν©λλ€. μ΄λ―Έμ§ μ΅μ ν κΈ°μ κ³Ό μ΄λ―Έμ§ λ° λΉλμ€μ λν μ§μ° λ‘λ©μ μ¬μ©νλ©΄ μ΄κΈ° νμ΄μ§ λ‘λ μκ°μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
5. μΊμ± μ λ΅ μ¬μ©
μ μ ν μΊμ± μ λ΅μ ꡬννμ¬ λ³κ²½λμ§ μμ λͺ¨λμ λ€μ κ°μ Έμ¬ νμλ₯Ό μ€μ λλ€. μ μ ν μΊμ ν€λλ₯Ό μ€μ νμ¬ λΈλΌμ°μ κ° μΊμλ νμΌμ μ μ₯νκ³ μ¬μ¬μ©ν μ μλλ‘ ν©λλ€. μ΄λ μ μ μμ° λ° μμ£Ό μ¬μ©λλ λͺ¨λμ νΉν κ΄λ ¨μ΄ μμ΅λλ€.
6. ν리λ‘λ λ° ν리컀λ₯νΈ(Preload and Preconnect)
HTMLμμ <link rel="preload"> λ° <link rel="preconnect"> νκ·Έλ₯Ό μ¬μ©νμ¬ μ€μν λͺ¨λμ 미리 λ‘λνκ³ ν΄λΉ λͺ¨λμ νΈμ€ν
νλ μλ²μ λν μ‘°κΈ° μ°κ²°μ μ€μ ν©λλ€. μ΄ μ μ μ μΈ λ¨κ³λ λͺ¨λμ κ°μ Έμ€κ³ μ²λ¦¬νλ μλλ₯Ό ν₯μμν΅λλ€.
7. μμ‘΄μ± μ΅μν
νλ‘μ νΈμ μμ‘΄μ±μ μ μ€νκ² κ΄λ¦¬ν©λλ€. μ¬μ©νμ§ μλ λͺ¨λμ μ κ±°νκ³ λΆνμν μμ‘΄μ±μ νΌνμ¬ λ²λ€μ μ 체 ν¬κΈ°λ₯Ό μ€μ λλ€. μ€λλ μμ‘΄μ±μ μ κ±°νκΈ° μν΄ μ κΈ°μ μΌλ‘ νλ‘μ νΈλ₯Ό κ°μ¬νμΈμ.
8. μ¬λ°λ₯Έ λͺ¨λ λ²λ€λ¬ κ΅¬μ± μ ν
μ±λ₯μ μν΄ λΉλ νλ‘μΈμ€λ₯Ό μ΅μ ννλλ‘ λͺ¨λ λ²λ€λ¬λ₯Ό ꡬμ±ν©λλ€. μ¬κΈ°μλ μ½λ μΆμ, λ°λ μ½λ μ κ±° λ° μμ° λ‘λ© μ΅μ νκ° ν¬ν¨λ©λλ€. μ΅μ μ κ²°κ³Όλ₯Ό μν΄μλ μ μ ν ꡬμ±μ΄ ν΅μ¬μ λλ€.
9. μ±λ₯ λͺ¨λν°λ§
λΈλΌμ°μ κ°λ°μ λꡬ(μ: Chrome DevTools), Lighthouse λλ νμ¬ μλΉμ€μ κ°μ μ±λ₯ λͺ¨λν°λ§ λꡬλ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ μ λͺ¨λ λ‘λ© μ±λ₯μ λͺ¨λν°λ§νκ³ λ³λͺ© νμμ μλ³ν©λλ€. λ‘λ μκ°, λ²λ€ ν¬κΈ° λ° μ€ν μκ°μ μ κΈ°μ μΌλ‘ μΈ‘μ νμ¬ κ°μ ν λΆλΆμ μλ³ν©λλ€.
10. μλ² μ¬μ΄λ λ λλ§(SSR) κ³ λ €
λΉ λ₯Έ μ΄κΈ° λ‘λ μκ°κ³Ό SEO μ΅μ νκ° νμν μ ν리μΌμ΄μ μ κ²½μ° μλ² μ¬μ΄λ λ λλ§(SSR)μ κ³ λ €νμμμ€. SSRμ μλ²μμ μ΄κΈ° HTMLμ 미리 λ λλ§νμ¬ μ¬μ©μκ° μ½ν μΈ λ₯Ό λ 빨리 λ³Ό μ μκ² νκ³ , ν¬λ‘€λ¬μκ² μμ ν HTMLμ μ 곡νμ¬ SEOλ₯Ό κ°μ ν©λλ€. Next.js λ° Nuxt.jsμ κ°μ νλ μμν¬λ SSRμ μν΄ νΉλ³ν μ€κ³λμμ΅λλ€.
μ€μ©μ μΈ μμ : λͺ¨λ λ‘λ© μ΅μ ν
μμ 1: WebpackμΌλ‘ μ½λ μ€ν리ν
μ΄ μμ λ Webpackμ μ¬μ©νμ¬ μ½λλ₯Ό μ²ν¬λ‘ λΆν νλ λ°©λ²μ 보μ¬μ€λλ€:
// webpack.config.js
const path = require('path');
module.exports = {
entry: {
app: './src/index.js',
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
chunkFilename: '[name].chunk.js',
},
optimization: {
splitChunks: {
chunks: 'all',
},
},
};
μ μ½λμμλ Webpackμ ꡬμ±νμ¬ μ½λλ₯Ό λ€λ₯Έ μ²ν¬λ‘ λΆν νκ³ μμ΅λλ€. `splitChunks` ꡬμ±μ κ³΅ν΅ μμ‘΄μ±μ΄ λ³λμ νμΌλ‘ μΆμΆλλλ‘ λ³΄μ₯νμ¬ λ‘λ© μκ°μ κ°μ ν©λλ€.
μ΄μ μ½λ μ€ν리ν μ νμ©νλ €λ©΄ μ ν리μΌμ΄μ μ½λμμ λμ μν¬νΈλ₯Ό μ¬μ©νμΈμ.
// src/index.js
async function loadModule() {
const module = await import('./myModule.js');
module.myFunction();
}
document.getElementById('button').addEventListener('click', loadModule);
μ΄ μμ μμλ `import()`λ₯Ό μ¬μ©νμ¬ `myModule.js`λ₯Ό λΉλκΈ°μ μΌλ‘ λ‘λνκ³ μμ΅λλ€. μ¬μ©μκ° λ²νΌμ ν΄λ¦νλ©΄ `myModule.js`κ° λμ μΌλ‘ λ‘λλμ΄ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ μ€μ¬μ€λλ€.
μμ 2: μ€μν λͺ¨λ 미리 λ‘λνκΈ°
<link rel="preload"> νκ·Έλ₯Ό μ¬μ©νμ¬ μ€μν λͺ¨λμ 미리 λ‘λν©λλ€:
<head>
<link rel="preload" href="./myModule.js" as="script">
<!-- Other head elements -->
</head>
`myModule.js`λ₯Ό 미리 λ‘λν¨μΌλ‘μ¨, HTML νμκ° λͺ¨λμ μ°Έμ‘°νλ <script> νκ·Έλ₯Ό λ§λκΈ° μ μλ λΈλΌμ°μ μ μ€ν¬λ¦½νΈ λ€μ΄λ‘λλ₯Ό κ°λ₯ν ν 빨리 μμνλλ‘ μ§μν©λλ€. μ΄λ λͺ¨λμ΄ νμν λ μ€λΉλ κ°λ₯μ±μ λμ¬μ€λλ€.
μμ 3: λμ μν¬νΈλ‘ μ§μ° λ‘λ©
μ»΄ν¬λνΈ μ§μ° λ‘λ©:
// In a React component:
import React, { useState, Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
const [showComponent, setShowComponent] = useState(false);
return (
<div>
<button onClick={() => setShowComponent(true)}>Load Component</button>
{showComponent && (
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
)}
</div>
);
}
export default App;
μ΄ React μμ μμ `MyComponent`λ `React.lazy()`λ₯Ό μ¬μ©νμ¬ μ§μ° λ‘λ©λ©λλ€. μ¬μ©μκ° λ²νΌμ ν΄λ¦ν λλ§ λ‘λλ©λλ€. `Suspense` μ»΄ν¬λνΈλ λ‘λ© κ³Όμ λμ ν΄λ°±(fallback)μ μ 곡ν©λλ€.
λͺ¨λ² μ¬λ‘ λ° μ€ν κ°λ₯ν ν΅μ°°λ ₯
λ€μμ μλ°μ€ν¬λ¦½νΈ λͺ¨λ λ‘λ© λ° κ·Έ μλͺ μ£ΌκΈ°λ₯Ό λ§μ€ν°νκΈ° μν λͺ κ°μ§ μ€ν κ°λ₯ν ν΅μ°°λ ₯κ³Ό λͺ¨λ² μ¬λ‘μ λλ€:
- μ μ μν¬νΈλ‘ μμνκΈ°: ν΅μ¬ μμ‘΄μ± λ° μ¦μ νμν λͺ¨λμλ μ μ μν¬νΈλ₯Ό μ νΈνμΈμ.
- μ΅μ νλ₯Ό μν΄ λμ μν¬νΈ μμ©: μ€μνμ§ μμ μ½λλ₯Ό μ§μ° λ‘λ©νμ¬ λ‘λ© μκ°μ μ΅μ ννκΈ° μν΄ λμ μν¬νΈλ₯Ό νμ©νμΈμ.
- λͺ¨λ λ²λ€λ¬λ₯Ό νλͺ νκ² κ΅¬μ±νκΈ°: νλ‘λμ λΉλλ₯Ό μν΄ λͺ¨λ λ²λ€λ¬(Webpack, Parcel, Rollup)λ₯Ό μ μ νκ² κ΅¬μ±νμ¬ λ²λ€ ν¬κΈ°μ μ±λ₯μ μ΅μ ννμΈμ. μ¬κΈ°μλ μΆμ, νΈλ¦¬ μμ΄νΉ λ° κΈ°ν μ΅μ ν κΈ°μ μ΄ ν¬ν¨λ μ μμ΅λλ€.
- μ² μ νκ² ν μ€νΈνκΈ°: λͺ¨λ μ₯μΉμ νκ²½μμ μ΅μ μ μ±λ₯μ 보μ₯νκΈ° μν΄ λ€μν λΈλΌμ°μ μ λ€νΈμν¬ μ‘°κ±΄μμ λͺ¨λ λ‘λ©μ ν μ€νΈνμΈμ.
- μ κΈ°μ μΌλ‘ μμ‘΄μ± μ λ°μ΄νΈνκΈ°: μ±λ₯ ν₯μ, λ²κ·Έ μμ λ° λ³΄μ ν¨μΉμ μ΄μ μ λ리기 μν΄ μμ‘΄μ±μ μ΅μ μνλ‘ μ μ§νμΈμ. μμ‘΄μ± μ λ°μ΄νΈμλ μ’ μ’ λͺ¨λ λ‘λ© μ λ΅μ κ°μ μ΄ ν¬ν¨λ©λλ€.
- μ μ ν μ€λ₯ μ²λ¦¬ ꡬννκΈ°: λμ μν¬νΈλ₯Ό μ¬μ©ν λ λ°νμ μμΈλ₯Ό λ°©μ§νκ³ λ λμ μ¬μ©μ κ²½νμ μ 곡νκΈ° μν΄ try/catch λΈλ‘μ μ¬μ©νκ³ μ μ¬μ μΈ μ€λ₯λ₯Ό μ²λ¦¬νμΈμ.
- λͺ¨λν°λ§ λ° λΆμ: μ±λ₯ λͺ¨λν°λ§ λꡬλ₯Ό μ¬μ©νμ¬ λͺ¨λ λ‘λ© μκ°μ μΆμ νκ³ , λ³λͺ© νμμ μλ³νκ³ , μ΅μ ν λ Έλ ₯μ μν₯μ μΈ‘μ νμΈμ.
- μλ² κ΅¬μ± μ΅μ ν: μΉ μλ²λ₯Ό ꡬμ±νμ¬ μ μ ν μΊμ± ν€λμ μμΆ(μ: Gzip, Brotli)μΌλ‘ μλ°μ€ν¬λ¦½νΈ λͺ¨λμ μ¬λ°λ₯΄κ² μ 곡νλλ‘ νμΈμ. μ¬λ°λ₯Έ μλ² κ΅¬μ±μ λΉ λ₯Έ λͺ¨λ λ‘λ©μ λ§€μ° μ€μν©λλ€.
- μΉ μ컀(Web Workers) κ³ λ €: κ³μ° μ§μ½μ μΈ μμ μ κ²½μ°, λ©μΈ μ€λ λλ₯Ό μ°¨λ¨νμ§ μκ³ μλ΅μ±μ ν₯μμν€κΈ° μν΄ μΉ μ컀μ μ€νλ‘λνμΈμ. μ΄λ λͺ¨λ νκ°κ° UIμ λ―ΈμΉλ μν₯μ μ€μ¬μ€λλ€.
- λͺ¨λ°μΌμ μ΅μ ννκΈ°: λͺ¨λ°μΌ μ₯μΉλ μ’ μ’ λ€νΈμν¬ μ°κ²°μ΄ λ립λλ€. λ²λ€ ν¬κΈ° λ° μ°κ²° μλμ κ°μ μμλ₯Ό κ³ λ €νμ¬ λͺ¨λ λ‘λ© μ λ΅μ΄ λͺ¨λ°μΌ μ¬μ©μμ μ΅μ νλμλμ§ νμΈνμΈμ.
κ²°λ‘
μλ°μ€ν¬λ¦½νΈ λͺ¨λ λ‘λ© λ¨κ³μ μν¬νΈ μλͺ μ£ΌκΈ°λ₯Ό μ΄ν΄νλ κ²μ νλ μΉ κ°λ°μ λ§€μ° μ€μν©λλ€. νμ±, νμΉ, μΈμ€ν΄μ€ν, νκ°μ κ°μ λ¨κ³λ₯Ό νμ νκ³ ν¨κ³Όμ μΈ μ΅μ ν μ λ΅μ ꡬνν¨μΌλ‘μ¨ λ λΉ λ₯΄κ³ , ν¨μ¨μ μ΄λ©°, μ μ§λ³΄μνκΈ° μ¬μ΄ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€. λͺ¨λ λ²λ€λ¬, μ½λ μ€ν리ν , λμ μν¬νΈ, μ μ ν μΊμ± κΈ°μ κ³Ό κ°μ λꡬλ₯Ό νμ©νλ©΄ ν₯μλ μ¬μ©μ κ²½νκ³Ό λ λμ μ±λ₯μ μΉ μ ν리μΌμ΄μ μΌλ‘ μ΄μ΄μ§ κ²μ λλ€. λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ μ ν리μΌμ΄μ μ μ±λ₯μ μ§μμ μΌλ‘ λͺ¨λν°λ§ν¨μΌλ‘μ¨ μ μΈκ³ μ¬μ©μλ₯Ό μν΄ μλ°μ€ν¬λ¦½νΈ μ½λκ° λΉ λ₯΄κ³ ν¨μ¨μ μΌλ‘ λ‘λλλλ‘ λ³΄μ₯ν μ μμ΅λλ€.