Webpack, Rollup, Parcelκ³Ό κ°μ μΈκΈ° λΉλ μμ€ν μ νμ₯νκΈ° μν κ΅¬μ± κΈ°λ²κ³Ό λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ³ , νλ‘ νΈμλ λΉλ λꡬ νλ¬κ·ΈμΈμ μν€ν μ²λ₯Ό νμν©λλ€.
νλ‘ νΈμλ λΉλ μμ€ν νλ¬κ·ΈμΈ ꡬμ±: λΉλ λꡬ νμ₯ μν€ν μ²
λμμμ΄ μ§ννλ νλ‘ νΈμλ κ°λ° νκ²½μμ λΉλ μμ€ν μ κ°λ° νλ‘μΈμ€λ₯Ό μ΅μ ννκ³ κ°μννλ λ° μ€μν μν μ ν©λλ€. Webpack, Rollup, Parcelκ³Ό κ°μ μ΄λ¬ν μμ€ν μ λ²λ€λ§, νΈλμ€νμΌλ§, μ΅μν, μ΅μ νμ κ°μ μμ μ μλνν©λλ€. μ΄λ¬ν λΉλ λꡬμ ν΅μ¬ κΈ°λ₯μ νλ¬κ·ΈμΈμ ν΅ν νμ₯μ±μΌλ‘, κ°λ°μκ° νΉμ νλ‘μ νΈ μꡬ μ¬νμ λ§κ² λΉλ νλ‘μΈμ€λ₯Ό μ‘°μ ν μ μλλ‘ ν©λλ€. μ΄ κΈμμλ νλ‘ νΈμλ λΉλ λꡬ νλ¬κ·ΈμΈμ μν€ν μ²λ₯Ό κΉμ΄ νκ³ λ€μ΄, λ€μν κ΅¬μ± κΈ°λ²κ³Ό μ΄λ¬ν μμ€ν μ νμ₯νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό νμν©λλ€.
νλ‘ νΈμλ κ°λ°μμ λΉλ μμ€ν μ μν μ΄ν΄νκΈ°
νλ‘ νΈμλ λΉλ μμ€ν μ νλ μΉ κ°λ° μν¬νλ‘μ°μ νμμ μ λλ€. λ€μκ³Ό κ°μ μ¬λ¬ κ³Όμ λ₯Ό ν΄κ²°ν©λλ€:
- λͺ¨λ λ²λ€λ§: μ¬λ¬ μλ°μ€ν¬λ¦½νΈ, CSS λ° κΈ°ν μμ° νμΌμ λΈλΌμ°μ μμ ν¨μ¨μ μΌλ‘ λ‘λνκΈ° μν΄ λ μ μ μμ λ²λ€λ‘ κ²°ν©ν©λλ€.
- νΈλμ€νμΌλ§: μ΅μ μλ°μ€ν¬λ¦½νΈ(ES6+) λλ νμ μ€ν¬λ¦½νΈ μ½λλ₯Ό λΈλΌμ°μ μ νΈνλλ μλ°μ€ν¬λ¦½νΈ(ES5)λ‘ λ³νν©λλ€.
- μ΅μν λ° μ΅μ ν: 곡백 μ κ±°, λ³μ μ΄λ¦ λ¨μΆ λ° κΈ°ν μ΅μ ν κΈ°λ²μ μ μ©νμ¬ μ½λμ μμ°μ ν¬κΈ°λ₯Ό μ€μ λλ€.
- μμ° κ΄λ¦¬: μ΄λ―Έμ§ μ΅μ ν λ° μΊμ 무ν¨νλ₯Ό μν νμΌ ν΄μ±κ³Ό κ°μ μμ μ ν¬ν¨νμ¬ μ΄λ―Έμ§, κΈκΌ΄ λ° κΈ°ν μ μ μμ°μ μ²λ¦¬ν©λλ€.
- μ½λ λΆν : μ ν리μΌμ΄μ μ½λλ₯Ό νμμ λ°λΌ λ‘λν μ μλ λ μμ μ²ν¬λ‘ λλμ΄ μ΄κΈ° λ‘λ μκ°μ κ°μ ν©λλ€.
- ν« λͺ¨λ κ΅μ²΄(HMR): κ°λ° μ€ μ 체 νμ΄μ§λ₯Ό μλ‘κ³ μΉ¨ν νμ μμ΄ λΈλΌμ°μ μμ μ€μκ° μ λ°μ΄νΈλ₯Ό νμ±νν©λλ€.
μΈκΈ° μλ λΉλ μμ€ν μ λ€μκ³Ό κ°μ΅λλ€:
- Webpack: κ΄λ²μν νλ¬κ·ΈμΈ μνκ³λ‘ μ λͺ ν, κ³ λλ‘ μ€μ κ°λ₯νκ³ λ€μ¬λ€λ₯ν λ²λ€λ¬μ λλ€.
- Rollup: μ£Όλ‘ λΌμ΄λΈλ¬λ¦¬ λ° νΈλ¦¬ μμ΄νΉ κΈ°λ₯μ΄ μλ λ μμ λ²λ€μ λ§λλ λ° μ€μ μ λ λͺ¨λ λ²λ€λ¬μ λλ€.
- Parcel: κ°λ¨νκ³ μ§κ΄μ μΈ κ°λ° κ²½νμ μ 곡νλ κ²μ λͺ©νλ‘ νλ μ λ‘ κ΅¬μ±(zero-configuration) λ²λ€λ¬μ λλ€.
- esbuild: Goλ‘ μμ±λ λ§€μ° λΉ λ₯Έ μλ°μ€ν¬λ¦½νΈ λ²λ€λ¬ λ° μ΅μν λꡬμ λλ€.
νλ‘ νΈμλ λΉλ μμ€ν μ νλ¬κ·ΈμΈ μν€ν μ²
νλ‘ νΈμλ λΉλ μμ€ν μ κ°λ°μκ° κΈ°λ₯μ νμ₯ν μ μλλ‘ νλ¬κ·ΈμΈ μν€ν μ²λ‘ μ€κ³λμμ΅λλ€. νλ¬κ·ΈμΈμ λΉλ νλ‘μΈμ€μ μ°κ²°λμ΄ νΉμ λͺ©μ μ λ°λΌ μ΄λ₯Ό μμ νλ λ 립μ μΈ λͺ¨λμ λλ€. μ΄λ¬ν λͺ¨λμ±μ ν΅ν΄ κ°λ°μλ ν΅μ¬ μ½λλ₯Ό μμ νμ§ μκ³ λ λΉλ μμ€ν μ μ¬μ©μ μ μν μ μμ΅λλ€.
νλ¬κ·ΈμΈμ μΌλ°μ μΈ κ΅¬μ‘°λ λ€μκ³Ό κ°μ΅λλ€:
- νλ¬κ·ΈμΈ λ±λ‘: νλ¬κ·ΈμΈμ μΌλ°μ μΌλ‘ λΉλ μμ€ν μ κ΅¬μ± νμΌμ ν΅ν΄ λΉλ μμ€ν μ λ±λ‘λ©λλ€.
- λΉλ μ΄λ²€νΈ ννΉ: νλ¬κ·ΈμΈμ λΉλ νλ‘μΈμ€ μ€ νΉμ μ΄λ²€νΈλ ν μ ꡬλ ν©λλ€.
- λΉλ νλ‘μΈμ€ μμ : ꡬλ ν μ΄λ²€νΈκ° νΈλ¦¬κ±°λλ©΄ νλ¬κ·ΈμΈμ μ½λλ₯Ό μ€ννμ¬ νμμ λ°λΌ λΉλ νλ‘μΈμ€λ₯Ό μμ ν©λλ€. μ¬κΈ°μλ νμΌ λ³ν, μ μμ° μΆκ° λλ λΉλ κ΅¬μ± μμ μ΄ ν¬ν¨λ μ μμ΅λλ€.
Webpack νλ¬κ·ΈμΈ μν€ν μ²
Webpackμ νλ¬κ·ΈμΈ μν€ν
μ²λ Compilerμ Compilation κ°μ²΄λ₯Ό κΈ°λ°μΌλ‘ ν©λλ€. Compilerλ μ 체 λΉλ νλ‘μΈμ€λ₯Ό λνλ΄κ³ , Compilationμ μ ν리μΌμ΄μ
μ λ¨μΌ λΉλλ₯Ό λνλ
λλ€. νλ¬κ·ΈμΈμ μ΄λ€μ΄ λ
ΈμΆνλ λ€μν ν
μ μ°κ²°νμ¬ μ΄λ¬ν κ°μ²΄μ μνΈ μμ©ν©λλ€.
μ£Όμ Webpack ν μ λ€μκ³Ό κ°μ΅λλ€:
environment: Webpack νκ²½μ΄ μ€μ λ λ νΈμΆλ©λλ€.afterEnvironment: Webpack νκ²½μ΄ μ€μ λ ν νΈμΆλ©λλ€.entryOption: μνΈλ¦¬ μ΅μ μ΄ μ²λ¦¬λ λ νΈμΆλ©λλ€.beforeRun: λΉλ νλ‘μΈμ€κ° μμλκΈ° μ μ νΈμΆλ©λλ€.run: λΉλ νλ‘μΈμ€κ° μμλ λ νΈμΆλ©λλ€.compilation: μ μ»΄νμΌλ μ΄μ μ΄ μμ±λ λ νΈμΆλ©λλ€.make: μ»΄νμΌλ μ΄μ κ³Όμ μμ λͺ¨λμ μμ±νκΈ° μν΄ νΈμΆλ©λλ€.optimize: μ΅μ ν λ¨κ³μμ νΈμΆλ©λλ€.emit: Webpackμ΄ μ΅μ’ μμ°μ λ΄λ³΄λ΄κΈ° μ μ νΈμΆλ©λλ€.afterEmit: Webpackμ΄ μ΅μ’ μμ°μ λ΄λ³΄λΈ ν νΈμΆλ©λλ€.done: λΉλ νλ‘μΈμ€κ° μλ£λμμ λ νΈμΆλ©λλ€.failed: λΉλ νλ‘μΈμ€κ° μ€ν¨νμ λ νΈμΆλ©λλ€.
κ°λ¨ν Webpack νλ¬κ·ΈμΈμ λ€μκ³Ό κ°μ μ μμ΅λλ€:
class MyWebpackPlugin {
apply(compiler) {
compiler.hooks.emit.tapAsync('MyWebpackPlugin', (compilation, callback) => {
// μ¬κΈ°μμ compilation κ°μ²΄λ₯Ό μμ ν©λλ€
console.log('μμ
μ΄ κ³§ μΆλ ₯λ κ²μ
λλ€!');
callback();
});
}
}
module.exports = MyWebpackPlugin;
Rollup νλ¬κ·ΈμΈ μν€ν μ²
Rollupμ νλ¬κ·ΈμΈ μν€ν μ²λ νλ¬κ·ΈμΈμ΄ ꡬνν μ μλ μΌλ ¨μ λΌμ΄νμ¬μ΄ν΄ ν μ κΈ°λ°μΌλ‘ ν©λλ€. μ΄λ¬ν ν μ ν΅ν΄ νλ¬κ·ΈμΈμ λ€μν λ¨κ³μμ λΉλ νλ‘μΈμ€λ₯Ό κ°λ‘μ±κ³ μμ ν μ μμ΅λλ€.
μ£Όμ Rollup ν μ λ€μκ³Ό κ°μ΅λλ€:
options: Rollupμ΄ λΉλ νλ‘μΈμ€λ₯Ό μμνκΈ° μ μ νΈμΆλμ΄ νλ¬κ·ΈμΈμ΄ Rollup μ΅μ μ μμ ν μ μλλ‘ ν©λλ€.buildStart: Rollupμ΄ λΉλ νλ‘μΈμ€λ₯Ό μμν λ νΈμΆλ©λλ€.resolveId: κ° import λ¬Έμ λν΄ λͺ¨λ IDλ₯Ό νμΈνκΈ° μν΄ νΈμΆλ©λλ€.load: λͺ¨λ μ½ν μΈ λ₯Ό λ‘λνκΈ° μν΄ νΈμΆλ©λλ€.transform: λͺ¨λ μ½ν μΈ λ₯Ό λ³ννκΈ° μν΄ νΈμΆλ©λλ€.buildEnd: λΉλ νλ‘μΈμ€κ° λλ λ νΈμΆλ©λλ€.generateBundle: Rollupμ΄ μ΅μ’ λ²λ€μ μμ±νκΈ° μ μ νΈμΆλ©λλ€.writeBundle: Rollupμ΄ μ΅μ’ λ²λ€μ μμ±ν ν νΈμΆλ©λλ€.
κ°λ¨ν Rollup νλ¬κ·ΈμΈμ λ€μκ³Ό κ°μ μ μμ΅λλ€:
function myRollupPlugin() {
return {
name: 'my-rollup-plugin',
transform(code, id) {
// μ¬κΈ°μμ μ½λλ₯Ό μμ ν©λλ€
console.log(`${id} λ³ν μ€`);
return code;
}
};
}
export default myRollupPlugin;
Parcel νλ¬κ·ΈμΈ μν€ν μ²
Parcelμ νλ¬κ·ΈμΈ μν€ν μ²λ νΈλμ€ν¬λ¨Έ, 리쑸λ², ν¨ν€μ λ₯Ό κΈ°λ°μΌλ‘ ν©λλ€. νΈλμ€ν¬λ¨Έλ κ°λ³ νμΌμ λ³ννκ³ , 리쑸λ²λ λͺ¨λ μ’ μμ±μ ν΄κ²°νλ©°, ν¨ν€μ λ λ³νλ νμΌμ λ²λ€λ‘ κ²°ν©ν©λλ€.
Parcel νλ¬κ·ΈμΈμ μΌλ°μ μΌλ‘ λ±λ‘ ν¨μλ₯Ό λ΄λ³΄λ΄λ Node.js λͺ¨λλ‘ μμ±λ©λλ€. μ΄ ν¨μλ Parcelμ μν΄ νΈμΆλμ΄ νλ¬κ·ΈμΈμ νΈλμ€ν¬λ¨Έ, 리쑸λ², ν¨ν€μ λ₯Ό λ±λ‘ν©λλ€.
κ°λ¨ν Parcel νλ¬κ·ΈμΈμ λ€μκ³Ό κ°μ μ μμ΅λλ€:
module.exports = function (bundler) {
bundler.addTransformer('...', async function (asset) {
// μ¬κΈ°μμ μμ
μ λ³νν©λλ€
console.log(`${asset.filePath} λ³ν μ€`);
asset.setCode(asset.getCode());
});
};
νλ¬κ·ΈμΈ κ΅¬μ± κΈ°λ²
νλ¬κ·ΈμΈ ꡬμ±μ μ¬λ¬ νλ¬κ·ΈμΈμ κ²°ν©νμ¬ λ 볡μ‘ν λΉλ νλ‘μΈμ€λ₯Ό λ¬μ±νλ κ²μ ν¬ν¨ν©λλ€. νλ¬κ·ΈμΈμ ꡬμ±νλ λ°λ λ€μκ³Ό κ°μ μ¬λ¬ κΈ°λ²μ΄ μμ΅λλ€:
- μμ°¨μ ꡬμ±: νλ¬κ·ΈμΈμ νΉμ μμλ‘ μ μ©νλ©°, ν νλ¬κ·ΈμΈμ μΆλ ₯μ΄ λ€μ νλ¬κ·ΈμΈμ μ λ ₯μ΄ λ©λλ€.
- λ³λ ¬ ꡬμ±: νλ¬κ·ΈμΈμ λμμ μ μ©νλ©°, κ° νλ¬κ·ΈμΈμ λμΌν μ λ ₯μ λν΄ λ 립μ μΌλ‘ μλν©λλ€.
- μ‘°κ±΄λΆ κ΅¬μ±: νκ²½μ΄λ νμΌ μ νκ³Ό κ°μ νΉμ 쑰건μ λ°λΌ νλ¬κ·ΈμΈμ μ μ©ν©λλ€.
- νλ¬κ·ΈμΈ ν©ν 리: νλ¬κ·ΈμΈμ λ°ννλ ν¨μλ₯Ό λ§λ€μ΄ λμ κ΅¬μ± λ° μ¬μ©μ μ μλ₯Ό κ°λ₯νκ² ν©λλ€.
μμ°¨μ ꡬμ±
μμ°¨μ ꡬμ±μ κ°μ₯ κ°λ¨ν ννμ νλ¬κ·ΈμΈ ꡬμ±μ λλ€. νλ¬κ·ΈμΈμ νΉμ μμλ‘ μ μ©λλ©°, κ° νλ¬κ·ΈμΈμ μΆλ ₯μ λ€μ νλ¬κ·ΈμΈμ μ λ ₯μΌλ‘ μ λ¬λ©λλ€. μ΄ κΈ°λ²μ λ³ν νμ΄νλΌμΈμ λ§λλ λ° μ μ©ν©λλ€.
μλ₯Ό λ€μ΄, νμ μ€ν¬λ¦½νΈ μ½λλ₯Ό νΈλμ€νμΌνκ³ , μ΅μνν λ€μ, λ°°λ μ£Όμμ μΆκ°νλ €λ μλ리μ€λ₯Ό μκ°ν΄ 보μμμ€. μΈ κ°μ κ°λ³ νλ¬κ·ΈμΈμ μ¬μ©ν μ μμ΅λλ€:
typescript-plugin: νμ μ€ν¬λ¦½νΈ μ½λλ₯Ό μλ°μ€ν¬λ¦½νΈλ‘ νΈλμ€νμΌν©λλ€.terser-plugin: μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ΅μνν©λλ€.banner-plugin: νμΌ μλ¨μ λ°°λ μ£Όμμ μΆκ°ν©λλ€.
μ΄λ¬ν νλ¬κ·ΈμΈμ μμλλ‘ μ μ©νλ©΄ μνλ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
// webpack.config.js
module.exports = {
//...
plugins: [
new TypeScriptPlugin(),
new TerserPlugin(),
new BannerPlugin('// μ μκΆ 2023')
]
};
λ³λ ¬ ꡬμ±
λ³λ ¬ ꡬμ±μ νλ¬κ·ΈμΈμ λμμ μ μ©νλ κ²μ ν¬ν¨ν©λλ€. μ΄ κΈ°λ²μ νλ¬κ·ΈμΈμ΄ λμΌν μ λ ₯μ λν΄ λ 립μ μΌλ‘ μλνκ³ μλ‘μ μΆλ ₯μ μμ‘΄νμ§ μμ λ μ μ©ν©λλ€.
μλ₯Ό λ€μ΄, μ¬λ¬ μ΄λ―Έμ§ μ΅μ ν νλ¬κ·ΈμΈμ μ¬μ©νμ¬ μ΄λ―Έμ§λ₯Ό μ΅μ ννλ €λ μλ리μ€λ₯Ό μκ°ν΄ 보μμμ€. λ κ°μ κ°λ³ νλ¬κ·ΈμΈμ μ¬μ©ν μ μμ΅λλ€:
imagemin-pngquant: pngquantλ₯Ό μ¬μ©νμ¬ PNG μ΄λ―Έμ§λ₯Ό μ΅μ νν©λλ€.imagemin-jpegtran: jpegtranμ μ¬μ©νμ¬ JPEG μ΄λ―Έμ§λ₯Ό μ΅μ νν©λλ€.
μ΄λ¬ν νλ¬κ·ΈμΈμ λ³λ ¬λ‘ μ μ©νλ©΄ PNGμ JPEG μ΄λ―Έμ§λ₯Ό λμμ μ΅μ νν μ μμ΅λλ€.
Webpack μ체λ λ³λ ¬ νλ¬κ·ΈμΈ μ€νμ μ§μ μ§μνμ§ μμ§λ§, μ컀 μ€λ λλ μμ νλ‘μΈμ€μ κ°μ κΈ°μ μ μ¬μ©νμ¬ νλ¬κ·ΈμΈμ λμμ μ€νν¨μΌλ‘μ¨ μ μ¬ν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. μΌλΆ νλ¬κ·ΈμΈμ λ΄λΆμ μΌλ‘ μμ μ μμμ μΌλ‘ λ³λ ¬ μννλλ‘ μ€κ³λμμ΅λλ€.
μ‘°κ±΄λΆ κ΅¬μ±
μ‘°κ±΄λΆ κ΅¬μ±μ νΉμ 쑰건μ λ°λΌ νλ¬κ·ΈμΈμ μ μ©νλ κ²μ ν¬ν¨ν©λλ€. μ΄ κΈ°λ²μ λ€λ₯Έ νκ²½μμ λ€λ₯Έ νλ¬κ·ΈμΈμ μ μ©νκ±°λ νΉμ νμΌμλ§ νλ¬κ·ΈμΈμ μ μ©ν λ μ μ©ν©λλ€.
μλ₯Ό λ€μ΄, ν μ€νΈ νκ²½μμλ§ μ½λ 컀λ²λ¦¬μ§ νλ¬κ·ΈμΈμ μ μ©νλ €λ μλ리μ€λ₯Ό μκ°ν΄ 보μμμ€.
// webpack.config.js
module.exports = {
//...
plugins: [
...(process.env.NODE_ENV === 'test' ? [new CodeCoveragePlugin()] : [])
]
};
μ΄ μμ μμ CodeCoveragePluginμ NODE_ENV νκ²½ λ³μκ° testλ‘ μ€μ λ κ²½μ°μλ§ μ μ©λ©λλ€.
νλ¬κ·ΈμΈ ν©ν 리
νλ¬κ·ΈμΈ ν©ν 리λ νλ¬κ·ΈμΈμ λ°ννλ ν¨μμ λλ€. μ΄ κΈ°λ²μ νλ¬κ·ΈμΈμ λμ κ΅¬μ± λ° μ¬μ©μ μ μλ₯Ό κ°λ₯νκ² ν©λλ€. νλ¬κ·ΈμΈ ν©ν 리λ νλ‘μ νΈμ ꡬμ±μ λ°λΌ λ€λ₯Έ μ΅μ μ κ°μ§ νλ¬κ·ΈμΈμ λ§λλ λ° μ¬μ©ν μ μμ΅λλ€.
function createMyPlugin(options) {
return {
apply: (compiler) => {
compiler.hooks.emit.tapAsync('MyPlugin', (compilation, callback) => {
// μ¬κΈ°μμ μ΅μ
μ μ¬μ©ν©λλ€
console.log(`μ΅μ
μ¬μ©: ${options.message}`);
callback();
});
}
};
}
// webpack.config.js
module.exports = {
//...
plugins: [
createMyPlugin({ message: 'μλ
νμΈμ μΈμ' })
]
};
μ΄ μμ μμ createMyPlugin ν¨μλ μ½μμ λ©μμ§λ₯Ό κΈ°λ‘νλ νλ¬κ·ΈμΈμ λ°νν©λλ€. λ©μμ§λ options λ§€κ°λ³μλ₯Ό ν΅ν΄ ꡬμ±ν μ μμ΅λλ€.
νλ¬κ·ΈμΈμΌλ‘ νλ‘ νΈμλ λΉλ μμ€ν μ νμ₯νκΈ° μν λͺ¨λ² μ¬λ‘
νλ¬κ·ΈμΈμΌλ‘ νλ‘ νΈμλ λΉλ μμ€ν μ νμ₯ν λλ νλ¬κ·ΈμΈμ΄ μ μ€κ³λκ³ , μ μ§λ³΄μ κ°λ₯νλ©°, μ±λ₯μ΄ μ’λλ‘ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ κ²μ΄ μ€μν©λλ€.
- νλ¬κ·ΈμΈμ μ§μ€λ κΈ°λ₯μ κ°μ ΈμΌ ν©λλ€: κ° νλ¬κ·ΈμΈμ λ¨μΌνκ³ μ μ μλ μ± μμ κ°μ ΈμΌ ν©λλ€. λ무 λ§μ κ²μ νλ €λ νλ¬κ·ΈμΈμ λ§λ€μ§ λ§μμμ€.
- λͺ ννκ³ μ€λͺ μ μΈ μ΄λ¦μ μ¬μ©νμμμ€: νλ¬κ·ΈμΈ μ΄λ¦μ κ·Έ λͺ©μ μ λͺ ννκ² λνλ΄μΌ ν©λλ€. μ΄λ λ€λ₯Έ κ°λ°μκ° νλ¬κ·ΈμΈμ΄ νλ μΌμ λ μ½κ² μ΄ν΄νλλ‘ λ§λλλ€.
- κ΅¬μ± μ΅μ μ μ 곡νμμμ€: νλ¬κ·ΈμΈμ μ¬μ©μκ° λμμ μ¬μ©μ μ μν μ μλλ‘ κ΅¬μ± μ΅μ μ μ 곡ν΄μΌ ν©λλ€.
- μ€λ₯λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νμμμ€: νλ¬κ·ΈμΈμ μ€λ₯λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νκ³ μ μ©ν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν΄μΌ ν©λλ€.
- λ¨μ ν μ€νΈλ₯Ό μμ±νμμμ€: νλ¬κ·ΈμΈμ μ¬λ°λ₯΄κ² μλνλμ§ νμΈνκ³ νκ·λ₯Ό λ°©μ§νκΈ° μν΄ ν¬κ΄μ μΈ λ¨μ ν μ€νΈλ₯Ό κ°μ ΈμΌ ν©λλ€.
- νλ¬κ·ΈμΈμ λ¬Έμννμμμ€: νλ¬κ·ΈμΈμ μ€μΉ, κ΅¬μ± λ° μ¬μ© λ°©λ²μ λν λͺ νν μ§μΉ¨μ ν¬ν¨νμ¬ μ λ¬Έμνλμ΄μΌ ν©λλ€.
- μ±λ₯μ κ³ λ €νμμμ€: νλ¬κ·ΈμΈμ λΉλ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€. λΉλ μκ°μ λ―ΈμΉλ μν₯μ μ΅μννλλ‘ νλ¬κ·ΈμΈμ μ΅μ ννμμμ€. λΆνμν κ³μ°μ΄λ νμΌ μμ€ν μμ μ νΌνμμμ€.
- λΉλ μμ€ν μ APIλ₯Ό λ°λ₯΄μμμ€: λΉλ μμ€ν μ APIμ κ·μΉμ μ€μνμμμ€. μ΄λ νλ¬κ·ΈμΈμ΄ λΉλ μμ€ν μ ν₯ν λ²μ κ³Ό νΈνλλλ‘ λ³΄μ₯ν©λλ€.
- κ΅μ ν(i18n) λ° νμ§ν(l10n)λ₯Ό κ³ λ €νμμμ€: νλ¬κ·ΈμΈμ΄ λ©μμ§λ ν μ€νΈλ₯Ό νμνλ κ²½μ°, μ¬λ¬ μΈμ΄λ₯Ό μ§μνλλ‘ i18n/l10nμ μΌλμ λκ³ μ€κ³ν΄μΌ ν©λλ€. μ΄λ νΉν μ μΈκ³ μ¬μ©μλ₯Ό λμμΌλ‘ νλ νλ¬κ·ΈμΈμ μ€μν©λλ€.
- 보μ κ³ λ € μ¬ν: μΈλΆ 리μμ€λ μ¬μ©μ μ λ ₯μ μ²λ¦¬νλ νλ¬κ·ΈμΈμ λ§λ€ λλ μ μ¬μ μΈ λ³΄μ μ·¨μ½μ μ μ μνμμμ€. ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS)μ΄λ μ격 μ½λ μ€νκ³Ό κ°μ 곡격μ λ°©μ§νκΈ° μν΄ μ λ ₯μ μ΄κ· νκ³ μΆλ ₯μ κ²μ¦νμμμ€.
μΈκΈ° μλ λΉλ μμ€ν νλ¬κ·ΈμΈ μμ
Webpack, Rollup, Parcelκ³Ό κ°μ μΈκΈ° μλ λΉλ μμ€ν μλ μλ§μ νλ¬κ·ΈμΈμ΄ μμ΅λλ€. λͺ κ°μ§ μλ λ€μκ³Ό κ°μ΅λλ€:
- Webpack:
html-webpack-plugin: Webpack λ²λ€μ ν¬ν¨νλ HTML νμΌμ μμ±ν©λλ€.mini-css-extract-plugin: CSSλ₯Ό λ³λ νμΌλ‘ μΆμΆν©λλ€.terser-webpack-plugin: Terserλ₯Ό μ¬μ©νμ¬ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ΅μνν©λλ€.copy-webpack-plugin: νμΌκ³Ό λλ ν 리λ₯Ό λΉλ λλ ν λ¦¬λ‘ λ³΅μ¬ν©λλ€.eslint-webpack-plugin: ESLintλ₯Ό Webpack λΉλ νλ‘μΈμ€μ ν΅ν©ν©λλ€.
- Rollup:
@rollup/plugin-node-resolve: Node.js λͺ¨λμ ν΄μν©λλ€.@rollup/plugin-commonjs: CommonJS λͺ¨λμ ES λͺ¨λλ‘ λ³νν©λλ€.rollup-plugin-terser: Terserλ₯Ό μ¬μ©νμ¬ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ΅μνν©λλ€.rollup-plugin-postcss: PostCSSλ‘ CSS νμΌμ μ²λ¦¬ν©λλ€.rollup-plugin-babel: Babelλ‘ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό νΈλμ€νμΌν©λλ€.
- Parcel:
@parcel/transformer-sass: Sass νμΌμ CSSλ‘ λ³νν©λλ€.@parcel/transformer-typescript: νμ μ€ν¬λ¦½νΈ νμΌμ μλ°μ€ν¬λ¦½νΈλ‘ λ³νν©λλ€.- λ§μ ν΅μ¬ νΈλμ€ν¬λ¨Έκ° λ΄μ₯λμ΄ μμ΄ μ¬λ¬ κ²½μ°μ λ³λμ νλ¬κ·ΈμΈμ΄ νμνμ§ μμ΅λλ€.
κ²°λ‘
νλ‘ νΈμλ λΉλ μμ€ν νλ¬κ·ΈμΈμ λΉλ νλ‘μΈμ€λ₯Ό νμ₯νκ³ μ¬μ©μ μ μνλ κ°λ ₯ν λ©μ»€λμ¦μ μ 곡ν©λλ€. κ°λ°μλ λ€μν λΉλ μμ€ν μ νλ¬κ·ΈμΈ μν€ν μ²λ₯Ό μ΄ν΄νκ³ ν¨κ³Όμ μΈ κ΅¬μ± κΈ°λ²μ μ¬μ©ν¨μΌλ‘μ¨ νΉμ νλ‘μ νΈ μꡬ μ¬νμ μΆ©μ‘±νλ κ³ λλ‘ λ§μΆ€νλ λΉλ μν¬νλ‘μ°λ₯Ό λ§λ€ μ μμ΅λλ€. νλ¬κ·ΈμΈ κ°λ°μ μν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ νλ¬κ·ΈμΈμ΄ μ μ€κ³λκ³ , μ μ§λ³΄μ κ°λ₯νλ©°, μ±λ₯μ΄ μ’μμ Έ λ ν¨μ¨μ μ΄κ³ μ λ’°ν μ μλ νλ‘ νΈμλ κ°λ° νλ‘μΈμ€μ κΈ°μ¬ν©λλ€. νλ‘ νΈμλ μνκ³κ° κ³μ μ§νν¨μ λ°λΌ, νλ¬κ·ΈμΈμΌλ‘ λΉλ μμ€ν μ ν¨κ³Όμ μΌλ‘ νμ₯νλ λ₯λ ₯μ μ μΈκ³ νλ‘ νΈμλ κ°λ°μμκ² κ³μν΄μ μ€μν κΈ°μ λ‘ λ¨μ κ²μ λλ€.