webpack + Babelで始める新しいJavaScript - 3

前回はES2015で追加された機能のなかでよく使うものを紹介いたしました、
紹介していませんが、関数実行時の引数不足で起こる不具合を防ぐ『デフォルト引数』や、可変長引数の関数の作成をわかりやすくする『rest引数』、prototypeで実装していたクラスを書きやすくした『class構文』などもあります。小規模な開発だと使わなくても困らないので割愛しましたが、どれも便利なのでJavaScriptを続けていると使う時が来ると思います。

第1回で必要なnodeモジュールはインストールしているので、トランスパイルの準備から始めます。まずは、コマンドラインで作業フォルダへの移動をお願いいたします。

移動は次のコマンドをコマンドラインツールで実行してください。

cd 作業ディレクトリのパス(使用している作業ディレクトリのパスを指定してください。)

webpack用の設定ファイルを作る

トランスパイルをする前に、webpackの設定ファイルを準備します。下記のコードをコピーペーストして、『webpack.config.js』のファイル名で作業フォルダに保存してください。


module.exports = {
  entry: './src/entry.js',
  output: {
    filename: './dest/bundle.js'
  }
}

設定ファイルはJSON形式で記載します。例の各オプションの内容を簡単にまとめると以下の通りです。

entry もとにするjsファイルを指定する
output.filename jsファイルをまとめた後、出力するファイル名を指定する

これはwebpackを実行するために、最低限必要な情報です。例では、srcディレクトリ内のentry.jsをもとにして、destディレクトリ内にbundle.jsとして出力するように設定しています。

本来はきちんと内容を理解した上で使うのが一番なのですが、今回は、ES2015の体験が最優先なので、ひとまずコピーペーストで問題ありません。

webpack.config.jsにBabelを使う指示を記載する

moduleプロパティにrulesプロパティを定義し、ファイルごとに使用するloaderを設定していきます。loaderはwebpackでファイルを読み込むために使うものという認識で今は問題ありません。
今回はjsファイルをbabel-loaderに通したいので、webpack.config.jsを以下のように書き換えて、上書き保存してください。


module.exports = {
  entry: './src/entry.js',
  output: {
    filename: './dest/bundle.js',
  },
  module: {
    rules: [{
      test: /\.js$/,
      use: 'babel-loader'
    }]
  }
}

testプロパティにファイル名、useプロパティに使用するloaderを記載します。
この設定を追記することで、webpackが.jsファイルを読み込む際に、Babelを経由するようになります。loaderには他にも、画像ファイル用、sassファイル用など様々なものがありますので、使う際に調べてみることをおすすめします。

webpackを実行するための設定を『package.json』の『scripts』に追記する

wbpackはインストール済みですが、そのままでは実行するためのコマンドが長くなるので、package.jsonのscriptsプロパティに以下の内容を追記して、上書き保存してください。

"webpack": "webpack",

追記後package.jsonが次の例のようになっていれば大丈夫です。


{
  "name": "※※※作業フォルダ名※※※",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "webpack": "webpack", 
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-es2015": "^6.24.1",
    "webpack": "^3.8.1"
  }
}

この設定を追記した後、コマンドラインで『npm run webpack』と記載して実行することで、webpackが実行されるようになります。

Babelの動作設定を『package.json』に追記する

BabelはデフォルトのままだとES2015形式を変換してくれませんので、変換するように指示する必要があります。『package.json』に以下の内容を追記します。


"babel": {
  "presets": ["es2015"]
},

追記後package.jsonが次の例のようになっていれば大丈夫です


{
  "name": "※※※作業フォルダ名※※※",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "webpack": "webpack", 
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "babel": {
    "presets": ["es2015"]
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-es2015": "^6.24.1",
    "webpack": "^3.8.1"
  }
}

確認用のhtmlファイルを準備する

ブラウザ確認用のhtmlファイルは事前に準備します。次の内容でhtmlファイルを作成し、destディレクトリに保存してください。


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>webpack+BabelでES2015</title>
</head>
<body>
  <h1>webpack+BabelでES2015</h1>
  <script src="./bundle.js"></script>
</body>
</html>

保存後、ディレクトリ構成は次のような形になっています。


作業フォルダ
├─package.json
├─webpack.config.js
├─dest
│ └─index.html
└─node_modules
  └─省略

body閉じタグの直前で、bundle.jsを読み込むようにしています。しかし、現在時点でbundle.jsは存在しないためhtmlファイルを開いても何も起こりません。

jsファイルを準備してトランスパイルする

長かったのですがここからが本題です。実際にトランスパイルを行います。
ページを開いたときにページタイトルをアラートで表示するライブラリと、それを読み込むjsファイルを作成し、srcディレクトリに保存します。
動作の確認はブラウザで行いますので、上で作成したhtmlファイルを事前にブラウザで開いておくと確認しやすいのでおすすめです。

それでは下記のコードをそれぞれコピーペーストして、srcディレクトリに保存してください。

library.js


const AlertTitle = function () {
  window.addEventListener('load', ()=>{
    alert(document.title);
  })
}

export default AlertTitle

entry.js


import AlertTitle from './library.js'

const App = new AlertTitle();

最終的に次の例のようなディレクトリ構成になっていれば問題ありません。


作業フォルダ
├─package.json
├─webpack.config.js
├─dest
│ └─index.html
├─src
│ ├─library.js
│ └─entry.js
└─node_modules
  └─省略

ここまで完了したら準備完了です。残りは、webpackを実行してBabelでトランスパイルを行うのみです。コマンドラインツールで、次のコマンドを実行してください。

npm run webpack

エラーが発生せずコマンドプロンプトに戻ったら成功です!destディレクトリを開いて、bundle.jsが出力されていることをご確認ください。

ファイルを確認した後、ブラウザを更新すると、ページタイトルがアラートで表示されるはずです。これでwebpack + babelを使った新しいJavaScriptは終了です。

npmからjQueryをダウンロードして、インポート

このままではあまりにも実用向けではないので、使用頻度の高そうなjQueryのダウンロードとインポートまでを紹介いたします。

jQueryなどの汎用的なライブラリはnpmのサーバーからダウンロードすることが可能です。ダウンロード後はスクリプト内で読み込ませることが可能です。まずはコマンドラインツールで次のコマンドを実行して、jQueryのダウンロードをお願いします。

npm i -S jquery

その後、entry.jsを次のように書き換えて、再度webpackを実行してください。


import $ from 'jquery'
import AlertTitle from './library.js'

AlertTitle();

$('body').append('<p>jQuery Add</p>');

ブラウザを更新すると、jQuery Addという文字列がブラウザに表示されたと思います。npmでダウンロードした後はjQueryの記法も手軽に使えるようになります。これはES2015ではなく、npm(node)とwebpackの機能ですが、ライブラリの管理が非常に楽になります。

まとめ

2017年ですがES2015の使い方についてまとめさせていただきました。
実はこの記事だけでは情報は足りていません。webpackのloaderや、Polyfillのことなど、知らないと不便なことはまだまだあります。JavaScript界隈は日進月歩で新しい仕様が導入されているので、まずはES2015の理解を深められるように励みます。

準備することが多く、手間がかかるように見えますが、よく使うモジュールを記載したpackage.jsonを事前に用意しておけば、npmコマンドですぐに準備が整うので新しいプロジェクトとは相性が良いのです。どうぞ一度お試しください。
業務で使うことはまだ少ないかもしれませんが、使ったことが無い方は一度使ってみることをおすすめいたします。

この記事がES2015以降のJavaScriptの技術に触れるきっかけになれば幸いでございます。

すべての人にインターネット
関連サービス