gulp.jsで広告タグの開発環境を整える

     - プログラム言語 , ,  


SEOの観点から、サイト表示速度の高速化のためJavaScriptファイルから不用な空白や改行、
コメントを除去したりやローカル変数名を短縮するminifyが奨励されていますが、
これはタスクランナーのgulp.jsとプラグインを使って自動化する事が可能です。

※gulpの基本的な使い方については下記などを参照下さい。
はじめてのgulp

さて、広告タグやトラッキングタグなど外部サイトに配布するタグの開発をしていると、
開発環境/商用環境で定数を出し分けたい場合が多々あります。
APIのendpointを分けたい…といったような状況です。

minify自体は難読化ツールuglify.jsのgulpプラグインで可能ですが、
単純に圧縮してしまうと環境別のコンパイルが出来ません。
下記の様にコマンドラインで環境を指定して条件付けが出来ると、
Jenkinsと連携して環境別にジョブを登録する場合などに便利かなと思い、やってみました。

gulp compress --ENV production

のような形式で環境に合わせたコンパイルが出来るようになります。

必要なnpmモジュール

  • gulp //タスクランナー
  • gulp-uglify //難読化ツールuglify.jsのgulpプラグイン
  • gulp-rename(任意) //gulpでファイルをリネームするプラグイン
  • minimist //コマンドライン引数のparser

コード

JSON形式のコンフィグを用意します。

config.json

{
    "development" : {
        "host" : "dev.example.com"
    },

    "production" : {
        "host" : "prod.example.com"
    }
}

source.js

…
//圧縮したいファイル。このhostをコンパイル時に環境に応じて書き換えたいとする
var host = __HOST__;
…

gulpfile.js

'use strict'
var gulp = require('gulp'),
    uglify = require('gulp-uglify'),
    rename = require('gulp-rename'),
    minimist = require('minimist'),
    config = require('./config.json');

// minimistでコマンドライン引数をパース
var args = minimist(process.argv.slice(2)),
// 変数envに、CLI引数のENVに応じたconfig.jsonのオブジェクトを格納
    env = config[args.ENV];

// uglifyの引数に取るオブジェクト。compress.global_defsのプロパティに
// { 圧縮前ファイルの定数名 : 圧縮後のリテラル } を指定。 
var compileCondition = {
    compress: {
        global_defs: {
            //ここでは、__HOST__をconfig.jsonのhostで書き換えます。
            __HOST__: env.host
        }
    }
};

function compress(condition) {
    gulp.src('./source.js')
        .pipe(uglify(condition))
        .pipe(rename('source.min.js'))
        .pipe(gulp.dest('./'));
}

gulp.task('compress', function() {
    compress(compileCondition);
});

// とりあえずdefaultも定義
gulp.task('default', ['compress']);

下記のGulp.jsあるあるレシピを参考にしました。わかりやすかったのでオススメです!
GitHub / gulp Recipes


DACエンジニア採用情報

  関連記事

androidsdk10
SDKってどうやって作ってるの?【Android編】

こんにちは。4度目の投稿です。 現在私はAndroidのSDKを開発しています。 javaにもAndroidにもSDKにも手を出したのは初めてなので、最初はそもそもSDKのイメージが湧かず、ふわふわした状態で始めました。 SDKと調べても「あるソフトウェアを開発するために必要なプログラムや文書などを …

no image
Polymer on Rails

Web Componentsをご存知だろうか。これが普及すればWebの開発は画期的に変わるだろう。 説明すると長くなるので、LIGさんのにその辺はお任せして。(この記事読んでください。) 簡単に言えば、下記にあるような新たに提案されたブラウザ向けAPIの総称。 Custom Elements, 説明 …

index
Android 非同期処理についてまとめてみた

Androidには、UIに影響を与えないよういくつか非同期処理が用意されています。 今回は非同期処理の代表的な ・Service ・IntentService ・HandlerThread について違いを踏まえながらまとめます! 非同期処理について(http://codezine.jp/articl …

14391226325_8c35c2a652_z
D3.jsとその活用事例について

D3.jsとは? D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。 ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。 …

4
【未経験からのRuby on Rails – 第4回】Railsアプリケーション開発をしよう! 〜開発の準備編〜

こんにちは。新卒のmatsuariです。 Rubyについてまだまだ知るべきことはたくさんありますが、とにかく早くアプリを作りたい! ということで、今回はアプリ開発の準備に取り掛かっていきます。 Rubyはアプリを作成しながら、同時に学んでいきたいと思います。 Railsアプリケーション開発の準備《 …

no image
Polymer core-ajax の使い方

Polymerのcore-ajaxの使い方。 まずは、index.html my-topicsというCustom Elementに実際の処理を書く。JSONで、とあるサーバからデータを取得する、という想定。本当はJSONPで取りたかったんだけど、それは次回までの課題で… core-aja …

rails
初心者がRailsで開発 – deviseでユーザー認証設定 -

こんにちは、2年目のYukaです。 開発部所属でありながら実は、、 実際に自分で手を動かして開発する機会がなかなかありませんでした。。 しかしついに、、、 開発初心者がRailsでWebアプリの開発に挑戦します!! 今回のゴールは社内でも使用しているGoogleアカウントで簡単にログインができるよう …

chain
PyStanによるはじめてのマルコフ連鎖モンテカルロ法

はじめに こんにちは。システム開発部の中村です。 社内で行っている『データ解析のための統計モデリング入門』(所謂緑本)の輪読会に参加した所、 大変わかりやすい本だったものの、Macユーザには悲しい事に実装サンプルがWinBUGSだったため、 9章の一般化線形モデルのベイズ推定によるアプローチをPyt …

no image
【小ネタ】Javascriptのconsoleオブジェクトをもっと便利に使う方法

すごく便利なconsoleオブジェクトですが、ブラウザによってサポートされているメソッドが なかったり、そもそもconsoleオブジェクトが使えなかったりと、たまに不便だったりします。 そんなときによく使う便利なコード。 使い方はconsoleと同じようにlogger.log,logger.grou …

tf
ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …