⚠️이 글은 밑에 명시한 참고자료를 정리 및 요약한 글입니다.
webpack은 모던 Javascript 애플리케이션을 위한 정적 모듈 번들러이다. webpack이 애플리케이션을 처리할때, 내부적으로는 프로젝트에 필요한 모든 모듈을 매핑하고 하나 이상의 번들을 생성하는 디펜던시 그래프를 만든다.
개발하는 애플리케이션의 크기가 커지면 언젠간 파일을 여러 개로 분리해야 하는 시점이 온다. 이때 분리된 파일 각각을 ‘모듈 (module)’이라고 부른다.
스크립트의 크기가 점차 커지고, 기능도 복자해지자 자바스크립트 커뮤니티는 특별한 라이브러리를 만들어 필요한 모듈을 언제든 불러올 수 있게 해준다거나 코드를 모듈 단위로 구성해 주는 방법을 만드는 등 다양한 시도를 하게 된다.
```jsx
//hello.js
let name = "john";
//user.js
alert(name);
//index.html
<!doctype html>
<script type="module" src="user.js"></script>
<script type="module" src="hello.js"></script>
-> error -> name is not defined
```
외부에 공개하려면 모듈은 export 해야 하고, 내보내진 모듈을 가져와 사용하려면 import 해줘야 한다. //name.js
export let name = "john";
//hello.js
import {name} from './name.js';
document.body.innerHTML = name; // john
//index.html
<!doctype html>
<script type = "module" src = "hello.js">
</script>
브라우저 환경에서도 <script type = "module">
을 사용해 모듈을 만들면 독립적인 스코프가 만들어진다. // 📁 1.js
import {admin} from './admin.js';
admin.name = "Pete";
// 📁 2.js
import {admin} from './admin.js';
alert(admin.name); // Pete
// 1.js와 2.js 모두 같은 객체를 가져오므로
// 1.js에서 객체에 가한 조작을 2.js에서도 확인할 수 있습니다.
-> 모듈은 한 번만 실행되고 모듈은 필요한 곳에 공유되므로 어느 한 모듈에서 admin 객체를 수정하면 다른 모듈에서도 변경사항을 확인할 수 있다.
브라우저 환경에서 모듈을 ‘단독’으로 사용하는 경우는 흔치 않다. 대게 웹팩과 같은 특별한 툴을 사용해 모듈을 한 데 묶어 프로덕션 서버에 올리는 방식을 사용한다.
번들러를 사용하면 모듈 분해를 통제할 수 있다. 여기에 더하여 경로가 없는 모듈이나 css, html 포멧의 모듈을 사용할 수 있게 해준다는 장점이 또 있다.
빌트 툴의 역할은 아래와 같다.
<script type=’module’>
에 넣을 ‘주요’ 모듈(entry)을 선택한다. 번들링 툴을 사용하면 스크립트들은 하나 혹은 여러 개의 파일로 번들링된다. 이때 번들링 전 스크립트에 있던 import, export 문은 특별한 번들러 함수로 대체된다. 번들링 과정이 끝나면 기본 스크립트에서 import, export가 사라지기 때문에 type = “module ”이 필요없어진다. 따라서 아래와 같이 번들링 과정을 거친 스크립트는 일반 스크립트처럼 취급할 수 있다.
module.exports = {
entry : './path/to/my/entry/file.js',
}
./dist/main.js
로, 생성된 기타 파일의 경우 ./dist
파일로 설정된다.const path = require("path");
module.exports = {
entry : './path/to/my/entry/file.js',
output : {
path: path.resolve(__dirname, 'dist'),
filename: 'my-first-webpack.bundle.js',
},
};
webpack은 기본적으로 Javascript와 JSON 파일만 이해한다. 로더를 사용하면 webpack이 다른 유형의 파일을 처리하거나, 그들을 유효한 모듈로 변환하여 애플리케이션에서 사용하거나 디펜던시 그래프에 추가한다.
상위 수준에서 로더는 webpack 설정에 두가지 속성을 가진다.
test
속성use
속성const path = require('path');
module.exports = {
output: {
filename: 'my-first-webpack.bundle.js',
},
module: {
rules : [{test: /\.txt$/, use: 'raw-loader'}],
},
};
위 설정에서는 test와 use라는 두 가지 필수 속성을 가진 하나의 모듈을 위해 rules 속성을 정의했다. 이는 webpack의 컴파일러에 다음과 같이 말한다.
“webpack 컴파일러, require() / import 문 내에서 ‘.txt’ 파일로 확인되는 경로를 발견하면 번들에 추가하기 전에 raw-loader를 사용하여 변환해”
로더는 특정 유형의 모듈을 변환하는데 사용되지만, 플러그인을 활용하여 번들을 최적화하거나, 에셋을 관리하고, 또 환경 변수 주입등과 같은 광번위한 작업을 수행할 수 있다.
플러그인을 사용하려면 require()를 통해 플러그인을 요청하고 plugin 배열에 추가해야 한다. 대부분의 플러그인은 옵션을 통해 사용자가 지정할 수 있다. 다른 목적으로 플러그인을 여러 번 사용하도록 설정할 수 있으므로 new 연산자로 호출하여 플러그인의 인스턴스를 만들어야 한다.
const HTMLWebpackPlugin = require('html-webpack-plugin');
const webpack = require("webpack"); // 내장 plugin에 접근하는데 사용
module.exports = {
module: {
rules: [{test: /\.txt$/, use: 'raw-loader' }],
},
plugins: [new HTMLWebpackPlugin({template: './src/index.html'})],
};
예제에서 html-webpack-plugin 은 생성된 모든 번들을 자동으로 삽입하여 애플리케이션용 HTML 파일을 생성한다.
mode 파라미터를 development, production 또는 none으로 설정하면 webpack에 내장된 환경별 최적화를 실행할 수 있다. 기본값은 production이다.
module.exports= {
mode: 'production',
};
https://ko.javascript.info/modules-intro
https://webpack.kr/