SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

HTML/JavaScript開発作業を効率化する便利ツールの活用

JavaScriptタスク自動化のもう一つの選択肢、「gulp」の利用法

HTML/JavaScript開発作業を効率化する便利ツールの活用 第5回


  • X ポスト
  • このエントリーをはてなブックマークに追加

プラグインの活用とストリームによる連続処理

 ここまではgulp単体でシンプルなタスクを実行させてきましたが、実際はさまざまなプラグインを組み合わせて、より複雑なタスクを実行することになるでしょう。本章ではJavaScriptファイルを加工するプラグインを例に、プラグインの利用法を紹介します。また一連の処理を連続して実行するストリームの概念や、その処理内容を記述するメソッドチェーンについても説明します。

サンプルの説明

 本章で取り上げるサンプル(サンプルコード内のHello_gulp_4)は、JavaScriptで背景色をランダムに変更するシンプルなWebページです。

図5 今回使用するサンプル(Hello_gulp_4)の実行例
図5 今回使用するサンプル(Hello_gulp_4)の実行例

 Hello_gulp_4サンプルは表2のような構成になっています。gulpタスクによる処理の対象となるのはcolor.jsです。

表2 Hello_gulp_4サンプルの構成
フォルダ ファイル ファイル内容
Hello_gulp_4 index.html Webページファイル
Hello_gulp_4/js_src color.js 背景色を変更する処理のJavaScriptファイル

複数プラグインの処理をメソッドチェーンでつなげる

 今回は表3のgulpプラグインを組み合わせて用いることで、JavaScriptからログ出力コードを削除して最小化します。

表3 Hello_gulp_4サンプルで利用するgulpプラグイン
名前 機能
gulp-strip-debug console.logなどのログ出力コードを削除
gulp-uglify JavaScriptの最小化

 プラグインを利用するためにはリスト7のようにnpm installコマンドで事前にインストールします。

リスト7 フォルダ内でgulpをインストールするコマンド
npm install --save-dev gulp-strip-debug
npm install --save-dev gulp-uglify

 なお、サンプルファイルをそのまま利用する場合は、パッケージファイル(package.json)にgulpとプラグインを定義済みなので「npm install」コマンドでgulpとプラグイン一式をインストールできます。

 タスクを定義したgulpfile.jsをリスト8に示します。

リスト8 JavaScriptのログ出力コード削除/最小化タスク(Hello_gulp_4/gulpfile.js)
// gulpの指定 ...(1)
var gulp = require("gulp");

// gulpプラグインの指定 ...(2)
var stripDebug = require("gulp-strip-debug");
var uglify     = require("gulp-uglify");

// defaultタスクの定義 ...(3)
gulp.task("default", function() {
    return gulp.src("js_src/*.js")      // 処理対象を指定        ...(4)
        .pipe(stripDebug())             // ログ出力コードを削除  ...(5)
        .pipe(uglify())                 // 最小化                ...(6)
        .pipe(gulp.dest("js"));         // ファイル出力          ...(7)
});

 以下でリスト8の内容を説明します。最初に(1)でgulpを、(2)でgulpプラグインを読み込みます。

 (3)がタスク定義です。まず(4)のgulp.srcメソッドで処理対象ファイル(js_src配下の*.jsファイル)を指定します。gulp.srcメソッドの返り値は、処理対象ファイルのストリームを表すJavaScriptオブジェクトになります。

 ストリームオブジェクトに対してpipeメソッドを実行すると、引数で指定された処理を処理対象ファイルに行い、処理済みのストリームオブジェクトを返します。そのため複数の処理をpipeメソッドのメソッドチェーンでつなげて記述できます。ここではgulp-strip-debugプラグインによるログ出力コードの削除(5)と、gulp-uglifyプラグインによる最小化(6)を行っています。このとき一連の処理はメモリ上で連続して行います。(5)の処理結果を一時的にファイルに書き出し、それを改めて読み込んで(6)で処理するといったことは行いません。

 (7)のgulp.destメソッドはストリームの出力先を指定するメソッドです。すべての処理を終えたストリームをjsフォルダに出力するよう記述しています

 このようにgulpでは、一連の処理をストリームとしてメモリ上で高速に処理できます。この特徴からgulpは「ストリーミングビルドシステム」と呼ばれ、タスクごとに結果をファイルに出力するGruntとの大きな違いになっています。ストリームの処理内容をメソッドチェーンで直感的に記述できるのもgulpの利点です。

 リスト8のタスクを実行すると、JavaScriptファイルに対するログ出力コード削除と最小化を行えます。

図6 処理前後のJavaScriptファイル(上:処理前、下:処理後)
図6 処理前後のJavaScriptファイル(上:処理前、下:処理後)

プラグインの補足説明

 リスト8(6)のuglifyメソッドにはリスト9のようにJavaScriptオブジェクトでオプションを指定できます。

リスト9 gulp-uglifyプラグインのオプション指定
.pipe(uglify({
    mangle: false,        // 関数/変数名を最小化しない
    output: {
        max_line_len: 128 // 1行の最大文字数を設定
    }
}))

 主なオプションを表4に示します。preserveCommentsはすべてのコメントを残す「all」、ライセンスコメントのみ残す「license」などが指定できます。output、compressはgulp-uglifyプラグインが利用するJavaScript最小化ツールであるUglifyJSに引き渡す出力オプション/圧縮オプションをJavaScriptオブジェクトで指定します。オプションの詳細はUglifyJSのドキュメントを参照してください。

表4 gulp-uglifyプラグインの主なオプション
名称 内容 デフォルト値
mangle 関数/変数名を最小化する true(行う)
output 出力オプション null(指定なし)
compress 圧縮オプション {}(指定なし)
preserveComments ソースコードコメントを残す まったく残さない

 一方gulp-strip-debugプラグインには指定できるオプションはなく、単純にログ出力コードの削除を行います。リスト8(6)の行をコメントアウトして(最小化を無効にして)タスクを実行すると、gulp-strip-debugプラグインによりconsole.logメソッドの行が「void 0;」と置き換えられることが確認できます。この「void 0;」記述はgulp-uglifyプラグインが行う最小化により完全に削除されます。

図7 gulp-strip-debugプラグインによるログ出力コードの削除(上:削除前、下:削除後)
図7 gulp-strip-debugプラグインによるログ出力コードの削除(上:削除前、下:削除後)

まとめ

 本記事では、JavaScriptのタスク実行ツール「gulp」についてサンプルを用いて概要と特徴を紹介しました。機能的にはGruntと類似していますが、並列処理や一連の処理を記述するメソッドチェーンなどGruntにない特徴を備えており、使い分けを検討するに値するツールになっています。

 次回はgulpのAPIについて詳細を説明し、gulpの変更監視機能といくつかのプラグインを組み合わせたより実践的な利用法を紹介します。またGruntとgulpを比較し、場合によってどちらを使うべきかを考察します。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
HTML/JavaScript開発作業を効率化する便利ツールの活用連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト  吉川 英一(ヨシカワ エイイチ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9047 2016/02/10 20:18

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング