「webpack実践入門」の感想・忘備録1

Kindle本「webpack実践入門」のまとめ。

点数

92点

感想

とても分かりやすかった。
webpack.config.jsの書き方が分かりづらいと思っていたが、しっかりと理解することができた。
babelはバージョンが7.4になったことでnpmのパッケージ名が変わったり、polyfillのやり方が変わったりしていて、Web上では新旧の情報が混ざっている状態だと思う。

環境構築

  1. npm init -y
  2. npm install --save-dev webpack webpack-cli
  3. npm install --save jquery
    フロントエンド開発の場合、npmとして配布するわけではないので全て–save-devでも問題ない。
    ただし、ブラウザが実行時に必要とするものは–save、それ以外は-save-devとしておくと、ライブラリの区別が容易になる。お作法。
  4. package.jsonのscriptsに”buile”: “webpack”を追加
  5. webpack.config.jsを作成
  6. モジュールを作成
    src/js/modules/add.js
    src/js/modules/tax.js
  7. エントリーポイント作成
    src/js/app.js
  8. npm run build
const path = require('path');

module.exports = {
  // モードの設定(モードを指定しないとwebpack実行時に警告が出る)
  mode: 'development',
  // エントリーポイントの設定
  entry: './src/js/app.js',
  // 出力の設定
  output: {
    // 出力するファイル名
    filename: 'bundle.js',
    // 出力先のパス(絶対パスを指定しないとエラーが出るので注意)
    path: path.resolve(__dirname, 'public/js')
  }
};
export default function add(number1, number2) {
  return number1 + number2;
}
export default function tax(price, salesTax) {
  return Math.round(price * salesTax);
}
import $ from 'jquery';
import add from './modules/add';
import tax from './modules/tax';

const item1Price = 400;
const item2Price = 600;
const totalPrice = add(item1Price, item2Price);
const salesTax = 1.1;
const priceIncludeTax = tax(totalPrice, salesTax);

$('body').text(priceIncludeTax);

ローダー

ローダーとは

主にJavaScript以外のファイルをバンドルするためのプログラム。
SassやTypeScript、Vueコンポーネントなどのコンパイル、画像をDataURLに変換、など。
コードをチェックするESLintのような、変換以外の目的のローダーも存在する。

babel-loader

JavaScriptをES5にトランスパイルするためのローダー。

  1. npm install --save-dev babel-loader @babel/core @babel/preset-env
  2. webpack.config.jsにmoduleプロパティを追加
module: {
  rules: [
    {
      // ローダーの処理対象ファイル
      test: /\.js$/,
      // ローダーの処理対象となるディレクトリ
      include: path.resolve(__dirname, 'src/js'),
      use: [
        {
          // 利用するローダー
          loader: 'babel-loader',
          // ローダーのオプション
          options: {
            presets: [['@babel/preset-env', { modules: false }]] // modulesはimport文の変換の指定。falseの場合は書かなくてもOK(デフォルトがauto=falseなので)
          }
        }
      ]
    }
  ]
}

※Babel7.4でのPolyfill関連は以下のサイトにわかりやすくまとめてある https://qiita.com/soarflat/items/21b8955f992bf7d38581

sass-loader/css-loader/style-loader

  • sass-loader
    Sassをコンパイルするためのローダー。
  • css-loader
    CSS をモジュールに変換するためのローダー。
  • style-loader
    css-loader で変換したCSSを<style>タグで出力するためのローダー。
  1. npm install -save-dev sass-loader node-sass css-loader style-loader
  2. app.jsにscssファイルのimportを追加
    import '../scss/style.scss';
  3. webpack.config.jsのmodule.rulesに設定を追加
{
  // ローダーの処理対象ファイル
  test: /\.scss$/,
  // ローダーの処理対象となるディレクトリ
  include: path.resolve(__dirname, 'src/scss'),
  // 利用するローダー
  // sass-loader css-loader style-loader の順で実行される
  use: [
    // css-loader で変換したCSSを<style>タグで出力する
    'style-loader',
    // CSS をモジュールに変換する
    'css-loader',
    // Sass を CSS にコンパイルする
    'sass-loader'
  ]
}

url-loader

CSSで使用している画像をDataURLに変換してバンドルするためのローダー。

  1. npm install -save-dev url-loader
  2. webpack.config.jsのmodele.rulesに設定を追加
{
  // ローダーの処理対象ファイル
  test: /\.(png|jpg|gif)$/i,
  // ローダーの処理対象となるディレクトリ
  include: path.resolve(__dirname, 'src/images'),
  // 利用するローダー
  loader: 'url-loader'
}

file-loader

全ての画像をバンドルしてしまうと以下のデメリットがある。

  • DataURLに変換することで、元画像よりもサイズが大きくなる(Base64でエンコードされたデータは1/3程度大きくなる)
  • JavaScriptの解析時間が長くなる

そのため、file-loaderを使って大きい画像はそのままファイルとして出力し、小さい画像だけをバンドルするのが一般的。

  1. npm install -save-dev file-loader
  2. webpack.config.jsのurl-loaderにoptionsを追加(rulesにfile-loaderは不要)
options: {
  // 画像のファイルサイズが 10KB以上だったら DataURL に変換せずに出力する
  limit: 10240,
  // 出力する DataURL に変換しなかった画像の名前 [name].[ext]は [バンドル前のファイル名].[[バンドル前のファイルの拡張子]
  name: '[name].[ext]',
  // DataURL に変換しなかった画像の出力先(デフォルトでは output.path に指定したパス(今回は public/js)に出力される)
  outputPath: '../images/',
  // 出力されるファイルからの画像の読み込み先
  publicPath: path => './images/' + path
}

ローダー設定の書き方は色々ある

webpack.config.jsが分かりづらい原因の1つだと思う。

  • 複数のローダーを利用する場合は、useに配列で記述する。
use: [
  'style-loader',
  'css-loader',
  'sass-loader'
]
  • 1つでもoptionsを指定する場合はオブジェクト配列で記述する。
use: [
  {
    loader: 'babel-loader',
    options: {
      presets: [['@babel/preset-env', { modules: false }]]
    }
  },
  {
    loader: 'jshint-loader'
  }
]
  • ローダーが1つの場合はuseを省略することができる。
test: /\.js$/,
include: path.resolve(__dirname, 'src/js'),
loader: 'babel-loader',
options: {
  presets: [['@babel/preset-env', { modules: false }]] // modulesはimport文の変換の指定。falseの場合は書かなくてもOK(デフォルトがauto=falseなので)
}

【新しい記事】

【古い記事】

コメントを残す

メールアドレスが公開されることはありません。