ES6以上のJSのトランスパイルにオススメ!
Parcel入門

モダンなフロントエンドの現場では、ES2015以降の構文を使うことがほとんどです。たとえば次に示すコードでは、ES2015で導入されたアロー関数やES Modulesを使っています。

▼ index.js

import { myFunction } from "./myFunction.js";
const todayWeather = myFunction(14);
document
  .querySelector("#weather")
  .textContent
  = todayWeather;

▼ myFunction.js

export const myFunction = temperature => {
  return `岡山県の気温は${temperature}度です`;
};

ES2015以降の構文はブラウザーによっては対応していないこともあるため、BabelでES5相当のコードに変換(トランスパイル)したり、webpackでモジュールをバンドル(複数のファイルを1つにまとめる)したりします。

しかし、それらの環境準備には設定ファイルが必要で学習コストは高めです。「モダンなビルド環境を準備したいだけなのに、なぜツールの設定に時間をとられるのか?」「環境構築に時間をかけたくない」と思っている人も多いのではないでしょうか?

Parcelパーセル」というツールを使うと、独自の設定ファイルを使うことなくBabelのトランスパイルやES Modulesバンドル環境が3ステップで作れます

▼ Babel、ES ModulesをParcelで自動ビルドしている様子

完成サンプル

本記事を通して作成するサンプルです。文字列を表示するだけのシンプルなものです。

サンプルを別ウインドウで開く

ソースファイルの構成は次のようになっています。文字列を出力するプログラムはindex.jsmyFunction.jsという2つのJavaScriptファイルで記述されています。myFunction.jsではアロー関数(() => {})が使われ、ESモジュールとしてエキスポートされています。

▼ index.js(メイン)

// myFunction.jsをインポートする
import { myFunction } from "./myFunction.js";
// 今日の天気用文字列を生成する
const todayWeather = myFunction(14);
// #weather要素のテキストとして今日の天気を設定する
document
  .querySelector("#weather")
  .textContent
  = todayWeather;

▼ myFunction.js

/**
 * 気温の数値を受け取って文字列を返す関数
 */
export const myFunction = temperature => {
  return `岡山県の気温は${temperature}度です`;
};

このサンプルコードをParcelでビルドします。

3ステップでできるBabel・ES Moduleのビルド環境

Parcelによるビルド環境は3ステップでできます。

なお、Parcelを使うにはNode.jsが必要です。手元のパソコンにインストールされていない場合は、Node.jsを公式サイトからインストールしておいてください。

STEP1. プロジェクトフォルダーに移動

今回はプロジェクトフォルダー(ウェブサイトのファイル一式が保存されるフォルダー)として、myprojectというフォルダーを使う前提で解説します。コマンドラインでmyprojectフォルダーに移動します。

▼ macOSでのフォルダーの移動のコマンド

cd /Users/★★★/myproject

▼ Windowsでのフォルダーの移動のコマンド

cd C:¥Users¥★★★¥myproject

STEP2. プロジェクトの初期化

次のnpmコマンドでプロジェクトを初期化します。

npm init -y

-yはダイアログなしにプロジェクトを初期化するためのオプション

STEP3. Parcelのインストール

Parcelを次のコマンドでインストールします。

▼ コマンド

npm i -D parcel

iinstall-D--save-devの省略形

以上でParcelの環境設定は終了です。Parcelのための設定ファイルを作成する必要はないことに注目してください。

環境構築後のフォルダー構成は、次のキャプチャーのようになります。

HTMLファイルでメインのJavaScriptを読み込む

ビルド対象のソースフォルダー構成は次のとおりです。

myproject
 ├ src
 │  ├ scripts
 │  │  ├ index.js
 │  │  └ myFunction.js
 │  └ index.html
(中略)

HTMLコードのscriptタグにてindex.jsを読み込みます。

▼ index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <!-- ★index.jsの読み込み -->
  <script src="scripts/index.js" defer></script>
</head>
<body>
<main>
  <p id="weather"></p>
</main>
</body>

ローカルサーバーの起動

Parcelによるビルド環境構築が完了したので、ローカルサーバーの起動について解説します。

ローカルサーバーとJavaScriptファイルのビルドを行うには次のコマンドを使います。--openは省略可能ですが、付与しておくとブラウザーが自動で開きます。

▼ コマンド

npx parcel src/index.html --open

src/index.htmlの箇所はフォルダー構成に応じて変更ください。

実行の様子

parcelコマンドにより、ESモジュールを使ったJavaScriptのプログラムを実行している様子を動画にしました。

▼ サンプルコードをParcelで自動ビルドしている様子

ESモジュールのバンドルの他にも、モダンなビルド環境が整っていることがわかります。いくつか紹介しましょう。

ファイルの編集と同時にリロードされる(ホットリロード)

Parcelによる開発サーバーの起動中は、ファイルを編集すると自動的にプレビューしているブラウザーがリロードされます。手動でビルドコマンドを再実行する必要はありません。

ソースマップが有効になる

Chromeの開発者ツールなどで確認すると、ソースのソースマップが正しく反映されていることがわかります。ソースマップを使うと、ビルド後のJavaScriptではなくビルド前のJavaScriptを調査できるので、デバッグに役立ちます。

▼ Google Chromeでソースマップを確認している様子

IE11でも動作する

Parcelで作成したビルドされたコンテンツはIE11でも動作します。アロー関数やESモジュールは本来IE11では対応していませんが、IE11で動作する形に変換されます。内部的にBabelによる変換が行われていることによる効果です。編集時の自動リロード(ホットリロード)も有効なので、IE11対応案件の開発にも役立ちます。

▼ IE11で動作している様子

ホスティングや納品用にビルドファイルを生成する

さて、ここまでは開発用ファイルの説明をしてきましたが、ホスティングしたり、クライアントにファイルを納品する際にはビルドファイルの生成が必要になります。

Parcelでは次のコマンドでビルドファイルを生成できます。minify(ファイル圧縮)された納品用ファイルがdistフォルダーに出力されます。

▼ コマンド

npx parcel build src/index.html

buildコマンドにはいくつかオプションがあるのであわせて覚えておくと便利です。

  • -d 出力フォルダー名:出力フォルダーを設定できます。デフォルトはdistです。
  • --no-source-maps:ソースマップを無効化できます。
  • --public-url URL名:CSSやJavaScriptのファイルに対するパスを設定可能です。デフォルトでは<script src="/index.e5f6g7.js"></script>のように/から始まるルートパスですが、--public-url ./のように設定すれば相対パスで指定できます。

公式のドキュメントもあわせて参照ください。

今回のサンプルでは、npm-scripts(参考記事『npm-scriptsのタスク実行方法まとめ』)を使ってnpm rum buildでビルドタスクが実行できるように設定しました。設定の参考にしていただければと思います。

GitHub Pagesの機能を使ってホスティングしたのが次のサンプルです。

なぜBabelやES Modulesのビルド環境にParcelが必要なのか?

ES2015以降の構文やES Modulesは、IE11を除くモダンブラウザーでの対応が増えてきているので、なぜParcelが必要なのかと感じるかもしれません。

たしかにES2015だけを見れば、IE11を除くモダンブラウザーでの対応は増えました。しかし、JavaScriptはES2015以降もES2016、ES2017、ES2018、そしてES2019へと進化を続けています。一斉にモダンブラウザーでES2019などの最新構文に対応するわけではないので、構文をクロスブラウザーで動作させるためにBabelが必要です。また、ES Modulesに未対応のブラウザーもまだ存在するので、webpackも必要です(参考『Can I use』)。

さらに、モダンなビルド環境では次のような作業も求められます。webpackやGulp.jsでBabelのトランスパイルを組みわせつつこれらの作業を行うのですが、いずれも設定ファイルの知識が必要です。

  • 各Alt以外の言語のコンパイル(Sassなど)
  • 開発中のローカルサーバー起動
  • ポリフィルのバンドル
  • モジュールの遅延読み込み(import()メソッド)
  • 使用しないモジュールを削除する(Tree Shaking)
  • 出力ファイルの最適化

Parcelでは設定ファイルを使う必要はありません。1行のコマンドを実行するだけで、ビルド環境が整います。細かい設定やチューニングとなるとwebpackにカスマイズ性は劣るものの、環境構築に時間をかけず、コンテンツの作り込みに時間をかけることができるのは大きなメリットです

とは言え、Parcelはwebpackを完全に置き換えるものではありません(参考記事『Sassのモダンなコンパイル環境が3分で作れるParcel入門』)。どちらも長所・短所があるので、理解して使い分けることが肝要です。

環境構築に時間をかけるのはもうやめよう

我々がかけるべき時間は環境構築ではなく、コンテンツの作り込みです

Parcelは独自設定ファイルがないため、学習コストが低いです。わずか3ステップでモダンなビルド環境が構築できるというのは時間短縮の観点で大きなメリットと言えるでしょう。

Parcelはまだまだ魅力がたくさんあります。次の記事で学ぶと、より理解が深まるでしょう。