잘 정리해보자

웹펙 - 로더 (loader) 본문

javascript

웹펙 - 로더 (loader)

토마토오이 2021. 4. 10. 23:14

loader (로더)

: javascript, css, style, image 등 파일들을 모듈로 로드할 수 있게 도와준다.

 

 

webpack-loader.js

: 패키지 최상단 webpack.config.js 파일과 동일한 경로에 생성

module.exports = function myWebpackLoader(contents) { 
    console.log('test~!!'); 
    return contents; 
}

 

 

webpack.config.js

module : { 
    rules :[ 
        { 
            test : /\.js$/,     
            //.js로 끝나는 모든 파일들은 use키값의 로더로 실행된다. (loader가 처리해야할 파일의 패턴 (정규식)을 입력) 
            use : [ path.resolve('./webpack-loader.js') ]    
            // 모든 js 파일에 webpack-loader.js 가 실행되게 선언. 
        } 
    ] 
}

> 실행결과

: js파일이 2개 있는 경우, 로더로 js파일 모두 실행함으로, console.log는 2번 찍힌다.

 

 

 

 

 

 

* console.log 를 alert로 변경하는 경우

 

webpack-loader.js

module.exports = function myWebpackLoader(contents) { 
    return contents.replace('console.log(', 'alert('); 
}

> contents 파라미터는 로더로 읽은 js 코드의 내용이며, myWebpackLoader 함수 내에서 코드 변환 가능.

 

 

 


 

loader 종류

1. css-loader

: css파일을 모듈로 호출할 수 있는 로더.

 

 

app.js

import './app.css';

 

> app.css 파일이 모듈이 되어야 동작하며, webpack의 css-loader로 동작.

 

 

app.css

body{background-color : green;}

 

 

터미널

npm install css-loader

> css-loader 설치

 

 

 

webpack.config.js

module : {
	rules : [
    	{ test : /\.css$/,use : ['css-loader' ]} //css-loader 실행
	]
}

 

> 빌드 후 실행

: /dist/main.js 에서 css코드가 제대로 반영되었는지 확인.

 

css코드만 반영되고, html에는 반영되지 않음 

    -> js에서 css파일만 호출하고 DOM 스타일로 변환되지 않았기 떄문에 html에서는 반영되지 않음 (css OM 형태로 변환해야 한다.)

 

 

 

 

 

2. style-loader

: javascript 의 style로 변경된 코드를 html 에 반영해주는 로더.

css를 모듈로 사용하려면, css-loader, style-loader  두가지 모두 config에서 선언되야 한다.

 

 

터미널

npm install style-loader

 

 

webpack.config.js

...

use : ['style-loader','css-loader']

...

 

> 로더의 use는 배열로 선언하며, 배열의 뒤에서부터 앞으로 실행한다.

css 로드 후, style 로더 호출

 

 

> 실행결과

: app.css 의 스타일이 html에 반영된다.

 

 

 

 

 

 

3. file-loader

: file/image 이나, css의 이미지파일을 가져올 수 있는 로더.

 

 

터미널

npm install file-loader

 

 

app.css

body{background-image : url('test.png')}

 

 

webpack.config.js

...

,{

test : /\.png$/,

use : [ 'file-loader' ]

}

...

 

> file이 호출(저장)되지만, 파일명이 임의의 hash값으로 저장된다.

    캐시 때문에 매번 다른 hash값으로 지정된다.

 

> 실행결과

: error

background-image 파일명이 file-loader 로 호출된 임의의 hash 파일명으로 변경되어 있어서 파일을 찾지 못하는 에러 발생.

 

 

> 해결 :

webpack.config.js

...

{
  test : /\.png$/,
  loader : 'file-loader',
  options : {
    publicPath : './dist/',
    name : '[name].[ext]?[hash]'
  }
}

> publicPath  : file-loader 가 처리하는 파일모듈의 경로 앞에 붙는 경로를 정의 ('./dist/' : output 경로, 결과 경로 : './dist/test.img?hash값')

> name : file-loader 가 파일 output 에 파일을 복사할 때 사용하는 파일명.

        [name].[ext] : 원본파일명과 확장자

        [hash] : (쿼리스트링) 캐시로 이전 파일을 호출하는 것을 방지하기 위해, 매번 변경되는 hash값을 이름뒤에 붙임으로서 캐시의 영향력을 없앤다.

 

 

 

 

 

 

4. url-loader

: 로드에 사용되는 이미지 개수가 많고, 성능에 영향을 끼치며, 작은 이미지를 여러개 호출할 때는 Data URI Scheme 를 이용한다.

(이미지를 base64로 인코딩해 이미지태그로 호출)

 

 

ex)

<image src="data:image/png;base64, iBFDSKL;FJ4FLEJSLFJSDLFJLD433KLDSFJL..DFSJ3E==" />

네트워크 통신을 하지 않고 이미지태그로 바로 로딩이 가능.

 

url-loader는 이러한 과정을 도와주는 로더이다.

 

 

 

 

app.js

import './app.css';
import testimg from './testimg.jpg';

//testimg 이미지를 testimg 라는 이름으로 import 한다.
document.addEventListener('DOMContentLoaded', () => {
	document.body.innerHTML = '<img src="${testimg}">';
})

 

 

터미널

npm install url-loader

 

 

webpack.config.js

...

 ,{
  test : /\.(png|jpg|svg|gif)$/,
  loader : 'url-loader',
  options : {
  publicPath : './dist/',
  name : '[name].[ext]?[hash]',
  limit : 20000
  // (20kb) file 용량 세팅 
  // : 해당 용량의 미만인 경우 url-loader를 통해 base64 문자열로 변환하며, 
  //	해당 용량의 이상인 경우 file-loader 를 실행해 파일을 복사한다.
  }	
}

> 실행결과

: 20kb 미만인 이미지는 이미지태그로 base64 형태로 출력됬으며, 20kb 이상인 이미지는 복사되어 html 에 반영됬다.

 

 

'javascript' 카테고리의 다른 글

Lint (린트)  (0) 2021.04.11
Babel (바벨)  (0) 2021.04.11
웹펙 - 설치와 실행  (0) 2021.04.10
자바스크립트 기본동작과 웹펙 사용 이유  (0) 2021.04.10
apply, bind  (0) 2019.09.20
Comments