これからはじめる Gulp シリーズこれからはじめるGulp(4):gulp-connectモジュールを使ったローカルサーバの起動
はじめに
この記事はGulp.js(全俺) Advent Calendar 2014です。
前回のこれからはじめるGulp(3):gulp.watchでファイルの変更を監視しタスクを実行するで変更を監視してタスクを実行できるようになりました。今回は監視と平行して走らせるgulp-connectを使ったローカルサーバの起動を試します。
準備
まず、ローカルサーバーにアクセスした時に表示させるindex.html
を作っておきます。
index.htmlを作る
src
ディレクトリにindex.html
を作ります。このHTMLはローカルサーバー起動時にprod
ディレクトリにコピーします。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Gulp Hello World</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
gulp-connectのインストールと読み込み
gulp-connectを--save-dev
を付けて開発用としてインストールします。
$ sudo npm install --save-dev gulp-connect
Password:
gulp-connect@2.2.0 node_modules/gulp-connect
├── connect-livereload@0.3.2
├── event-stream@3.1.7 (duplexer@0.1.1, stream-combiner@0.0.4, from@0.1.3, pause-stream@0.0.11, map-stream@0.1.0, split@0.2.10, through@2.3.6)
├── tiny-lr@0.0.7 (debug@0.8.1, faye-websocket@0.4.4, qs@0.5.6, noptify@0.0.3)
├── gulp-util@2.2.20 (lodash._reinterpolate@2.4.1, minimist@0.2.0, through2@0.5.1, vinyl@0.2.3, chalk@0.5.1, dateformat@1.0.11, multipipe@0.1.2, lodash.template@2.4.1)
└── connect@2.17.3 (parseurl@1.0.1, response-time@1.0.0, connect-timeout@1.1.0, cookie@0.1.2, debug@0.8.1, cookie-signature@1.0.3, pause@0.0.1, fresh@0.2.2, vhost@1.0.0, qs@0.6.6, basic-auth-connect@1.0.0, on-headers@0.0.0, bytes@1.0.0, serve-favicon@2.0.0, morgan@1.1.1, errorhandler@1.0.1, cookie-parser@1.1.0, csurf@1.2.0, method-override@1.0.2, body-parser@1.2.2, compression@1.0.2, type-is@1.2.0, express-session@1.2.1, serve-index@1.0.3, multiparty@2.2.0, serve-static@1.1.0)
インストールが終わったらgulpfile.js
ファイルに読み込みます。
var gulp = require('gulp');
var sass = require('gulp-sass');
var connect = require('gulp-connect');
...
copyタスクを作る
今回ローカルサーバのrootディレクトリにprod
ディレクトリを指定します。src
ディレクトリに保存されているindex.html
をprod
ディレクトリにコピーしなければHTMLを表示できません。そこで前回作成したgulpfile.js
をベースにcopyタスクを追加します。
var gulp = require('gulp');
var sass = require('gulp-sass');
gulp.task('sass', function(){
gulp.src('./src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('./prod/css'));
});
//copyタスクをここに追加
gulp.task('watch', ['sass'], function(){
var watcher = gulp.watch('./src/scss/*.scss', ['sass']);
watcher.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});
});
gulp.task('default', ['sass']);
copyタスク
copyタスクはstream内にSassなどのモジュール(.pipe(sass())
)を指定せず、gulp.dest()
で保存先だけ指定します。Grantの場合はgrunt-contrib-copyモジュールを使って実現しますが、Gulpはメソッドだけで実現できるんですね。
gulp.task('copy', function(){
gulp.src('./src/*.html')
.pipe(gulp.dest('./prod'));
});
copyタスクを試す
copyタスクを単体で実行してprod
にHTMLがコピーされることを確認します。
$ gulp copy
[21:33:27] Using gulpfile ~/Projects/test.io/vccw/www/wordpress/wp-content/themes/test.io/gulpfile.js
[21:33:27] Starting 'copy'...
[21:33:27] Finished 'copy' after 4.85 ms
$ tree prod
prod
├── css
│ └── style.css
└── index.html
prod
にindex.html
がコピーされました。
監視対象にHTMLを追加する
前回作成したwatchタスクにcopyタスクを追加します。イベントリスナーを使ったログはわかりにくくしてしまうため一度削除して以下のようにします。
gulp.task('watch', ['sass', 'copy'], function(){
gulp.watch('./src/scss/*.scss', ['sass']);
gulp.watch('./src/*.html', ['copy']);
});
この時点でgulpfile.js
はこのようになります。
var gulp = require('gulp');
var sass = require('gulp-sass');
var connect = require('gulp-connect');
//sass
gulp.task('sass', function(){
gulp.src('./src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('./prod/css'));
});
//copy
gulp.task('copy', function(){
gulp.src('./src/*.html')
.pipe(gulp.dest('./prod'));
});
//watch
gulp.task('watch', ['sass', 'copy'], function(){
gulp.watch('./src/scss/*.scss', ['sass']);
gulp.watch('./src/*.html', ['copy']);
});
gulp.task('default', ['sass']);
watchタスクをチェックする
watchタスクを実行して、HTMLの変更を監視しcopyタスクが実行されるか確認します。
$ gulp watch
[21:48:10] Using gulpfile ~/Projects/test.io/vccw/www/wordpress/wp-content/themes/test.io/gulpfile.js
[21:48:10] Starting 'sass'...
[21:48:10] Finished 'sass' after 5.39 ms
[21:48:10] Starting 'copy'...
[21:48:10] Finished 'copy' after 1.25 ms
[21:48:10] Starting 'watch'...
[21:48:10] Finished 'watch' after 7.3 ms
[21:48:14] Starting 'sass'...
[21:48:14] Finished 'sass' after 1.28 ms
[21:48:17] Starting 'copy'...
[21:48:17] Finished 'copy' after 1.59 ms
問題なさそうです。
serveタスクを作る
まずは、ローカルサーバーを立ち上げるだけのタスクを作ります。
gulp.task('serve', function(){
connect.server();
});
serveタスクを追加したgulpfile.js
はこうなります。
var gulp = require('gulp');
var sass = require('gulp-sass');
var connect = require('gulp-connect');
//sass
gulp.task('sass', function(){
gulp.src('./src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('./prod/css'));
});
//copy
gulp.task('copy', function(){
gulp.src('./src/*.html')
.pipe(gulp.dest('./prod'));
});
//watch
gulp.task('watch', ['sass', 'copy'], function(){
gulp.watch('./src/scss/*.scss', ['sass']);
gulp.watch('./src/*.html', ['copy']);
});
//server
gulp.task('serve', function(){
connect.server();
});
gulp.task('default', ['sass']);
ローカルサーバーを起動する
serveタスクを起動してみます。オプションでrootディレクトリを指定していないので、gulpfile.js
が置かれているディレクトリがrootになります。
$ gulp serve
[11:36:46] Using gulpfile ~/Projects/test.io/vccw/www/wordpress/wp-content/themes/test.io/gulpfile.js
[11:36:46] Starting 'serve'...
[11:36:46] Finished 'serve' after 22 ms
[11:36:46] Server started http://localhost:8080
ローカルサーバーが起動したのでhttp://localhost:8080
にアクセスしてみます。 rootディレクトリにindex.html
がないのでディレクトリとファイルの一覧が表示されるはずです。
ディレクトリ一覧の中にあるprod
(http://localhost:8080/prod/
)をクリックすると冒頭で作成したindex.html
が表示されるはずです。
ローカルサーバーを停止する
ローカルサーバーを止めるにはcontrol + C
を打ちます。
[11:36:46] Starting 'serve'...
[11:36:46] Finished 'serve' after 22 ms
[11:36:46] Server started http://localhost:8080
^C[12:01:47] Server stopped
rootディレクトリを指定する
rootディレクトリを指定するにはgulp-connectのserveメソッドにオプションを与えます。
gulp.task('serve', function(){
connect.server({
root: './prod'
});
});
これでhttp://localhost:8080
にアクセスした時にprod
がrootディレクトリになりprod/index.html
が見られるようになります。
defaultタスクで必要なタスクをすべて実行する
最後にwatchタスクとserveタスクをgulp
コマンドだけで実行できるようにdefault
タスクを調整します。
gulp.task('default', ['sass']);
sass
タスクが設定されていますがこれをwatch
とserve
に書き換えます。
gulp.task('default', ['watch', 'serve']);
gulpfile.js
gulpfile.js
は最終的にこのようになります。
var gulp = require('gulp');
var sass = require('gulp-sass');
var connect = require('gulp-connect');
//sass
gulp.task('sass', function(){
gulp.src('./src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('./prod/css'));
});
//copy
gulp.task('copy', function(){
gulp.src('./src/*.html')
.pipe(gulp.dest('./prod'));
});
//watch
gulp.task('watch', ['sass', 'copy'], function(){
gulp.watch('./src/scss/*.scss', ['sass']);
gulp.watch('./src/*.html', ['copy']);
});
//server
gulp.task('serve', function(){
connect.server({
root: './prod'
});
});
gulp.task('default', ['watch', 'serve']);
実行
defaultタスクを試してみます。defaultタスクは省略できるのでgulp
コマンドのみで行えます。
$ gulp
[13:20:34] Using gulpfile ~/Projects/test.io/vccw/www/wordpress/wp-content/themes/test.io/gulpfile.js
[13:20:34] Starting 'sass'...
[13:20:34] Finished 'sass' after 5.32 ms
[13:20:34] Starting 'copy'...
[13:20:34] Finished 'copy' after 1.46 ms
[13:20:34] Starting 'watch'...
[13:20:34] Finished 'watch' after 7.47 ms
[13:20:34] Starting 'serve'...
[13:20:34] Finished 'serve' after 10 ms
[13:20:34] Starting 'default'...
[13:20:34] Finished 'default' after 8.98 μs
[13:20:34] Server started http://localhost:8080
変更を監視してタスクを実行し、ローカルサーバーも起動できました。あとは変更された時にブラウザをリロードするLiveReloadですね。もう少しのところですがLive Reloadは明日に回すことにします。
シリーズ
- これからはじめるGulp(0):アドベントカレンダースケジュール
- これからはじめるGulp(1):bundler, rbenv, nodebrewでGulp環境を作ってみる
- これからはじめるGulp(2):gulp-sassを使ってSCSSをコンパイルするタスクを作ってみる
- これからはじめるGulp(3):gulp.watchでファイルの変更を監視しタスクを実行する
- これからはじめるGulp(4):gulp-connectモジュールを使ったローカルサーバの起動
- これからはじめるGulp(5):gulp-connectモジュールを使ったLiveReload
- これからはじめるGulp(6):gulp-plumberとgulp-notifyを使ったデスクトップ通知
- これからはじめるGulp(7):require-dirモジュールを使ったタスク単位のファイル分割
- これからはじめるGulp(8):delモジュールとvinyl-pathsモジュールを使ったファイルの削除
- これからはじめるGulp(9):Ruby版Sassが使えるgulp-ruby-sassへの乗り換え
- これからはじめるGulp(10):deprecatedになっていたgulp-connectからgulp-webserverへ乗り換える
- これからはじめるGulp(11):ブラウザ間でスクロールやクリック操作を同期できるBrowserSync
- これからはじめるGulp(12):gulp-imageminプラグインを使ったJPEG,PNG,GIF,SVGの最適化
- これからはじめるGulp(13):gulp-changedプラグインで変更されたファイルだけを処理させる
- これからはじめるGulp(14):gulp-cachedプラグインで変更されたSCSSファイルだけを処理させる
- これからはじめるGulp(15):gulp-responsiveプラグインを使ったレスポンシブイメージ作成の自動化
- これからはじめるGulp(16):gulp-image-resizeプラグインを使ってサムネイルやレスポンシブイメージを作る
- これからはじめるGulp(17):SketchTool(Sketch 3 command line tool)を使ったアートボード・スライスの書き出しとgulp-execプラグインを使ったSketchtoolの呼び出し
- これからはじめるGulp(18):SketchToolで何ができるのかコマンドと主要なオプションを使ってみる
- これからはじめるGulp(19):gulp-sketchとgulp-execを使ったSketch 3デザインデータの画像書き出し
- これからはじめるGulp(20):Node.jsのChild Processモジュールを使ってgulpからjekyllのbuildコマンドを実行する
- これからはじめるGulp(21):gulp-awspublishプラグインを使ったAmazon S3への静的Webサイトパブリッシュ
- これからはじめるGulp(22):gulp-iconfontとgulp-sketchを使ったアイコンフォント作成の自動化
- これからはじめるGulp(23):gulp-consolidateでgulp-iconfontで作ったアイコンフォントのシンボル一覧HTMLを作る
- これからはじめるGulp(24):gulp.spritesmithプラグインでSpriteイメージを作る
- これからはじめるGulp(25):Hologramとgulp-hologramでスタイルガイドを作る
- これからはじめるGulp(26):Sketch3のサブディレクトリ書き出しに対応したgulp-sketchを試す