ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Webpack
    Bundler/Webpack 2021. 7. 5. 05:36

     

    프로젝트 설치

     

    $ npm init -y
    $ npm i -D webpack webpack-cli webpack-dev-server@next

    설치가 완료되면
    package.json 내부에 생성됨
    "devDependencies": {
        "webpack": 설치된 버전이 명시,
        "webpack-cli": 설치된 버전이 명시,
        "webpack-dev-server": 설치된 버전이 명시  
    }

     

    프로젝트 실행

     

    ## 세팅 ##
    package.json 내부에 "scripts" 수정

    "scripts": {
        "dev": "webpack-dev-server --mode development",
        "build": "webpack --mode production"
    }

    ## 구성 설정 ##
    프로젝트 루트 경로에 webpack.config.js 파일 생성

     

    /* webpack.config.js */
    
    const path = require('path')
    
    module.exports = {
      // webpack은 js를 진입점으로 사용
      // 파일을 읽어들이기 시작하는 진입점 설정
      entry: './js/main.js',
    
      // 결과물(번들)을 반환하는 설정
      output: {
        // 어떠한 경로에다가 결과물을 만들어서 내어줄지 명시 (절대경로)
        // 기본값
        // path: path.resolve(__dirname, 'dist'),
        
        // 결과물의 파일의 이름
        // 기본값
        // filename: 'main.js',
        
        // 기존의 만들었던 내용 제거
        clean: true
      }
    }

     

    Plugins

     

    ## HTML 연동을 위해 설치 ##
    $ npm i -D html-webpack-plugin

    webpack.config.js 파일에 내용 추가

     

    /* webpack.config.js */
    
    const path = require('path')
    
    // 추가된 부분
    const HtmlPlungin = require('html-webpack-plugin');
    
    module.exports = {
      entry: './js/main.js',
      output: {
        clean: true
      },
    
     // 추가된 부분
     // 번들링 후 결과물의 처리 방식 등 다양한 플러그인들을 설정
      plugins: [
        new HtmlPlungin({
          template: './index.html'
        })
      ]
    }

     

    정적 파일 연결

     

    dist 폴더로 자동으로 넣어줄 수 있는 패키지를 설치한다

     

    ## 패키지 설치 ##
    $ npm i -D copy-webpack-plugin

    webpack.config.js 파일에 내용 추가

     

    /* webpack.config.js */
    
    const CopyPlugin = require('copy-webpack-plugin');
    
    module.exports = {
       plugins: [
        new CopyPlugin({
          patterns: [
            // 만들어놓은 폴더의 이름을 명시
            { from: 'static'}
          ]
        })
      ]
    }

     

    Module (CSS, SCSS 연결)

     

    # Loader #
    # 자바스크립트 파일이 아닌 웹 자원(HTML, CSS, Images, 폰트 등)들을 변환할 수 있도록 도와주는 속성 #
    $ npm i -D css-loader style-loader
    $ npm i -D sass-loader sass

    package.json 내부에 내용 추가
    "browserslist": [
        "> 1%",
        "last 2 versions"  
    ]

    webpack.config.js 파일에 내용 추가

     

    /* webpack.config.js */
    
    module: {
        rules: [
          {
            test: /\.s?css$/,
            use: [
              'style-loader',
              'css-loader',
              'sass-loader'
            ]
          }
        ]
      }

     

    /* main.js */
    
    // import '../css/main.css'
    import '../scss/main.scss'

     

    Autoprefixer

     

    # CSS 속성의 공급 업체 접두사 (Vender Prefix) 를 사용자의 브라우저에 따라 자동으로 붙여주는 플러그인 #
    $ npm i -D postcss autoprefixer postcss-loader

    webpack.config.js 파일에 내용 추가
    .postcssrc.js 파일 생성 후 내용 추가

     

    /* webpack.config.js */
    
    module: {
        rules: [
          {
            test: /\.s?css$/,
            use: [
              'style-loader',
              'css-loader',
              // 추가된 부분
              'postcss-loader',
              'sass-loader'
            ]
          }
        ]
      },

     

    /* .postcssrc */
    // ESM - (improt, export 키워드를 사용하는 방식)
    // node.js 에서는 CommonJS 방식을 사용
    
    // import 대신 require() 방식으로 js파일을 외부에서 가져옴
    // export 대신 module.exports 방식으로 내용들을 내보내기 
    
    module.exports = {
      plugins: [
        require('autoprefixer')
      ]
    }

     

    Babel

     

    ## 패키지 설치 ##
    $ npm i -D @babel/core @babel/preset-env @babel/plugin-transform-runtime
    $ npm i -D babel-loader

    webpack.config.js 파일에 내용 추가
    .babelrc.js 파일 생성 후 내용 추가

     

    /* webpack.config.js */
    module: {
        rules: [      
          {
            test: /\.js$/,
            use: [
              'babel-loader'
            ]
          }
        ]
      },

     

    /* .babelrc.js */
    module.exports = {
      presets: ['@babel/preset-env'],
      plugins: [
        ['@babel/plugin-transform-runtime']
      ]
    }

     


    참고

    https://webpack.js.org/concepts/

     

    Concepts | webpack

    webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

    webpack.js.org

     

    댓글

Designed by Tistory.