js application을 위한 정적 모듈 번들러이다.
여러 모듈 및 의존성을 갖는 프로젝트 파일들을 하나 또는 여러 개의 번들로 묶어서 최적화된 형태로 만들어준다.
ex) babel을 사용하여 ES6+ 코드를 ES5로 변환하는 등
프로그램을 구성하는 독립적인 구성 요소로,
특정 기능이나 작업을 수행하기 위한 코드와 데이터 조각을 나타낸다.
ES6 이후부터 import
, export
키워트를 사용하여 모듈을 정의하고 사용할 수 있게 되었다.
전역스코프가 오염이 되면 application이 예측할 수 없게 되고 ,
런타임 에러가 발생하게 된다.
이를 방지하고자 웹팩이 필요하다.
이러한 문제를 해결하기 위해서 여러가지 방식의 모듈이 추가 되었다.
정의되자마자 즉시 실행되는 함수다.
함수 내부에 독립적인 스코프가 생성이 된다.
내부에서 정의된 것은 외부에서 접근할 수 없기 때문에, 전역 스코프 오염을 막아준다.
(function () {
statements
})()
자바스클비트를 사용하는 모든 환경에서 모듈을 하는 것이 목표다.
exports
: 모듈 생성
require
: 불러 들이는 방식
대표적으로 Nodejs에서 사용한다.
비동기로 로딩되는 환경에서 모듈을 사용하는 것이 목표다.
외부에서 자바스크립트를 로딩해야되는 브라우저 환경에서 주로 사용된다.
AMD와 CommonJS 방식 모두 지원해주는 스펙
ES2015에서 표준 모듈 시스템을 내 놓았다.
지금은 바벨과 웹팩을 이용해 표준 모듈 시스템을 사용하는것이 일반적이다.
export function sum(a,b) { return a + b };
import * as math from './math.js';
math.sum(1,2)//3
export 구문으로 모듈을 만들고, import 구문으로 가져올 수 있다.
모든 브라우저에서 무관하게 모듈을 사용하고 싶을 때 웹팩을 사용한다.
웹팩은 여러개 파일을 하나의 파일로 합쳐주는 번들러다.
하나로 합쳐진 파일을 번들
이라고 한다.
웹팩을 실행할 때 필수적인 옵션 세개
--mode
--entry
--output
웹팩의 기본 설정을 정의해 놓는 파일 webpack.config.js
//node의 모듈 시스템
const path = require('path');
module.exports = {
mode : 'development',
entry : {
main : './src/app.js'
}
output :{
path :path.resolve('./dist'), // output directory 절대경로
filename: '[name].js' // 번들링 된 파일명 , 여기서는 엔트리에서 설정한 key값, main이라는 값으로 치환 됨
}
위와같이 filename
을 정의하는 이유는,
엔트리가 여러개일 경우에 아웃풋도 여러개 존재해야 한다.
그 때 아웃풋의 이름을 동적으로 만들어 낼 수 있는 효과가 인다.
웹팩은 모든 파일을 모듈로 바라본다.
JS로 만든 모듈 뿐만 아니라, CSS, image, font까지 전부 다 모듈로 처리한다.
es6에 import 키워드를 사용하면 이 모듈을 자바스크립트 코드안으로 가져와서 사용할 수 있다.
이게 가능한 이유는 웹팩에 로더가 있기 때문이다.
로더는 함수 형태로 작성한다
로더가 그 파일을 읽고 읽은 내용이 인자로 들어옴
// loader를 적용할 파일들의 패턴과 적용할 loader를 설정하는 부분
module: {
rules: [
{
test: /\.js$/, // loader가 처리해야 될 파일들의 패턴을 입력 js로 끝나는 모든 파일은 loader가 처리하겠다는 의미
use: [path.resolve('./my-webpack.loader.js')]
// 사용할 loader를 명시, 여기서는 my-webpack.loader.js를 사용하겠다는 의미
// 모든 자바스크립트 파일을 my-webpack.loader.js가 실행되게 끔 설정
}
]
}
javscript에서 css파일을 모듈로 불러올 수 있다.
로더를 이용해 css파일을 모듈로 바꿔보자.
import './app.css'
// app.css
body {
background-color : green;
}
// webpack.config.js
// <install> css-loader
module: {
rules: [
{
test: /\.css$/,
use: ['css-loader']
}
]
}
js로 변경된 style 코드를 html에 넣어주는 로더
css 코드를 모듈로 사용하고 웹팩으로 번들링 하려면 css-loader
, style-loader
두가지를 함께 사용해야 한다.
로더는 한 파일에 대해서 여러 개가 실행되는데 순서는 뒤에서 부터 앞으로 실행 된다
module: {
rules: [
{
test: /\.css$/,
use: ['css-loader' , 'style-loader'] // 순서가 중요함
}
]
}
css뿐 아니라 파일도 모듈로 사용하게 끔 만들 수 있다.
파일을 모듈 형태로 지원하고 웹팩 아웃풋에 파일을 옮겨주는 것을 file-loader
가 해준다.
// npm install file-loader
// webpack.js
module : {
[
{
test: /\.png$/,
loader : 'file-loader',
options : {
publicPath : './dist/', // prefix를 아웃풋 경로로 지정
name: '[name].[ext]?[hash]' // [원본파일].[확장자]?[캐쉬무력화를 위해 매번 달라지는 해쉬값] 파일명 형식
}
}
]
}
이미지를 Base64로 인코딩하여 문자열 형태로 소스코드에 넣는 형식
url-loader는 이러한 처리를 자동화 해준다.
data-uri-scheme
"data:image/png;base64,~~"
url로더가 파일들을 처리할 때, limit에 기재되어있는 사이즈의 미만의
파일만 변환한다.
이상으로 될 때는, (따로 정의해놓은) 파일로더가 실행된다.
{
test: /\.png$/,
use: {
loader: 'url-loader', // url 로더를 설정한다
options: {
publicPath: './dist/', // file-loader와 동일
name: '[name].[ext]?[hash]', // file-loader와 동일
limit: 5000 // 5kb 미만 파일만 data url로 처리
}
}
}
css-loader
css파일을 css module처럼 사용할 수 있또록 css파일을 처리하는 로더
style-loader
css-loader를 통해 처리 된 javascript 문자열로 되어있는 style sheet코드를 html에 주입시켜 브라우저에 스타일이 적용되도록 하는 역할
file-loader
이미지 파일을 모듈로 사용할 수 있도록 변환하는 역할, 사용한 파일을 output폴더에 이동하는 역할
url-loader
base64로 인코딩해서 javascript 문자열로 변환
웹팩과 바벨에대해 좀 더 명확하게 알고 싶어서 강의를 들으면서
내용들을 정리해 봤다.
모듈이 정확히 어떤 것을 뜻하고,
웹팩은 어떤일을 하는지 어떻게 처리되는지 진행 과정을 알아보면서 번들링이 무엇을 뜻하는지 자세히 알게 되었다.
모듈은 프로그램을 구성하는 독립적인 요소,
웹팩은 여러 모듈을 로더를 이용해 ,
최적화 된 형태의 하나의 파일로 번들링하는 것!