ν¨μ¨μ μΈ μ½λ ꡬμ±, ν₯μλ μ±λ₯ λ° νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ μν κ³ κΈ JavaScript λͺ¨λ λ²λ€λ§ μ λ΅μ μ΄ν΄λ³΄μΈμ. Webpack, Rollup, Parcel λ±μ λν΄ μμ보μΈμ.
JavaScript λͺ¨λ λ²λ€λ§ μ λ΅: μ½λ κ΅¬μ± λ§μ€ν°νκΈ°
μ΅μ μΉ κ°λ°μμ JavaScript λͺ¨λ λ²λ€λ§μ μ½λλ₯Ό ꡬμ±νκ³ , μ±λ₯μ μ΅μ ννλ©°, μ’ μμ±μ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ λ° λ§€μ° μ€μν©λλ€. μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ¦κ°ν¨μ λ°λΌ μ μ μλ λͺ¨λ λ²λ€λ§ μ λ΅μ μ μ§ κ΄λ¦¬μ±, νμ₯μ± λ° μ λ°μ μΈ νλ‘μ νΈ μ±κ³΅μ νμμ μ λλ€. μ΄ κ°μ΄λμμλ Webpack, Rollup λ° Parcelκ³Ό κ°μ λ리 μ¬μ©λλ λꡬμ μ΅μ μ μ½λ ꡬμ±μ λ¬μ±νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό ν¬ν¨νμ¬ λ€μν JavaScript λͺ¨λ λ²λ€λ§ μ λ΅μ μ΄ν΄λ΄ λλ€.
λͺ¨λ λ²λ€λ§μ΄ νμν μ΄μ ?
νΉμ μ λ΅μ μ΄ν΄λ³΄κΈ° μ μ λͺ¨λ λ²λ€λ§μ μ΄μ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
- ν₯μλ μ½λ ꡬμ±: λͺ¨λ λ²λ€λ§μ λͺ¨λ ꡬ쑰λ₯Ό μ μ©νμ¬ λκ·λͺ¨ μ½λλ² μ΄μ€λ₯Ό κ΄λ¦¬νκ³ μ μ§ κ΄λ¦¬νκΈ° μ½κ² λ§λλλ€. μ΄λ κ΄μ¬μ¬μ λΆλ¦¬λ₯Ό μ΄μ§νκ³ κ°λ°μκ° κ²©λ¦¬λ κΈ°λ₯ λ¨μμμ μμ ν μ μλλ‘ ν©λλ€.
- μ’ μμ± κ΄λ¦¬: λ²λ€λ¬λ λͺ¨λ κ°μ μ’ μμ±μ μλμΌλ‘ νμΈνκ³ κ΄λ¦¬νλ―λ‘ μλ μ€ν¬λ¦½νΈ ν¬ν¨μ νμμ±μ μμ κ³ μΆ©λ μνμ μ€μ λλ€.
- μ±λ₯ μ΅μ ν: λ²λ€λ¬λ νμΌ μ°κ²°, μ½λ μΆμ, μ£½μ μ½λ μ κ±°(νΈλ¦¬ μμ΄νΉ) λ° μ½λ λΆν ꡬνμ ν΅ν΄ μ½λλ₯Ό μ΅μ νν©λλ€. μ΄λ HTTP μμ² μλ₯Ό μ€μ΄κ³ , νμΌ ν¬κΈ°λ₯Ό μ€μ΄λ©°, νμ΄μ§ λ‘λ μκ°μ κ°μ ν©λλ€.
- λΈλΌμ°μ νΈνμ±: λ²λ€λ¬λ μ΅μ JavaScript μ½λ(ES6+)λ₯Ό λΈλΌμ°μ νΈν μ½λ(ES5)λ‘ λ³ννμ¬ μ ν리μΌμ΄μ μ΄ κ΄λ²μν λΈλΌμ°μ μμ μλνλλ‘ ν μ μμ΅λλ€.
JavaScript λͺ¨λ μ΄ν΄
λͺ¨λ λ²λ€λ§μ JavaScript λͺ¨λμ κ°λ μ μ€μ¬μΌλ‘ μ΄λ£¨μ΄μ§λ©°, μ΄λ λ€λ₯Έ λͺ¨λμ νΉμ κΈ°λ₯μ λ ΈμΆνλ μ체 ν¬ν¨ μ½λ λ¨μμ λλ€. JavaScriptμμ μ¬μ©λλ μ£Όμ λͺ¨λ νμμ λ κ°μ§μ λλ€.
- ES λͺ¨λ(ESM): ES6μ λμ
λ νμ€ λͺ¨λ νμμ
λλ€. ES λͺ¨λμ μ’
μμ± κ΄λ¦¬λ₯Ό μν΄
import
λ°export
ν€μλλ₯Ό μ¬μ©ν©λλ€. μ΄λ μ΅μ λΈλΌμ°μ μμ κΈ°λ³Έμ μΌλ‘ μ§μλλ©° μλ‘μ΄ νλ‘μ νΈμ μ νΈλλ νμμ λλ€. - CommonJS(CJS): μ£Όλ‘ Node.jsμμ μ¬μ©λλ λͺ¨λ νμμ
λλ€. CommonJS λͺ¨λμ μ’
μμ± κ΄λ¦¬λ₯Ό μν΄
require
λ°module.exports
ν€μλλ₯Ό μ¬μ©ν©λλ€. λΈλΌμ°μ μμ κΈ°λ³Έμ μΌλ‘ μ§μλμ§λ μμ§λ§ λ²λ€λ¬λ CommonJS λͺ¨λμ λΈλΌμ°μ νΈν μ½λλ‘ λ³νν μ μμ΅λλ€.
μΈκΈ° μλ λͺ¨λ λ²λ€λ¬
Webpack
Webpackμ νλ‘ νΈμλ κ°λ°μ μ κ³ νμ€μ΄ λ κ°λ ₯νκ³ κ΅¬μ± κ°λ₯ν λͺ¨λ λ²λ€λ¬μ λλ€. λ€μμ ν¬ν¨ν κ΄λ²μν κΈ°λ₯μ μ§μν©λλ€.
- μ½λ λΆν : Webpackμ μ½λλ₯Ό λ μμ μ²ν¬λ‘ λΆν νμ¬ λΈλΌμ°μ κ° νΉμ νμ΄μ§ λλ κΈ°λ₯μ νμν μ½λλ§ λ‘λν μ μλλ‘ ν©λλ€. μ΄λ μ΄κΈ° λ‘λ μκ°μ ν¬κ² κ°μ ν©λλ€.
- λ‘λ: λ‘λλ₯Ό μ¬μ©νλ©΄ Webpackμ΄ CSS, μ΄λ―Έμ§ λ° κΈκΌ΄κ³Ό κ°μ λ€μν μ νμ νμΌμ μ²λ¦¬νκ³ μ΄λ₯Ό JavaScript λͺ¨λλ‘ λ³νν μ μμ΅λλ€.
- νλ¬κ·ΈμΈ: νλ¬κ·ΈμΈμ μΆμ, μ½λ μ΅μ ν λ° μμ° κ΄λ¦¬μ κ°μ κ΄λ²μν μ¬μ©μ μ§μ μ΅μ μ μ 곡νμ¬ Webpackμ κΈ°λ₯μ νμ₯ν©λλ€.
- Hot Module Replacement(HMR): HMRμ μ¬μ©νλ©΄ μ 체 νμ΄μ§λ₯Ό λ€μ λ‘λνμ§ μκ³ λ λΈλΌμ°μ μμ λͺ¨λμ μ λ°μ΄νΈν μ μμΌλ―λ‘ κ°λ° νλ‘μΈμ€ μλκ° ν¬κ² ν₯μλ©λλ€.
Webpack ꡬμ±
Webpackμ μ§μ
μ , μΆλ ₯ κ²½λ‘, λ‘λ, νλ¬κ·ΈμΈ λ° κΈ°ν μ΅μ
μ μ μνλ webpack.config.js
νμΌμ ν΅ν΄ ꡬμ±λ©λλ€. λ€μμ κΈ°λ³Έμ μΈ μμ
λλ€.
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
]
};
μ΄ κ΅¬μ±μ Webpackμ λ€μμ μ§μν©λλ€.
./src/index.js
λ₯Ό μ§μ μ μΌλ‘ μ¬μ©ν©λλ€.- λ²λ€λ§λ μ½λλ₯Ό
./dist/bundle.js
λ‘ μΆλ ₯ν©λλ€. babel-loader
λ₯Ό μ¬μ©νμ¬ JavaScript νμΌμ νΈλμ€νμΌν©λλ€.style-loader
λ°css-loader
λ₯Ό μ¬μ©νμ¬ CSS νμΌμ μ²λ¦¬ν©λλ€.HtmlWebpackPlugin
μ μ¬μ©νμ¬ λ²λ€λ§λ μ½λλ₯Ό ν¬ν¨νλ HTML νμΌμ μμ±ν©λλ€.
μμ : Webpackμ μ¬μ©ν μ½λ λΆν
μ½λ λΆν μ μ ν리μΌμ΄μ μ±λ₯μ κ°μ νκΈ° μν κ°λ ₯ν κΈ°μ μ λλ€. Webpackμ λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§ λ°©λ²μΌλ‘ μ½λ λΆν μ ꡬνν μ μμ΅λλ€.
- μ§μ μ : Webpack ꡬμ±μμ μ¬λ¬ μ§μ μ μ μ μν©λλ€. κ° μ§μ μ μ λ³λμ μ½λ μ²ν¬λ₯Ό λνλ λλ€.
- λμ κ°μ Έμ€κΈ°:
import()
ꡬ문μ μ¬μ©νμ¬ λͺ¨λμ μμ² μ λμ μΌλ‘ λ‘λν©λλ€. μ΄λ₯Ό ν΅ν΄ νμν λλ§ μ½λλ₯Ό λ‘λνμ¬ μ΄κΈ° λ‘λ μκ°μ μ€μΌ μ μμ΅λλ€. - SplitChunks νλ¬κ·ΈμΈ:
SplitChunksPlugin
μ κ³΅ν΅ λͺ¨λμ μλμΌλ‘ μλ³νκ³ λ³λμ μ²ν¬λ‘ μΆμΆνμ¬ μ¬λ¬ νμ΄μ§ λλ κΈ°λ₯μμ 곡μ ν μ μμ΅λλ€.
λ€μμ λμ κ°μ Έμ€κΈ°λ₯Ό μ¬μ©νλ μμ λλ€.
// κΈ°λ³Έ JavaScript νμΌμμ
const button = document.getElementById('my-button');
button.addEventListener('click', () => {
import('./my-module.js')
.then(module => {
module.default(); // my-module.jsμ κΈ°λ³Έ λ΄λ³΄λ΄κΈ°λ₯Ό νΈμΆν©λλ€.
})
.catch(err => {
console.error('λͺ¨λ λ‘λ μ€ν¨', err);
});
});
μ΄ μμμλ λ²νΌμ ν΄λ¦ν λλ§ my-module.js
κ° λ‘λλ©λλ€. μ΄λ μ ν리μΌμ΄μ
μ μ΄κΈ° λ‘λ μκ°μ ν¬κ² κ°μ ν μ μμ΅λλ€.
Rollup
Rollupμ λΌμ΄λΈλ¬λ¦¬ λ° νλ μμν¬λ₯Ό μν κ³ λλ‘ μ΅μ νλ λ²λ€μ μμ±νλ λ° μ€μ μ λ λͺ¨λ λ²λ€λ¬μ λλ€. μμ λ²λ€ ν¬κΈ°μ ν¨μ¨μ μΈ νΈλ¦¬ μμ΄νΉμ΄ νμν νλ‘μ νΈμ νΉν μ ν©ν©λλ€.
- νΈλ¦¬ μμ΄νΉ: Rollupμ λ²λ€μμ μ¬μ©λμ§ μλ μ½λλ₯Ό μ κ±°νλ νλ‘μΈμ€μΈ νΈλ¦¬ μμ΄νΉμ λ₯μν©λλ€. μ΄λ λ μκ³ ν¨μ¨μ μΈ λ²λ€μ μμ±ν©λλ€.
- ESM μ§μ: Rollupμ ES λͺ¨λμ νλ₯νκ² μ§μνλ―λ‘ μ΅μ JavaScript νλ‘μ νΈμ νμν μ νμ λλ€.
- νλ¬κ·ΈμΈ μνκ³: Rollupμλ κ΄λ²μν μ¬μ©μ μ§μ μ΅μ μ μ 곡νλ μ±μ₯νλ νλ¬κ·ΈμΈ μνκ³κ° μμ΅λλ€.
Rollup ꡬμ±
Rollupμ rollup.config.js
νμΌμ ν΅ν΄ ꡬμ±λ©λλ€. λ€μμ κΈ°λ³Έμ μΈ μμ
λλ€.
import babel from '@rollup/plugin-babel';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'umd',
name: 'MyLibrary'
},
plugins: [
resolve(),
commonjs(),
babel({
exclude: 'node_modules/**'
}),
terser()
]
};
μ΄ κ΅¬μ±μ Rollupμ λ€μμ μ§μν©λλ€.
./src/index.js
λ₯Ό μ§μ μ μΌλ‘ μ¬μ©ν©λλ€.- λ²λ€λ§λ μ½λλ₯Ό UMD νμμΌλ‘
./dist/bundle.js
λ‘ μΆλ ₯ν©λλ€. @rollup/plugin-node-resolve
λ₯Ό μ¬μ©νμ¬ Node.js λͺ¨λμ νμΈν©λλ€.@rollup/plugin-commonjs
λ₯Ό μ¬μ©νμ¬ CommonJS λͺ¨λμ ES λͺ¨λλ‘ λ³νν©λλ€.@rollup/plugin-babel
λ₯Ό μ¬μ©νμ¬ JavaScript νμΌμ νΈλμ€νμΌν©λλ€.rollup-plugin-terser
λ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό μΆμν©λλ€.
μμ : Rollupμ μ¬μ©ν νΈλ¦¬ μμ΄νΉ
νΈλ¦¬ μμ΄νΉμ μ€λͺ νκΈ° μν΄ λ€μ μλ₯Ό κ³ λ €ν΄ λ³΄κ² μ΅λλ€.
// src/utils.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
// src/index.js
import { add } from './utils.js';
console.log(add(2, 3));
μ΄ μμμλ index.js
μμ add
ν¨μλ§ μ¬μ©λ©λλ€. Rollupμ μ΅μ’
λ²λ€μμ subtract
ν¨μλ₯Ό μλμΌλ‘ μ κ±°νμ¬ λ²λ€ ν¬κΈ°λ₯Ό μ€μ
λλ€.
Parcel
Parcelμ μνν κ°λ° κ²½νμ μ 곡νλ κ²μ λͺ©νλ‘ νλ μ λ‘ κ΅¬μ± λͺ¨λ λ²λ€λ¬μ λλ€. λλΆλΆμ μ€μ μ μλμΌλ‘ κ°μ§νκ³ κ΅¬μ±νλ―λ‘ μ€μ κ·λͺ¨ νλ‘μ νΈμ μ ν©ν©λλ€.
- μ λ‘ κ΅¬μ±: Parcelμ μ΅μνμ ꡬμ±μ΄ νμνλ―λ‘ μ½κ² μμν μ μμ΅λλ€.
- μλ λ³ν: Parcelμ μλ κ΅¬μ± μμ΄λ Babel, PostCSS λ° κΈ°ν λꡬλ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό μλμΌλ‘ λ³νν©λλ€.
- λΉ λ₯Έ λΉλ μκ°: Parcelμ λ³λ ¬ μ²λ¦¬ κΈ°λ₯ λλΆμ λΉ λ₯Έ λΉλ μκ°μΌλ‘ μ λͺ ν©λλ€.
Parcel μ¬μ©λ²
Parcelμ μ¬μ©νλ €λ©΄ μ μ λλ λ‘μ»¬λ‘ μ€μΉν λ€μ μ§μ
μ μΌλ‘ parcel
λͺ
λ Ήμ μ€ννκΈ°λ§ νλ©΄ λ©λλ€.
npm install -g parcel
parcel src/index.html
Parcelμ μ½λλ₯Ό μλμΌλ‘ λ²λ€λ§νκ³ λ‘컬 κ°λ° μλ²μμ μ 곡ν©λλ€. λν λ³κ²½ν λλ§λ€ μ½λλ₯Ό μλμΌλ‘ λ€μ λΉλν©λλ€.
μ¬λ°λ₯Έ λ²λ€λ¬ μ ν
λͺ¨λ λ²λ€λ¬μ μ νμ νλ‘μ νΈμ νΉμ μꡬ μ¬νμ λ°λΌ λ¬λΌμ§λλ€.
- Webpack: μ½λ λΆν , λ‘λ λ° νλ¬κ·ΈμΈκ³Ό κ°μ κ³ κΈ κΈ°λ₯μ΄ νμν 볡μ‘ν μ ν리μΌμ΄μ μ κ°μ₯ μ ν©ν©λλ€. κ΅¬μ± κ°λ₯μ±μ΄ λμ§λ§ μ€μ μ΄ λ μ΄λ €μΈ μ μμ΅λλ€.
- Rollup: μμ λ²λ€ ν¬κΈ°μ ν¨μ¨μ μΈ νΈλ¦¬ μμ΄νΉμ΄ νμν λΌμ΄λΈλ¬λ¦¬ λ° νλ μμν¬μ κ°μ₯ μ ν©ν©λλ€. ꡬμ±μ΄ λΉκ΅μ κ°λ¨νκ³ κ³ λλ‘ μ΅μ νλ λ²λ€μ μμ±ν©λλ€.
- Parcel: μ΅μνμ ꡬμ±κ³Ό λΉ λ₯Έ λΉλ μκ°μ΄ νμν μ€μ κ·λͺ¨ νλ‘μ νΈμ κ°μ₯ μ ν©ν©λλ€. μ¬μ©νκΈ° μ½κ³ μνν κ°λ° κ²½νμ μ 곡ν©λλ€.
μ½λ ꡬμ±μ μν λͺ¨λ² μ¬λ‘
μ ννλ λͺ¨λ λ²λ€λ¬μ κ΄κ³μμ΄ μ½λ ꡬμ±μ μν μ΄λ¬ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ μ μ§ κ΄λ¦¬ κ°λ₯νκ³ νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ λ§λλ λ° λμμ΄ λ©λλ€.
- λͺ¨λμ μ€κ³: μ ν리μΌμ΄μ μ λͺ νν μ± μμ΄ μλ μκ³ μ체 ν¬ν¨λ λͺ¨λλ‘ λλλλ€.
- λ¨μΌ μ± μ μμΉ: κ° λͺ¨λμλ λ¨μΌνκ³ μ μ μλ λͺ©μ μ΄ μμ΄μΌ ν©λλ€.
- μ’ μμ± μ£Όμ : μ’ μμ± μ£Όμ μ μ¬μ©νμ¬ λͺ¨λ κ°μ μ’ μμ±μ κ΄λ¦¬νμ¬ μ½λλ₯Ό λ μ½κ² ν μ€νΈνκ³ μ μ°νκ² λ§λ€ μ μμ΅λλ€.
- λͺ νν λͺ λͺ κ·μΉ: λͺ¨λ, ν¨μ λ° λ³μμ λν΄ λͺ ννκ³ μΌκ΄λ λͺ λͺ κ·μΉμ μ¬μ©ν©λλ€.
- μ€λͺ μ: λ€λ₯Έ μ¬λ(λ° μμ )μ΄ μ΄ν΄νκΈ° μ½λλ‘ μ½λλ₯Ό μ² μ ν λ¬Έμνν©λλ€.
κ³ κΈ μ λ΅
λμ κ°μ Έμ€κΈ° λ° μ§μ° λ‘λ©
λμ κ°μ Έμ€κΈ° λ° μ§μ° λ‘λ©μ μ ν리μΌμ΄μ μ±λ₯μ κ°μ νκΈ° μν κ°λ ₯ν κΈ°μ μ λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λ μ½λλ₯Ό 미리 λ‘λνλ λμ μμ² μ λͺ¨λμ λ‘λν μ μμ΅λλ€. μ΄λ νΉν λκ·λͺ¨ μ ν리μΌμ΄μ μ κ²½μ° μ΄κΈ° λ‘λ μκ°μ ν¬κ² μ€μΌ μ μμ΅λλ€.
λμ κ°μ Έμ€κΈ°λ Webpack, Rollup λ° Parcelμ ν¬ν¨ν λͺ¨λ μ£Όμ λͺ¨λ λ²λ€λ¬μμ μ§μλ©λλ€.
κ²½λ‘ κΈ°λ° μ²ν¬λ₯Ό μ¬μ©ν μ½λ λΆν
λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μ κ²½μ° μ½λ λΆν μ μ¬μ©νμ¬ μ½λλ₯Ό μλ‘ λ€λ₯Έ κ²½λ‘ λλ νμ΄μ§μ ν΄λΉνλ μ²ν¬λ‘ λΆν ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λΈλΌμ°μ λ νμ¬ νμ΄μ§μ νμν μ½λλ§ λ‘λνμ¬ μ΄κΈ° λ‘λ μκ°κ³Ό μ λ°μ μΈ μ±λ₯μ κ°μ ν μ μμ΅λλ€.
Webpackμ SplitChunksPlugin
μ κ²½λ‘ κΈ°λ° μ²ν¬λ₯Ό μλμΌλ‘ μμ±νλλ‘ κ΅¬μ±ν μ μμ΅λλ€.
λͺ¨λ νλλ μ΄μ μ¬μ©(Webpack 5)
λͺ¨λ νλλ μ΄μ μ Webpack 5μ λμ λ κ°λ ₯ν κΈ°λ₯μΌλ‘, λ°νμμ μλ‘ λ€λ₯Έ μ ν리μΌμ΄μ κ°μ μ½λλ₯Ό 곡μ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ 립μ μΈ ν λλ μ‘°μ§μμ ꡬμ±ν μ μλ λͺ¨λμ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.
λͺ¨λ νλλ μ΄μ μ λ§μ΄ν¬λ‘ νλ‘ νΈμλ μν€ν μ²μ νΉν μ μ©ν©λλ€.
κ΅μ ν(i18n) κ³ λ € μ¬ν
μ μΈκ³ μ¬μ©μλ₯Ό λμμΌλ‘ μ ν리μΌμ΄μ μ ꡬμΆν λλ κ΅μ ν(i18n)λ₯Ό κ³ λ €νλ κ²μ΄ μ€μν©λλ€. μ¬κΈ°μλ μ ν리μΌμ΄μ μ λ€μν μΈμ΄, λ¬Έν λ° μ§μμ λ§κ² μ‘°μ νλ κ²μ΄ ν¬ν¨λ©λλ€. λͺ¨λ λ²λ€λ§ 컨ν μ€νΈμμ i18nμ λν λͺ κ°μ§ κ³ λ € μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
- λ³λμ μΈμ΄ νμΌ: μ ν리μΌμ΄μ μ ν μ€νΈλ₯Ό λ³λμ μΈμ΄ νμΌ(μ: JSON νμΌ)μ μ μ₯ν©λλ€. μ΄λ κ² νλ©΄ λ²μμ κ΄λ¦¬νκ³ μΈμ΄ κ°μ μ ννκΈ°κ° λ μ¬μμ§λλ€.
- μΈμ΄ νμΌμ λμ λ‘λ©: λμ κ°μ Έμ€κΈ°λ₯Ό μ¬μ©νμ¬ μ¬μ©μ λ‘μΊμ λ°λΌ μμ² μ μΈμ΄ νμΌμ λ‘λν©λλ€. μ΄λ κ² νλ©΄ μ΄κΈ° λ‘λ μκ°μ΄ μ€μ΄λ€κ³ μ±λ₯μ΄ ν₯μλ©λλ€.
- i18n λΌμ΄λΈλ¬λ¦¬:
i18next
λλreact-intl
κ³Ό κ°μ i18n λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ κ΅μ ν νλ‘μΈμ€λ₯Ό κ°μννλ κ²μ κ³ λ €νμμμ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ 볡μν, λ μ§ νμ μ§μ λ° ν΅ν νμ μ§μ κ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€.
μμ : μΈμ΄ νμΌμ λμ λ‘λ©
// en.json, es.json, fr.jsonκ³Ό κ°μ μΈμ΄ νμΌμ΄ μλ€κ³ κ°μ ν©λλ€.
const locale = navigator.language || navigator.userLanguage; // μ¬μ©μ λ‘μΊ κ°μ Έμ€κΈ°
import(`./locales/${locale}.json`)
.then(translation => {
// λ²μ κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ¬λ°λ₯Έ μΈμ΄λ‘ ν
μ€νΈλ₯Ό νμν©λλ€.
document.getElementById('greeting').textContent = translation.greeting;
})
.catch(error => {
console.error('λ²μ λ‘λ μ€ν¨:', error);
// κΈ°λ³Έ μΈμ΄λ‘ λ체
});
κ²°λ‘
JavaScript λͺ¨λ λ²λ€λ§μ μ΅μ μΉ κ°λ°μ νμμ μΈ λΆλΆμ λλ€. λ€μν λͺ¨λ λ²λ€λ§ μ λ΅κ³Ό μ½λ ꡬμ±μ μν λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄ν¨μΌλ‘μ¨ μ μ§ κ΄λ¦¬ κ°λ₯νκ³ νμ₯ κ°λ₯νλ©° μ±λ₯μ΄ λ°μ΄λ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€. Webpack, Rollup λλ Parcelμ μ ννλ λͺ¨λμ μ€κ³, μ’ μμ± κ΄λ¦¬ λ° μ±λ₯ μ΅μ νμ μ°μ μμλ₯Ό λλ κ²μ μμ§ λ§μμμ€. νλ‘μ νΈκ° μ±μ₯ν¨μ λ°λΌ λͺ¨λ λ²λ€λ§ μ λ΅μ μ§μμ μΌλ‘ νκ°νκ³ κ°μ νμ¬ μ ν리μΌμ΄μ μ μ§ννλ μꡬ μ¬νμ μΆ©μ‘±νλμ§ νμΈνμμμ€.