March 10, 2021
먼저 Node.js를 설치해야 한다.
아래의 명령어로 node.js와 npm이 잘 설치되었는지 version을 확인해볼 수 있다.
$ node -v
$ npm -v아래의 명령어로 npm을 기본값으로 초기화할 수 있다.
$ npm init -y그러면 아래와 같은 내용을 포함한 package.json 파일이 자동으로 생성된다.
{
"name": "프로젝트 이름",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}아래의 명령어로 npm 특정 라이브러리를 설치할 수 있다.
$ npm install {라이브러리 이름}라이브러리 설치가 완료되면 node_modules라는 폴더가 생성되고 그 안에 라이브러리가 설치된다.
package.json 에 아래의 내용이 추가된다. 예를 들어 jquery 라는 라이브러리를 설치했을 경우 아래와 같이 dependencies 속성으로 라이브러리 이름과 설치된 버전이 추가된다.
"dependencies": {
"jquery": "^3.6.0"
}만약 명령어 뒤에 --save-dev 를 함께 붙여서 설치한다면 dependencies가 아니라 devDependencies 속성으로 추가된다.
설치
dependencies
$ npm install {라이브러리 이름}
# or
$ npm i {라이브러리 이름}devDependencies
$ npm install {라이브러리 이름} --save-dev
# or
$ npm i {라이브러리 이름} -D제거
$ npm uninstall {라이브러리 이름}전역 설치
$ npm install {라이브러리 이름} --global
# or
$ npm install {라이브러리 이름} -g어느 위치에서 해당 명령어를 실행하든 그 위치에 설치가 되는 것이 아니라 아래의 폴더에 설치된다. (시스템 레벨의 전역으로 설치되는 것)
# windows
%USERPROFILE%\AppData\Roaming\npm\node_modules
# macOS
/usr/local/lib/node_modulesdependencies
npm i {라이브러리 이름}jQuery는 화면의 DOM을 조작하기 위한 유틸성 라이브러리이기 때문에 배포용 라이브러리이다.react, angular, chartdevDependencies
npm i {라이브러리 이름} -Dwebpack, js-compression, sass모듈 번들링 : 몇십, 몇백개의 자원들을 하나의 파일로 합쳐준다.
npm 초기화
$ npm init -ywebpack 설치
$ npm i webpack webpack-cli -Dlodash 설치 (JS 유틸리티 라이브러리)
$ npm i lodashindex.html 생성
<html>
<head>
<title>Webpack Demo</title>
<script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
<script src="src/index.js"></script>
</body>
</html>src/index.js 생성
function component() {
var element = document.createElement('div');
/* lodash is required for the next line to work */
element.innerHTML = _.join(['Hello','webpack'], ' ');
return element;
}
document.body.appendChild(component());웹팩 빌드 결과물로 실행하기 위해 아래와 같이 수정
index.html
<html>
<head>
<title>Webpack Demo</title>
</head>
<body>
<script src="dist/main.js"></script>
</body>
</html>src/index.js 에 lodash 라이브러리 import 문 추가
import _ from 'lodash';
//...웹팩 빌드 명령어를 실행하기 위해 package.json 파일에 커스텀 명령어 추가
"scripts": {
//...
"build": "webpack"
}npm run build 명령어를 실행하면 dist 폴더에 번들링 결과물이 생성된다.루트 경로에 webpack.config.js 추가
// `webpack` command will pick up this config setup by default
var path = require('path');
module.exports = {
mode: 'none',
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist')
}
};var path = require('path'); : node.js의 모듈 문법이라고 보면 된다. path 라이브러리를 들고 와서 path라는 변수에 담는다. 그래서 이 path의 resolve라는 api 를 사용하게 된다.development, production, none 총 3가지로 지정할 수 있다. none을 설정하지 않으면 빌드 결과물이 난독화 되어 나온다.빌드(번들링) 결과물 경로 변경 방법
만약 이 폴더 경로와 파일명을 public/output.js 와 같이 변경하고 싶다면 webpack.config.js 파일에서 아래와 같이 수정해주면 된다.
//..
module.exports = {
//..
output: {
filename: 'output.js',
path: path.resolve(__dirname, 'public')
}
};파일 단위의 자바스크립트 모듈 관리
a.js 에서 선언한 변수를 b.js 에서 사용할 수 있고 수정할 수 있어서 문제가 있었다.modules라는 문법으로 import, export 개념이 언어 레벨까지 들어오게 되었다.웹 개발 작업 자동화 도구
웹 애플리케이션의 빠른 로딩 속도와 높은 성능
Babel 설치
$ npm i @babel/core @babel/preset-env babel-loader -Dexport
다른 파일에서 가져다 쓸 변수나 함수 앞에 export 키워드를 붙인다.
export var name = 'Jessie';
export function sum(a, b) {
return a + b;
}import
export된 변수나 함수를 { } 안에 선언하여 사용한다.
import { name, sum } from '파일 경로';
console.log(name); // Jessie
console.log(sum(10, 20)); // 30devtool: 'source-map' 속성을 추가해주면 빌드되기 전의 원본 파일을 개발자도구에서 볼 수 있다.var path = require('path');
module.exports = {
mode: 'production',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'main.bundle.js'
},
module: {
rules: [{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}, {
test: /\.css$/,
use: ['style-loader', 'css-loader']
}]
},
stats: {
colors: true
},
devtool: 'source-map'
};production, development, nonedevelopment : 개발자들이 좀 더 보기 편하게 웹팩 로그나 결과물이 보여진다.production : 성능 최적화를 위해 기본적인 파일 압축 등의 빌드 과정이 추가된다.none : 난독화 되지 않고 번들링된다.production으로 자동 설정된다.filename: 빌드 결과물 파일 이름 지정filename이 동일하면, 브라우저 캐싱 때문에 같은 파일을 화면에 뿌려주기 때문에 강제 새로고침을 해야 한다.filename을 '[name].[hash].bundle.js' 와 같이 정의하면, 웹팩이 해시 값을 이용해서 빌드를 할 때마다 고유 값들을 붙여준다. 이렇게 되면 filename이 변경되기 때문에 브라우저 캐싱이 되지 않고 변경된 파일을 사용자가 정상적으로 볼 수 있도록 해준다.
output: {
//...
filename: '[name].[hash].bundle.js'
},entry에서 output으로 변환을 할 때 중간에 개입하는 Loader.rules: 웹팩으로 변환할 때 적용될 로더들을 배열 안 객체 형태로 추가한다.test: 로더를 적용할 파일의 확장자 지정use: 로더 지정example
module: {
rules: [{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}]
},.css 확장자를 가진 모든 파일을 대상으로 style-loader,css-loader 로더를 적용만약 index.js 에 base.css 라는 파일을 import한 상태에서 위의 설정처럼 필요한 로더를 정의하지 않고 빌드를 하면 어떻게 될까?
index.js 를 가지고 해석을 시작하는데 index.js 안에 있는 base.css 를 보고 이걸 빌드 결과물에 css 코드를 넣으려고 할 때 fail 이 뜬다.사실 원래 JS 파일 안에 CSS를 넣을 수 없다. 그래서 로더를 설정해야 한다는 에러가 발생하는 것.
ERROR in ./base.css
Module parse failed: Unexpected token
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file.
아래와 같이 css-loader 만 로더로 지정해주고 빌드를 하면 어떻게 될까?
module: {
rules: [{
test: /\.css$/,
use: ['css-loader']
}]
},base.css 파일에서 지정한 스타일이 적용되지 않는다!만약 아래와 같이 css-loader를 먼저 로더로 지정해주고, style-loader를 그 다음에 로더로 지정해주면 어떻게 될까?
module: {
rules: [{
test: /\.css$/,
use: ['css-loader', 'style-loader']
}]
},ERROR in ./base.css
Module build failed (from ./node_modules/css-loader/dist/cjs.js): CssSyntaxError아래와 같이 순서를 꼭 지켜줘야 한다.
module: {
rules: [{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}]
},css-loader: 빌드 결과물에 css 코드를 포함시켜준다.style-loader: 스타일 코드를 <head> 태그 안에 인라인 스타일로 넣어 주는 역할을 한다.scss도 아래와 같이 설정할 수 있다.
module: {
rules: [{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
}]
},sass-loader: sass 를 먼저 css 파일로 바꾸고css-loader: 빌드 결과물에 css 코드를 포함시켜주고style-loader: 빌드 결과물 내 스타일 코드를 태그 안에 인라인으로 넣어준다example : html-webpack-plugin
// webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin');
//...
module.exports = {
//...
plugins: [
new HtmlWebpackPlugin({
template: 'index.html',
})
],
//...
}index.html template 기반으로 빌드 결과물을 추가해준다.package.json에 아래와 같이 dev 명령어를 추가해준다.
"scripts": {
//...
"dev": "webpack-dev-server",
"build": "webpack"
}$ npm i webpack webpack-cli webpack-dev-server html-webpack-plugin -D