SHOEISHA iD

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

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

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

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

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


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

シンプルなタスクでgulpの特徴を理解

 ここではシンプルなタスクを実行させるサンプルでgulpの利用法と特徴を説明します。

はじめてのgulpタスク

 最初にgulpで単一のタスクを実行させます(このサンプルはサンプルコード内のHello_gulp_1フォルダに含まれています)。まず任意のフォルダを作成してリスト2のコマンドを入力し、gulpを使えるようにします。ここでインストールしたgulpは実際のタスク処理に利用されます。

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

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

 次にgulpの設定ファイルgulpfile.jsをリスト3のように作成します。

リスト3 シンプルなgulp設定ファイル(Hello_gulp_1/gulpfile.js)
// gulpの指定 ...(1)
var gulp = require("gulp");

// defaultタスクの定義 ...(2)
gulp.task("default", function() {
    console.log("first gulp task");
});

 (1)でgulpのオブジェクトを変数gulpに生成し、(2)でdefaultタスクを生成しています。コンソールに文字列を出力するだけのタスクです。

 準備ができたらコマンドプロンプトでgulpコマンドを実行します。

リスト4 gulpでdefaultタスクを実行
gulp

 リスト4のコマンドにより、リスト1でシステム自体にインストールされたgulpがコマンドラインツールとして実行され、リスト2でフォルダにインストールされたgulpを呼び出して実際のタスク処理を行います。

 リスト4のように引数なしでgulpコマンドを実行するとdefaultタスクが実行されます。その結果、図2のようにコンソールに文字列が出力されます。

図2 gulpタスクの実行結果(Hello_gulp_1/gulpfile.js)
図2 gulpタスクの実行結果(Hello_gulp_1/gulpfile.js)

 なお「gulp <タスク名>」と引数にタスク名を指定することで、実行するタスクを明示的に指定できます。

タスクの並列実行

 次にタスクの並列実行を試します(このサンプルはサンプルコード内のHello_gulp_2フォルダに含まれています)。gulpfile.jsをリスト5に示します。

リスト5 gulpでタスクを並列実行(Hello_gulp_2/gulpfile.js)
// gulpの指定 ...(1)
var gulp = require("gulp");

// defaultタスクの定義 ...(2)
gulp.task("default", ["task1", "task2"]);

// task1タスク ...(3)
gulp.task("task1", function() {
    setTimeout(function(){
        console.log("task1 executed with delay.");
    }, 1000);
});

// task2タスク ...(4)
gulp.task("task2", function() {
    console.log("task2 executed.");
});

 (2)のようにtaskメソッドの第2引数にタスク名の配列を指定すると、それらのタスクが並列に実行されます。ここでは(3)のtask1タスクと(4)のtask2タスクが実行されますが、task1タスクはsetTimeoutによりタスク完了が1秒遅延します。

 リスト5のgulpfile.jsを配置してgulpを実行すると、task1タスクとtask2タスクが並列実行されます。task2タスクはtask1タスクの完了を待たず並列実行されるため、図3のようにtask2のコンソール出力が先に行われます。

図3 task1(緑枠部)を待たずにtask2(赤枠部)を実行(Hello_gulp_2/gulpfile.js)
図3 task1(緑枠部)を待たずにtask2(赤枠部)を実行(Hello_gulp_2/gulpfile.js)

 このようにgulpでは特に意識しなくてもタスクが並列実行されるため、タスク完了待ちによる実行時間の増加を最低限に抑えられます。

タスクを順番に実行するには

 gulpではタスクを並列化せず順番に実行することもできます(このサンプルはサンプルコード内のHello_gulp_3に含まれています)。task2タスクの実行をtask1タスク完了後に行いたい場合はリスト6のようにします。

リスト6 gulpでtask1→task2の順に実行する例(Hello_gulp_3/gulpfile.js)
// gulpの指定 ...(1)
var gulp = require("gulp");

// defaultタスクの定義 ...(2)
gulp.task("default", ["task2"]);

// task1タスク ...(3)
gulp.task("task1", function(callback) {
    setTimeout(function(){
        console.log("task1 executed with delay.");
        callback();
    }, 1000);
});

// task2タスク ...(4)
gulp.task("task2", ["task1"], function() {
    console.log("task2 executed.");
});

 task2タスク(4)で第2引数の["task1"]という記述は、自身より先にtask1タスクを実行するという依存依存を表します。またtask1タスク(3)ではタスク完了時に実行するコールバック関数callbackを記述することで、後続する依存タスク(=task2タスク)の実行を待たせることができます。defaultタスク(2)ではtask2のみを実行するように記述しますが、(4)の依存関係によりtask1タスクが先に実行されるようになります。

 リスト6のタスクを実行すると、task1タスク→task2タスクの順で実行されてコンソール出力が行われるようになります。

図4 task1(緑枠部)→task2(赤枠部)の順番でタスク実行(Hello_gulp_3/gulpfile.js)
図4 task1(緑枠部)→task2(赤枠部)の順番でタスク実行(Hello_gulp_3/gulpfile.js)

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

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング