728x90

public/node_modules/ 에서 여러가지 js 모듈을 가져다 쓰다보니 불편한 문제가 생겼다.


많은 모듈들이 css와 함께 쓰인다는 점이었다.


각각의 css를 public/css/ 에 복사 해 넣고 쓸수도 있지만, 매번 하기도 불편하고 구조적으로 안좋아보인다.


빌드 된 소스만 배포하고 싶은것도 있었다.


css도 webpack으로 묶어서 번들링 하기로 했다.


또 다른 로더들이 필요하다.


css-loader: css파일들을 찾아 읽어준다.

style-loader: node나 react 환경에서 쓰는 듯 한데, <style> 태그로 만들어 헤더쪽에 자동으로 삽입해 준다고 한다. 내가 원하는건 아니었다.

extract-text-webpack-plugin: 이 쓸데없이 긴 이름... css-loader로 읽은 파일들을 하나의 css로 합쳐준다.


나는 nginx + php-fpm 환경이기에, css 파일을 생성하는 편이 맞다고 판단했다.


역시 시작은 설치부터.. style-loader는 안쓰기로 했으니 설치하지 않는다.


1
public$ npm i -S css-loader extract-text-webpack-plugin
cs


참고로 loader는 번들링 과정에 개입하여 알맞게 해석된 코드로 변환해주고,


플러그인은 번들링 완료 된 파일에 추가 작업하는 방식으로 개입한다고 한다.


설치를 했으면 이제 뭐다?


맞다.


webpack.config.js


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
 
module.exports = {
    entry: {
        common: "./js/common.js",
        list: "./js/list.js",
        view: "./js/view.js",
    },
    output: {
        path: path.join(__dirname, 'dist'),
        publicPath: "/dist/",
        filename: '[name].build.js'
    },   
    resolve: {
        extensions: ['js''json'],        
        modules: [
            'js',
            'node_modules'
        ]    
    },
    plugins: [
            new webpack.ProvidePlugin({            
                Promise: 'es6-promise'
            }),
            new ExtractTextPlugin({
                filename: 'style.build.css',
            }),        
    ],
    module: {
        loaders: [
            {
                test: /\.js$/,
                loader: 'babel-loader?presets[]=env'
            },
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract({
                    use: 'css-loader'
                }),
            },            
        ],
    }
};
cs


4번 라인에 전역변수를 할당 한 것을 빼먹어선 안되겠다.


common.js 파일의 상단에, node_modules/ 에서 불러다 사용할 css 파일을 require 해준다.


대표적으로 이런 것 되시겠다.


1
require("bootstrap/dist/css/bootstrap.css");
cs


상황에 따라 다르겠지만, 이 상태에서 번들링을 했더니 오류가 발생했다.


node_modules/ 의 모듈 디렉토리 안에는 css와 css에 사용되는 이미지, 폰트 파일도 들어있었던 것이다.


심지어는 외부에서 url 호출로 가져다 쓰는 css도 있었다. (구글 CDN의 폰트 등)


얘들을 위해서는 loader가 또 필요하다고 한다.. 


애초에 넣어두면 좋을텐데... 라는 생각이 들었다.


필요한건 바이너리 파일을 읽어줄 file-loader와 원격 파일을 읽어줄 url-loader 이다.


슬슬 빡치지만 거의 다 온것같으니 힘을 내어 설치 해 본다.


1
public$ npm i -S file-loader url-loader
cs


다시 webpack.config.js 를 연다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
 
module.exports = {
    entry: {
        common: "./js/common.js",
        list: "./js/list.js",
        view: "./js/view.js",
    },
    output: {
        path: path.join(__dirname, 'dist'),
        publicPath: "/dist/",
        filename: '[name].build.js'
    },   
    resolve: {
        extensions: ['js''json'],        
        modules: [
            'js',
            'node_modules'
        ]    
    },
    plugins: [
            new webpack.ProvidePlugin({            
                Promise: 'es6-promise'
            }),
            new ExtractTextPlugin({
                filename: 'style.build.css',
            }),        
    ],
    module: {
        loaders: [
            {
                test: /\.js$/,
                loader: 'babel-loader?presets[]=env'
            },
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract({
                    use: 'css-loader'
                }),
            },
            {
                test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
                loader: 'url-loader?limit=10000&mimetype=application/font-woff&name=fonts/[name].[ext]'
            }, {
                test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
                loader: 'file-loader?name=fonts/[name].[ext]'
            }, {
                test: /\.(jp(e)g|gif|png)?$/,
                loader: 'file-loader?name=img/[name].[ext]'
            }
        ],
    }
};
cs


loader 부분에 여러가지를 추가 해 주었다.


사실 그냥 해보다가 되는걸로 복사해서 붙여넣은거라 뭐가 뭔지 잘 모르겠다.


천천히 분석해 볼 생각이다.


이제 webpack 명령어를 실행 해 보면 dist 폴더에는 아까보다 많은 파일이 생성된다.


각 .build.js 파일과, style.build.css 파일이 생겨났고,


fonts 디렉토리와 img 디렉토리가 생겨났다.


기존에 정신없이 나열되어 있던 <link> 태그들을 삭제하고, style.build.css 만 불러오도록 했다.


깨지는 곳 없이 스타일이 잘 적용되어 표시된다. 개이득.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기