LoginSignup
4
3

More than 5 years have passed since last update.

Browserifyユーザーがwebpackを覚え始めるには

Last updated at Posted at 2017-11-10

JavaScriptのバンドラーには今のところBrowserifyを使っているけど、webpackもどんなものか把握したいという人のための記事です。

記事執筆時点(2017/11)では、webpackのバージョンは3.8.1です。

とりあえずJavaScriptをバンドルする例

まずは単純な設定でwebpackを使ってみます。
必要なnpmパッケージはその名の通りwebpackだけです。インストールしましょう。

npm install --save-dev webpack

基本的に、webpackの設定はwebpack.config.jsというJavaScriptファイルに書いていきます。
このファイルをpackage.jsonなどと同じディレクトリに作ります。
これが基本ですが、以下の様にもできます。

  • (npm scriptsやgulpなどを通して)webpackを実行する際のオプションによって、明示的に設定ファイルを指定してもよい。
  • ファイル名をwebpack.config.babel.jsにすれば、設定ファイルの中でES2015のimport/exportを使える。詳細はこちら。そうしなくてもconstなどは使えるらしく、公式サイトのサンプルでもwebpack.config.jsの中でconstを使っている(この記事でもそうします)。

とりあえずJavaScriptをバンドルする設定の例として、webpack.config.jsを以下の様に書きます。

webpack.config.js
const path = require('path'); // Node.jsの組み込みのモジュール

// 各種設定を含んだオブジェクトをexportするのが基本の書き方。
module.exports = {
  entry: './src/js/index.js', // エントリーポイントとなるjs
  output: {
    filename: 'bundle.js', // バンドルされて出力されるjsのファイル名
    path: path.resolve(__dirname, 'dist') // バンドルの出力先ディレクトリ
    // pathは絶対パスである必要があり、絶対パスを簡単に指定するためにpath.resolve()を使っている。
  }
};

そうしたら、npm scriptsからwebpackコマンドを実行するなどして、webpackを実行します。
これで、Browserifyと同じ様にJavaScriptをバンドルできます。

webpackを通してBabelを使う

次の一歩として、ES2015+で書かれたJavaScriptをトランスパイルするために、webpackを通してBabelを使う例を紹介します。
既にBabelを使っている人向けの説明ということで、Babel自体の説明は省略します。

まずはbabel-loaderというnpmをインストールします。

npm install --save-dev babel-loader

他にも、Babel自体を使うためにbabel-corebabel-preset-envなども必要ですが、今までBabelを使っていた人なら既にインストールしているだろうという想定で、省略します。

そして、以下の様に設定を追加すればOKです。これでトランスパイルできるようになります。

webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  // ここから追加
  module: {
    rules: [
      {
        // src/jsディレクトリ以下のjsファイルに、"babel-loader"を適用する。
        test: /\.js$/,
        include: path.resolve(__dirname, 'src/js'),
        use: [ 'babel-loader' ]
        // Babelに関する設定をここに書き加えることもできるが、この例では.babelrcファイルに別途書いてあるものとする。
      }
    ]
  }
};

さらっとbabel-loaderというものが登場しました。
ローダーというのはwebpackの核となる概念の一つで、JavaScriptの中で何かをimportする際の前処理を行います。
babel-loaderは、Babelを使ったトランスパイルを行うローダーであり、上記の例ではそれをjsファイルに適用しているわけです。

webpackを通してUglifyJSを使う

別の例として、バンドルしてできたbundle.jsを圧縮するために、webpackを通してUglifyJSを使う例を紹介します。

今度はuglifyjs-webpack-pluginというnpmをインストールします。
これのdependencyにuglify-jsが含まれているようで、uglifyjs-webpack-pluginだけインストールすればOKです。

npm install --save-dev uglifyjs-webpack-plugin

そして、以下の様に設定を追加すればOKです。

webpack.config.js
const path = require('path');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin')

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist') 
  },
  // ここから追加
  plugins: [
    new UglifyJSPlugin() // 色々とオプションの指定もできるが、今回の例では何も指定しない。
  ]
};

今度はuglifyjs-webpack-pluginというものが登場しました。
プラグインもwebpackの核となる概念の一つで、ローダーにはできないその他もろもろの処理を行わせることができます。
uglifyjs-webpack-pluginは、単純にJavaScriptにUglifyJSを適用するプラグインです。

ここから先、どのようにwebpackを覚えていくか

以上がwebpackの基礎となります。まずentryとoutputを与えて、必要に応じてローダーやプラグインを取り入れていくことになります。

webpackのことをもっと知るには、まずは公式ドキュメントのCONCEPTSに一通り目を通すのがおすすめです(CONCEPTS直下のConseptsのページだけでなく、Entry Points、Outputなどのページを一通り)。

設定の書き方を詳細に知るには、CONFIGURATIONを見ます。
結構な量の項目があり、知りたい時に知りたい部分を見るのが良いと思います。

APIには、一口に"API"とまとめるのもどうかというぐらい、色々な意味でのAPIが説明されています。

GUIDESでは、上から順に読み進みながら、webpackの役立つ使い方を把握していくことができます。
CONCEPTSの次ぐらいに読むといいかも。自分に必要ないと思う部分はとりあえず読み飛ばしてもOK。

LOADERSPLUGINSには、主なローダーとプラグインがずらっと並んでいます。
ざっと眺めて、自分に役立ちそうなものを探すといいでしょう。

ここから先、どのようにwebpackを使っていくか

uglifyjs-webpack-pluginの例を見た時、「webpackの中でわざわざプラグイン経由でuglifyせずに、webpackの後に素のuglifyを呼べば良いのでは」と思った人もいるのではないでしょうか。それはそれで正しいと私は思います。

設定を追加していけば、webpackはあれもこれもできるようになります。そうしても良いですし、使い慣れた素のnpmパッケージが他にあるなら、webpackの前後でそれを呼ぶようにしても良いでしょう。

他にもwebpackを使えば、スタイルシートや画像さえもJavaScriptの中でimportできるようになったりもします。この域に来ると、バンドルする元となるソース自体にwebpack流の書き方が入ってきます。

どこまでwebpackを活用するかは、自分の状況に応じて自分で決めていくのが良いと思います。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3