IE의 ES6 지원율은 약 11%이다. 이에 따라 구형 브라우저에서 문제 없이 동작시키기 위한 개발 환경을 구축하는 것이 필요하다. 또한 대부분의 프로젝트가 모듈을 사용하므로 모듈 로더가 필요하다. ESM에서 대부분 지원하나 구형 브라우저는 지원하지 않으며 ESM을 사용해도 트랜스파일링이나 번들링이 필요하기 때문에 아직은 별도의 모듈 로더를 사용한다.
의존 관게에 있는 자바스크립트, css, 이미지 등의 리소스를 하나의 파일로 번들링하는 모듈 번들러이다. 별도의 모듈 로더가 필요없기 때문에 여러 개의 자바스크립트 파일을 로드해야 하는 번거로움이 사라진다.
npm i -D webpack webpack-cli webpack-dev-server@next
cli는 명령어를 의미하며 마지막 패키지는 개발 특화 페이지로 즉각적으로 새로고침이 가능하게 해준다.
"scripts": {
"dev":"webpack-dev-server --mode development",
"bulid": "webpack --mode production"
}
npm run dev
와npm run build
시 webpack을 실행할 수 있다.
// webpack.config.js
const path = require('path')
module.exports = {
// 파일을 읽기 위한 진입점 설정
entry:'./js/main.js',
// 번들을 반환하는 설정
output: {
path: path.resolve(__dirname,'dist'), // 절대경로여야 한다. 그에 따라 require('path') 모듈을 가져와서 사용한다. __dirname은 현재 경로를 의미한다. 그리고 'dist'(기본설정)라는 폴더에서
filename:'main.js', // // 해당 파일로 내어준다.
clean: true // 루트 변경 시 기존 파일 삭제 여부
}
}
npm run build
시 main.js파일의 내용이 'dist'폴더에 번들러되어 추가된다.
npm i -D html-webpack-plugin
// webpack.config.js
const HtmlPlugin = require('html-webpack-plugin')
plugins: [ // enrty에서 output하는 과정에서 plugin을 사용한다.
new HtmlPlugin({
template: './index.html' // 템플릿으로 해당 파일을 사용한다.
})
]
devServer:{
host: 'localhost'
}
npm run dev
시 index.html파일을 dev 경로로 해서 오픈할 수 있다.
<!--index.html 폴더에 연결한다. 이때 html파일과 static 폴더안에 파일 역시 dist 폴더에 추가되므로 static 경로를 생략하여 작성할 수가 있다.-->
<img src="./logo.png">
npm i -D copy-webpack-plugin
const CopyPlugin = require('copy-webpack-plugin')
plugins: [
new CopyPlugin({
patterns: [
{ from : 'static'}
]
})
]
npm run dev
시 static 폴더 안에 요소들이 run dev시 자동으로 dist 폴더로 연결된다.
npm i -D css-loader style-loader
module: {
rules:[
{
test: /\.css$/, // css로 끝나는 확장자를 가진 파일
use: [
'style-loader',
'css-loader'
]
}
]
}
// js/main.js
import '../css/main.css'
npm run dev
시 css 파일을 연결할 수 있음.
// js/main.js
import '../scss/main.scss';
npm i -D sass-loader sass
module: {
rules:[
{
test: /\.s?css$/, // css로 끝나는 확장자를 가진 파일
use: [
'style-loader',
'css-loader',
'sass-loader'
]
}
]
}
npm run dev
시 scss 파일을 실시간으로 적용할 수 있다.
npm i -D postcss autoprefixer postcss-loader
module: {
rules:[
{
test: /\.s?css$/, // css로 끝나는 확장자를 가진 파일
use: [
'style-loader',
'css-loader',
'postcss-loader', // 순서가 중요하다.
'sass-loader'
]
}
]
}
"browserslist": [
"> 1%", // 1% 이상의 브라우저에서
"last 2 version" // 마지막 2개의 버전 지원
]
// .postcssrc.js
module.exports = {
plugins:[
require('autoprefixer')
]
}
npm run dev
시 자동으로 브라우저 접두사가 붙는다.
npm i @babel/core @babel/preset-env @babel/plugin-transform-runtime
// .babelrc.js
module.exports = {
presets : ['@babel/preset-env'],
plugins : [
['@babel/plugin-transform-runtime']
]
}
npm i -D babel-loader
module: {
rules:[
{
test: /\.js$/,
use: [
'babel-loader'
]
}
]
}
babel 설치가 완료되었다.