webpack4 manifest plugin도입

Posted by negabaro kim on Thursday, April 11, 2019 Tags: webpack js   5 minute read

webpack-manifest-plugin이란

번들링시 생성되는 코드에 대한 정보를 json파일로 저장하여 관리

번들링할때 hash값을 이용해 파일명을 생성시 문제가 매번 hash값이 바뀌므로 최종 번들링된 파일명을 import할때 특정하기 어려웠음

이때 webpack-manifest-plugin을 사용하면

manifest.json을 생성해 매번 생성된 최종결과물과 매치되는 스태틱한 파일명을 alias와 같은 형태로 사용할 수 있게 해주므로 import시는 고정값을 사용가능하게 됨

베이스는 이전 포스트에 이어서 실행한다

webpack4에서 splitChunks 사용해서 중복된 모듈 없애기

npm install webpack-manifest-plugin

webpack-manifest-plugin플러그인을 인스톨

npm i webpack-manifest-plugin --save-dev

webpack.config.js

var path = require("path");
var ManifestPlugin = require("webpack-manifest-plugin");
module.exports = {
  mode: "development",
  entry: {
    main: "./app/index.js",
    vendor: ["moment", "lodash"]
  },
  output: {
    filename: "[hash].js",
    path: path.resolve(__dirname, "dist")
  },
  plugins: [
    //이부분
    new ManifestPlugin({
      fileName: "manifest.json",
      basePath: "./dist/"
    })
  ],
  optimization: {
    runtimeChunk: {
      name: "runtime"
    },
    splitChunks: {
      name: "vendor",
      chunks: "initial"
    }
  }
};
  plugins: [
    new ManifestPlugin({
      fileName: "manifest.json",
      basePath: "./dist/"
    })
  ],

이 부분이 포인트

webpack실행

npx webpack

result

Hash: 4216a9e8e22e709a7fe1
Version: webpack 4.29.6
Time: 602ms
Built at: 2019-04-11 17:18:14
                         Asset       Size   Chunks             Chunk Names
       4216a9e8e22e709a7fe1.js   6.04 KiB  runtime  [emitted]  runtime
  main.4216a9e8e22e709a7fe1.js   15.7 KiB     main  [emitted]  main
                 manifest.json  160 bytes           [emitted]
vendor.4216a9e8e22e709a7fe1.js   1.12 MiB   vendor  [emitted]  vendor
Entrypoint main = 4216a9e8e22e709a7fe1.js vendor.4216a9e8e22e709a7fe1.js main.4216a9e8e22e709a7fe1.js
[0] multi moment lodash 40 bytes {vendor} [built]
[./app/index.js] 253 bytes {main} [built]
[./node_modules/moment/locale sync recursive ^\.\/.*$] ./node_modules/moment/locale sync ^\.\/.*$ 3 KiB {main} {vendor} [optional] [built]
[./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 472 bytes {vendor} [built]
[./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 497 bytes {vendor} [built]
    + 129 hidden modules

manifest.json이 추가된걸 확인

cat dist/manifest.json

안을 보면 이런식으로 스태틱한 파일명이 있는걸 알 수있다.

{
  "./dist/main.js": "main.4216a9e8e22e709a7fe1.js",
  "./dist/runtime.js": "4216a9e8e22e709a7fe1.js",
  "./dist/vendor.js": "vendor.4216a9e8e22e709a7fe1.js"
}

また、ハッシュ値はファイルの内容が変わる度に異なるものが生成されますが、build フォルダに出力されたファイルは消えるわけではありません。これだとファイルが溜まる一方なので、ビルド時に出力先フォルダの中身を空にするプラグイン clean-webpack-plugin も使いましょう。

npm install --save-dev clean-webpack-plugin
npm i --save-dev html-webpack-plugin@next

분리된 파일들은 서버가 열리면 HtmlWebpackPlugin 이 알아서 index.html에 주입해준다. 물론 production 빌드를 하면 분리된 번들 파일 두개가 생성된다

template 옵션에는 해당하는 html파일의 패스를 입력해주시면 됩니다. $ webpack 명령어를 실행해주면 dist 폴더에 index.html파일이 생성되고 자동으로 bundle된 css파일과 js파일이 link태그와 script태그로 추가된 것을 확인하실 수 있습니다. !

안나오는디..?

코드

https://github.com/negabaro/LearnWebpack/tree/master/example2-4-webpack-manifest-plugin

http://cloudcafe.tech/?p=653 https://www.inflearn.com/course/webpack-%EC%9B%B9%ED%8C%A9-%EA%B0%95%EC%A2%8C/%EC%8B%A4%EC%8A%B5-libraries-codes-splitting-3-manifest-plugin/