【備忘録】webpackのローダーとプラグインまとめ

【備忘録】webpackのローダーとプラグインまとめ

こんにちは!
webpackの学習を一通り終えたので、インプットするために、備忘録を書いていきます。
いろんなローダーやプラグインがあり、インストールするたび設定を付け加えたりと、1度だけでは間違いなく覚えられないので、今後使って行きそうなものをピックアップしてまとめて行きます。

自分用の備忘録となりますので、間違っていることもありますが、その場合は
ドキュメントも貼っておきますので、確認してみてください。

ちなみに、webpack4での学習でしたので、webpack4について書いています。

前回のwebpackをインストールまで終わっていること前提です。

あわせて読みたい
【備忘録】VSCodeにwebpackをインストールするまでに必要なこと 【備忘録】VSCodeにwebpackをインストールするまでに必要なこと こんにちは! 今回はVSCodeでwebpackを導入するまでに苦戦したり、調べても 出なかったりとしたので備忘...

記事の流れ
・開発用と本番用の設定
・JavaScriptのファイルを圧縮
・ソースマップの生成
・ディレクトリを綺麗に掃除
・HTMLの出力
・開発サーバー
・複数のファイルの出力
・ファイルの分割
・キャッシュ対策
・babelについて
・対象ブラウザを指定する
・ポリフィルについて
・eslintについて
・コードの整形
・Sassのバンドル
・CSSを個別に出力
・CSS用のの便利ツール
・CSSの圧縮
・画像を出力
・HTMLの画像を出力
・画像を圧縮

では備忘録を書いていきます。

 

目次

開発用と本番用の設定 webpack-merge

用途
開発用と本番用を共通の設定でマージさせる。

インストールしたバージョン:5.0.9
最新バージョン:5.8.0
npmコマンド:npm install –save-dev webpack-merge@5.0.9

ドキュメント
https://www.npmjs.com/package/webpack-merge

設定の詳細
https://v4.webpack.js.org/configuration/mode/

webpack.common共通の設定

const path = require('path');

module.exports = {
  entry: './src/js/app.js',
  output: {
    path: path.resolve(__dirname, 'public'),
    filename: 'js/bundle.js',
  },
};

webpack.dev開発用の設定

const { merge } = require('webpack-merge');
const commonConfig = require('./webpack.common.js');

module.exports = merge(commonConfig, {
  mode: 'development',
  watch: true,
});

module.exportsで開発用の設定と共通設定をマージする。
watchをtrueにすことでファイルを監視するモードが有効になる。

webpack.prod本番用の設定

const { merge } = require('webpack-merge');
const commonConfig = require('./webpack.common.js');

module.exports = merge(commonConfig, {
  mode: 'production',
});

package.jsonの更新

  "scripts": {
    "dev": "webpack --config webpack.dev.js",
    "build": "webpack --config webpack.prod.js"
  },

npm run devのコマンドで開発用が実行される
npm run buildのコマンドで本番用が実行される

ファイルを圧縮 terser-webpack-plugin

用途
JavaScriptファイルを圧縮する。

インストールしたバージョン:3.0.8
最新バージョン:5.2.5
npmコマンド:npm install –save-dev terser-webpack-plugin@3.0.8

ドキュメント
https://www.npmjs.com/package/terser-webpack-plugin

webpack.prod本番用の設定に追加

const TerserPlugin = require('terser-webpack-plugin');

module.exports = merge(commonConfig, {
  mode: 'production',
  optimization: {
    minimizer: [
      new TerserPlugin({
        extractComments: false,
        terserOptions: {
          compress: {
            drop_console: true,
          },
        },
      }),
    ],
  },
});

extractComments
falseでライブラリのライセンスコメントを生成されないようにする。
xxx.LICENSE.txtが生成されなくなる。

terserOptionsのdrop_console
trueでコンソールが削除される。

terserOptionsの詳細な設定
https://github.com/terser/terser#minify-options

ソースマップの生成

webpack.dev開発用の設定に追加

ドキュメント:https://v4.webpack.js.org/configuration/devtool/

module.exports = merge(commonConfig, {
  devtool: 'cheap-module-eval-source-map',
});

開発時は
eval
eval-source-map
cheap-eval-source-map
cheap-module-eval-source-map
が推奨されている。

本番用は
source-map
※ユーザーがソースマップにアクセスできないようにサーバー構成をする必要がある。
hidden-source-map
nosources-source-map
が推奨されている。

ディレクトリを綺麗に掃除 clean-webpack-plugin

用途
生成先ディレクトリを綺麗に掃除してくれるプラグイン。
不要なファイルなどを消してくれる。

インストールしたバージョン:3.0.0
最新バージョン:4.0.0

ドキュメント
https://www.npmjs.com/package/clean-webpack-plugin

webpack.common共通の設定に追加

const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  plugins: [
    new CleanWebpackPlugin({
      cleanOnceBeforeBuildPatterns: ['**/*', '!**.html'],
    }),
  ],
};

cleanOnceBeforeBuildPatterns
指定することで、削除対象を指定できる。
htmlを削除しないようにしている。

html-webpack-pluginを利用する場合オプションは不要。

HTML出力 html-webpack-plugin

用途
webpackでHTMLを自動で出力してくれる。

インストールしたバージョン:4.3.0
最新バージョン:4.0.0

ドキュメント
https://www.npmjs.com/package/html-webpack-plugin

webpack.common共通の設定に追加

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/html/index.html',
    }),
  ],
};

template
指定することで、HTMLのなどをテンプレートできる。
index.htmlに出力する、バンドルを読み込んだ HTMLを出力する

開発サーバー webpack-dev-server

用途
webpackでの開発サーバーを立ち上げることができる。

インストールしたバージョン:3.11.0
最新バージョン:4.0.0

ドキュメント
https://webpack.js.org/configuration/dev-server/

package.jsonに追加

  "scripts": {
    "start": "webpack-dev-server --config webpack.dev.js",
  },

npm startのコマンドでサーバーが起動する

webpack.dev開発用の設定に追加

const path = require('path');

module.exports = merge(commonConfig, {
  devServer: {
    open: true,
    port: 9000,
    contentBase: path.resolve(__dirname, 'public'),
  },
});

open
trueで自動的にブラウザが開かれる。
contentBase
コンテンツのルートディレクトpublic/index.htmlが開かれる。

consoleに[WDS] Live Reloading enabled.が表示されていれば、有効になっている。

ターミナルで『Control』+『C』で停止できる。

複数のファイルの出力

webpack.common共通の設定を更新

module.exports = {  
    entry: {
        app: './src/js/app.js',
    another: './src/js/another.js',
  },
  output: {
    path: path.resolve(__dirname, 'public'),
    filename: 'js/[name].bundle.js',
  },

  plugins: [
    new HtmlWebpackPlugin({
      template: './src/html/index.html',
      chunks: ['app'],
    }),
    new HtmlWebpackPlugin({
      filename: 'another.html',
      template: './src/html/another.html',
      chunks: ['another'],
    }),
  ],
  };
};

entry
追加したファイルを追加記述をする。
filenameの[name]はentryに指定した名前が入る。
今回の場合index.bundle.jsと another.bundle.js が出力される。
bundleはなくても別の名前でも可。

プラグインのfailenameは何も指定しないと、index.htmlが出力されるので、出力したい名前を指定する。

chunks
エントリーポイント名を指定することでwebpackから出力されたどのファイルから読み込むか指定できる。
指定しないと、複数のファイルが1つになって出力される。

ファイルを分割 splitChunksPlugin

用途
ファイルを分割して出力するプラグイン

ドキュメント
https://v4.webpack.js.org/plugins/split-chunks-plugin/

解説
https://qiita.com/soarflat/items/1b5aa7163c087a91877d

webpack.common共通の設定に追加

module.exports = {
  output: {
    chunkFilename: 'js/[name].js',
  },
  optimization: {
    splitChunks: {
      chunks: 'initial',
      cacheGroups: {
        vendor: {
          test: /node_modules/,
          name: 'vendor',
        },
        vendorsModules: {
          test: /src[\\/]js[\\/]modules/,
          name: 'vendor-modules',
          minSize: 0,
          minChunks: 2,
        },
      },
    },
  },

splitChunks
splitChunksの設定を行う。

chunks
分割する対象の設定。
async
デフォルトの設定
動的にインポートしているモジュール
import(”)でインポートしているもの

initial
静的にインポートしているモジュール
import 文を宣言的にインポートしているもの

all
すべて

cacheGroups
複数のファイルを出力する設定

vendorとvendorsModules
任意の名前をつけられる。

test
どのディレクトリを対象とするか

name
出力するファイル名
filename: ‘js/[name].bundle.js’,で出力されるため、
vender.bundle.jsと出力される。
chunkFilename: ‘js/[name].js’,を記述することで
優先されるのでvender.jsと出力される。
必要に応じて設定を変える。

minSize
モジュールの最小サイズ
デフォルトは30kb未満は分割の対象にならない

minChunks
モジュールがいくつの場所で使われていれば対象とするか。

キャッシュ対策

出力するファイル名を変えることでキャッシュ対策ができる。
webpack.common共通の設定を更新

module.exports = {
  output: {
    filename: 'js/[name].[contenthash].js',
    chunkFilename: 'js/[name].[contenthash].js',
  },
 },

[contenthash]
出力するファイルごとに固有の名前をつける。
ファイルを更新するたびつけてくれる。

babelについて babel-loader、@babel/core、@babel/preset-env

babel-loader
用途
JavaScriptのコンパイラ
古い書き方に変換する。

インストールしたバージョン:8.1.0
最新バージョン:4.0.0

ドキュメント
https://www.npmjs.com/package/babel-loader

@babel/core
用途
babelの本体

インストールしたバージョン:7.10.5
最新バージョン:7.16.0

ドキュメント
https://www.npmjs.com/package/@babel/core

詳細
https://babeljs.io/docs/en/babel-core

@babel/preset-env
用途
babelプラグインの設定(プリセット)

インストールしたバージョン:7.10.4
最新バージョン:7.16.4

ドキュメント
https://www.npmjs.com/package/@babel/preset-env

詳細
https://babeljs.io/docs/en/babel-preset-env

webpack.common共通の設定に追加
※書き方が複数ある

module.exports = { 
 module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
    ],
  },
};

test
ローダーの処理対象になるファイルを正規表現で記述

exclude
ローダーの処理対象から外すディレクトリ

loader
利用するローダー

babel.config.jsを作成
設定ファイルに関しては、webpackの設定ファイルに書いても使えるが
分けたほうが見栄えがいい。

module.exports = {
  presets: ['@babel/preset-env'],
};

presets
利用するプリセットを記述

対象ブラウザを指定する.browserslistrc

.browserslistrc
対象ブラウザを指定する設定ファイル

用途
指定したブラウザだけを変換できる。
すべて変換しなくていいため、ファイルサイズを軽くできる。
異なるツール間で共通に使える。
ツールによっての重複や記述漏れなどをなくせる。

どのように変換されるかの確認
Babel Try it out

指定できるブラウザ
https://github.com/browserslist/browserslist#browsers-data-updating

.browserslistrcを作成

ie 11

ポリフィルについて core-js、regenerator-runtime

core-js
用途
ブラウザに関数がない場合、polyfillから関数を使うことができる。

インストールしたバージョン:3.6.5
最新バージョン:3.19.3

ドキュメント
https://www.npmjs.com/package/core-js

regenerator-runtime
用途
async/awaiの構文を使えるようにする。

インストールしたバージョン:0.13.7
最新バージョン:0.13.9

ドキュメント
https://www.npmjs.com/package/regenerator-runtime

babel.config.jsに追加

module.exports = {
  presets: [
    [
      '@babel/preset-env',
      {
        useBuiltIns: 'usage',
        corejs: 3,
        debug: true,
      },
    ],
  ],
};

useBuiltIns
必要なポリフィルのみを取り込みたい場合、usageを指定する

corejs
利用するポリフィルのバージョンの指定をする
指定しなかった場合、バージョン2が適用される。

debug
ポリフィルが含まれているかどうかを確認する
必要がなければ書かなくてもいい。

eslintについて eslint-loader、eslint

eslintについて
https://eslint.org/

eslint-loader
用途
eslintを走らせることができるツール

インストールしたバージョン:4.0.2
最新バージョン:4.0.2

ドキュメント
https://www.npmjs.com/package/eslint-loader

補足
eslint-loaderを使わなくても
pakage.jsonに直接記述したり、拡張機能を使えば
eslintだけインストールされている場合使える。

eslint
用途
JavaScriptのための静的検証ツール
コードを実行する前に明らかなバグを見つけたり、括弧やスペースの使い方などのスタイルを統一する

インストールしたバージョン:7.5.0
最新バージョン:8.4.1

ドキュメント
https://www.npmjs.com/package/eslint

.eslintrc.jsを作成

module.exports = {
  root: true,
  env: {
    browser: true,
    es2020: true,
  },
  parserOptions: {
    sourceType: 'module',
       //ecmaVersion: 11,
  },
  extends: [
    'eslint:recommended',
  ],
  rules: {
    'prefer-const': 'error',
  },
};

root
設定ファイルを探しに行く
trueにすると、これより親階層の設定ファイルを探しにいかない
デフォルトの場合すべての階層を探しに行く
(他の階層にある.eslintrc.jsの設定が適用される)

env
検証するJavaScriptの環境を設定。

browsser
trueにするとconsole.log などを利用してもエラーが発生しなくなる

es2020
trueにするES2020までの構文を利用してもエラーが発生しない。parserOptions.ecmaVersion11が自動でセットされる。

parserOptions
ECMAScriptのバージョンをサポートする設定

sourceType
moduleにするとES Modulesを利用してもエラーが発生しなくなる
import/exportが使える。

extends
外部で提供されている設定を利用する
eslintがおすすめしている設定を利用している。

rules
ルールを指定する。
更新をしない変数の宣言に、const 以外を利用した場合はエラーになる設定をしている。
extendsのルールとrulesで重複した場合、rulesが優先される。

ルールについて
https://eslint.org/docs/rules/

webpack.common共通の設定に追加

module.exports = {
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
        options: {
          fix: true,
        },
      },
    ],
  },
};

enforce
ローダーのカテゴリーを指定する。
preにするとpreが指定されていないローダーよりも早く処理が実行される
(babelで変換される前のコードで検証するため)

test
ローダーの処理対象ファイル指定

exclude
指定したモジュールの除外

loader
利用するローダーの指定

options
eslint-loaderのオプションの設定

fix
一部のエラーを自動修正

コードの整形 prettier、eslint-config-prettier、eslint-plugin-prettier

prettier
用途
コードを整形する

インストールしたバージョン:2.0.5
最新バージョン:2.5.1

ドキュメント
https://www.npmjs.com/package/prettier

eslint-config-prettier
用途
eslintの整形に関する設定をすべて無効にする設定

インストールしたバージョン:6.11.0
最新バージョン:8.3.0

ドキュメント
https://www.npmjs.com/package/eslint-config-prettier

eslint-plugin-prettier
eslintでprettierを実行するプラグイン

インストールしたバージョン:3.1.4
最新バージョン:4.0.0

ドキュメント
https://www.npmjs.com/package/eslint-plugin-prettier

.eslintrc.jsに追加

module.exports = {
  extends: [
    'eslint:recommended',
    'plugin:prettier/recommended',
  ],
};

plugin:prettier/recommendedはextendsの最後に記述する

.prettierrc.jsを作成

module.exports = {
  singleQuote: true,
};

singleQuote
文字列の表現がシングルクウォートになる。

設定できるルール
https://prettier.io/docs/en/options.html

Sassのバンドル sass-loader、node-sass、css-loader、style-loader

sass-loader
用途
sassをcssにコンパイルする

インストールしたバージョン:8.0.2
最新バージョン:12.4.0

ドキュメント
https://www.npmjs.com/package/sass-loader

node-sass
用途
nodeでsassを使えるようにする

インストールしたバージョン:4.14.1
最新バージョン:7.0.0

ドキュメント
https://www.npmjs.com/package/node-sass

css-loader
用途
cssをモジュールに変換する

インストールしたバージョン:3.5.3
最新バージョン:6.5.1

ドキュメント
https://www.npmjs.com/package/css-loader

style-loader
用途
バンドルしたcssをhtmlに挿入する

インストールしたバージョン:1.2.1
最新バージョン:3.3.1

ドキュメント
https://www.npmjs.com/package/style-loader

(style-loaderは不要になる)

webpack.common共通の設定に追加

module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: ['style-loader', 'css-loader', 'sass-loader'],
      },
    ],
  },
};

sass-loader→css-loader→style-loader
の順で実行される。

コンパイル→モジュール→htmlに挿入

CSSを個別に出力 mini-css-extract-plugin

mini-css-extract-plugin
用途
sassをcssにコンパイルする

インストールしたバージョン:0.9.0
最新バージョン:2.4.5

ドキュメント
https://www.npmjs.com/package/mini-css-extract-plugin

style-loaderが不要になるため、uninstallコマンドで削除

webpack.common共通の設定に追加

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
      },
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: './css/[name].[contenthash].css',
    }),
  ],
};

filename
出力するファイル名を記述する。
outputのpbulicに出力される。

[name]
エントリーポイント

[contenthash]
キャッシュ対策

CSS用の便利ツール postcss-loader、autoprefixer

postcss-loader
用途
CSSツールを作るためのフレームワーク

インストールしたバージョン:3.0.0
最新バージョン:6.2.1

ドキュメント
https://www.npmjs.com/package/postcss-loader

autoprefixer
用途
自動的にベンダープレフィックスを付け、対象ブラウザによって構文を変換をする

インストールしたバージョン:9.8.5
最新バージョン:10.4.0

ドキュメント
https://www.npmjs.com/package/autoprefixer

webpack.common共通の設定に追加

module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [ MiniCssExtractPlugin.loader, 'css-loader','postcss-loader','sass-loader'],
      },
    ],
  },
};

postcss.config.jsonを作成

module.exports = {
  plugins: [require('autoprefixer')],
};

plugins
webpackで使うプラグインを指定する

ブラウザの指定はいくつかやり方があるが
.browserslistrc.に対象ブラウザを記載する。

CSSの圧縮 optimize-css-assets-webpack-plugin

optimize-css-assets-webpack-plugin
用途
cssnanoを用いて、CSSを圧縮(最適化)する。

インストールしたバージョン:5.0.3
最新バージョン:6.0.1

どのように最適化されるか
https://cssnano.co/

ドキュメント
https://www.npmjs.com/package/optimize-css-assets-webpack-plugin

postcss製のプラグインのため、postcssにcssnanoに設定を記述して、
optimize-css-assets-webpack-pluginをインストールしなくても使える。

webpack.prod本番用の設定に追加

const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

module.exports = merge(commonConfig, {
  optimization: {
    minimizer: [
            new TerserPlugin({}),
      new OptimizeCSSAssetsPlugin({}),
    ],
  },
});

オプションの指定はしないため、デフォルトで動作する


new
TerserPluginの設定がないとJavaScriptが圧縮されない。
optimizationのminimizerの設定が優先されてしまうため、デフォルトにある
TerserwebpackPluginが実行されなくなる。

画像を出力 file-loader

file-loader
用途
指定した場所に画像を出力する。

インストールしたバージョン:6.0.0
最新バージョン:6.2.0

ドキュメント
https://www.npmjs.com/package/file-loader

webpack.common共通の設定に追加

module.exports = {
  module: {
    rules: [
      {
        test: /\.(jpe?g|gif|png|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[contenthash].[ext]',
          outputPath: 'images',
          publicPath: '/images',
        },
      },
    ],
  },
};

test
画像が対象なので、画像の拡張子を記述

loader
使用するローダーの指定

name
出力するファイル名

[name]
バンドル前の名前

[contenthash]
キャッシュ対策

[ext]
バンドル前のファイルの拡張子

outputPath
画像の出力先
デフォルトでは output.path に指定したパス( public)に出力されるが指定することでpublic/images と出力される。

publicpath
出力されるCSSなどに使われている画像の出力先
プロジェクトによっては、画像が別サーバーに使われることもあるため、
出力先を変えることもある。

HTMLの画像を出力 html-loader

html-loader
用途
HTMLで使われている画像を出力させる。
webpackはデフォルトの状態だと、loadshを使っているため、htmlの画像を検知できない為、画像が出力されない。

インストールしたバージョン:1.1.0
最新バージョン:3.0.1

ドキュメント
https://www.npmjs.com/package/html-loader

webpack.common共通の設定に追加

module.exports = {
  module: {
    rules: [
      {
        test: /\.html$/,
        loader: 'html-loader',
      },
    ],
  },
};

画像を圧縮 image-webpack-loader

image-webpack-loader
用途
画像を圧縮する。

インストールしたバージョン:6.0.0
最新バージョン:8.0.1

ドキュメント
https://www.npmjs.com/package/image-webpack-loader

webpack.common共通の設定に追加

module.exports = {
  module: {
    rules: [
      {
        test: /\.(jpe?g|gif|png|svg)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[contenthash].[ext]',
              outputPath: 'images',
              publicPath: '/images',
            },
          },
          'image-webpack-loader',
        ],
      },
    ],
  },
};

複数のローダーを使えるようにuseを使う書き方に変える。
optionsを指定すれば圧縮率を指定できる。
指定しない場合デフォルトの設定になる。

loader: 'image-webpack-loader',
optios: {
 mozjpeg: {
  quality: 10,
 },
},

quality
画像の精度を指定

まとめ

開発用と本番用の設定 webpack-merge
ファイルを圧縮 terser-webpack-plugin
ソースマップの生成
ディレクトリを綺麗に掃除 clean-webpack-plugin
HTML出力 html-webpack-plugin
開発サーバー webpack-dev-server
複数のファイルの出力
ファイルを分割 splitChunksPlugin
キャッシュ対策
babelについて babel-loader、@babel/core、@babel/preset-env
対象ブラウザを指定する.browserslistrc
ポリフィルについて core-js、regenerator-runtime
eslintについて eslint-loader、eslint
コードの整形 prettier、eslint-config-prettier、eslint-plugin-prettier
sassのバンドル sass-loader、node-sass、css-loader、style-loader
CSSを個別に出力 mini-css-extract-plugin
CSS用の便利ツール postcss-loader、autoprefixer
CSSの圧縮 optimize-css-assets-webpack-plugin
画像を出力 file-loader
HTMLの画像を出力 html-loader
画像を圧縮 image-webpack-loader

についてでした。

今回はwebpackの学習をしたので総まとめでした。
自分用の備忘録なので、よくわからないとこともあるかもしれません笑
英語を読み解く力があれば、ドキュメントを見て理解できるかも。

webpack4での学習なので、今後webpack5に対応したやり方も自分で調べてまとめてみたいですね。

今までは、ファアイルを1つにまとめたりとか圧縮をしたことがなかったので、今後webpackを使ったサイト制作ができそうです。

というわけで
それでは!

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次