Webpack 2におけるTree Shakingの活用

Tree Shakingとは

Tree Shakingは、JavaScriptバンドラーであるWebpackが提供する機能で、使用されないコード(デッドコード)を効率的に除去する仕組みです。この技術により、最終的なビルドサイズを小さく抑えることが可能です。

一般的にデッドコードとみなされるパターンは以下の通りです:

  • 実行されないコード(到達不能なコード)
  • 実行結果が使われないコード
  • 読み込まれない変数にのみ影響を与えるコード(書き込みのみで読み込みがない)

Tree Shakingを有効にする条件

Tree Shakingが正しく機能するにはいくつかの条件があります。

  • ES6のimport / export構文を使用すること
    ES6モジュールは静的に解析可能であり、依存関係が実行時ではなくビルド時に決定されるため、静的解析が可能になります。
  • Webpackの設定で適切に最適化オプションを指定すること
    特にmode: 'production'を指定することで、最適化が自動的に有効化されます。

CommonJSとES6モジュールの違い

Tree Shakingを使うにはES6モジュールの構文が必要です。これはCommonJSとの仕組みの違いによります。

  • CommonJS
    - 動的インポートが可能
    - モジュール全体を値のコピーとして出力
    - 実行時に依存関係が解決される
  • ES6 Modules
    - 静的解析が可能
    - 各関数や変数を個別にエクスポート可能
    - 参照が渡されるため、値の変更が反映される

動作検証

プロジェクトの準備

まず、プロジェクトを初期化します。

npm init -y

必要なWebpackパッケージをインストールします。

npm install webpack webpack-cli --save-dev

ファイル構成

以下のファイルを準備します:

  • index.html - メインのHTMLファイル
  • index.js - エントリーポイント
  • test.js - 使用する関数を定義
  • vue.js - Vue風オブジェクト
  • webpack.config.js - Webpackの設定ファイル

index.html

<html>
  <head>
    <meta charset="utf-8" />
    <title>Tree Shakingの確認</title>
  </head>
  <body>
    <script src="./dist/main.js"></script>
  </body>
</html>

index.js

import vue from './vue';
import test from './test';

vue.methods.fnA();
test.funcB();

test.js

export function funcA() {
  console.log('func A');
}

export function funcB() {
  console.log('func B');
}

vue.js

export default {
  data() {
    return {};
  },
  methods: {
    fnA() {
      console.log(11);
    },
    fnB() {
      console.log(222);
    }
  }
};

webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  }
};

ビルド結果

Webpackでビルドした結果、test.jsのfuncAは使われていないため、出力ファイルには含まれません。

(() => {
  "use strict";
  var e = {};
  (e => {
    "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" });
    Object.defineProperty(e, "__esModule", { value: true });
  })(e);
  ({
    data() {},
    methods: {
      fnA() { console.log(11); },
      fnB() { console.log(222); }
    }
  }).methods.fnA(), e.default.funcB();
})();

このようにして、Tree Shakingによって不要なコードが削除されていることが確認できます。

タグ: webpack tree-shaking es6-modules javascript optimization

8月2日 12:39 投稿