先日のエントリーで、gulp.jsを使ってwebpackビルドを行うことができるようにしました。
しかし、生のJavaScriptを使うのではなく、typescriptを使ってビルドしたいと思い、やってみました。
tsdをインストールする
typescriptからjQueryなどのライブラリを使う場合、型定義ファイルを読み込む必要があります。
これを便利に扱えるのがtsdコマンドです。npmを使ってインストールします。
$ npm install -g tsd
tsdを入れたら、まずtsd.jsonを作成します。
$ tsd init
試しに、node.d.tsとjquery.d.tsを入れてみます。
$ tsd query node --action install --resolve --save $ tsd query jquery --action install --resolve --save
typingsというディレクトリが作成され、そこにtsd.d.tsとnode,jqueryのディレクトリが生成されていると思います。
これらの型定義ファイルは、typescriptのソースからは
/// <reference path="../typings/tsd.d.ts" />
を1行目に書いておくだけでOK!
gulp.jsのタスクを作る
まず、gulp-typescriptをインストールします。
$ npm install -D gulp-typescript
次にgulp/tasks/typescript.jsを作ります。
var gulp = require('gulp');
var typescript = require('gulp-typescript');
var config = require('../config');
gulp.task('typescript', function(){
// 対象となるファイルを全部指定
gulp.src(config.ts.src)
.pipe(typescript(config.ts.options))
.js
.pipe(gulp.dest(config.ts.dest));
});
config.jsに以下を追記します。
// typescript
ts: {
src: [
src + '/ts/**/!(_)*.ts'
],
dest: src + '/js',
options: { target: "ES5", removeComments: true, module: "commonjs" }
},
src/jsにtypescriptのコンパイル後のソースを出力し、その後webpackビルドの対象とできるようにします。
試してみる
今回は試しに、typescriptからjqueryも読み込み、webpackでビルドまでできるかどうか試したいと思います。
準備として、jqueryをnpmでインストールします。
$ npm install -D jquery
typescriptのコードを書きます(src/ts/main.ts)。
/// <reference path="../../typings/tsd.d.ts" />
var $: JQueryStatic = require('jquery');
$(() => {
$('body').prepend("Hello!");
});
gulpからtypescriptタスクを実行します。
$ gulp typescript
うまくいったと思いますが、もし最初にtsdでnodeをインストールしていなければ、Cannot find name 'require'.というエラーが出てしまい失敗します。
成功していれば、src/js/main.jsが以下のような内容で作成されているはずです。
var $ = require('jquery');
$(function () {
$('body').prepend("Hello!");
});
次に、requireがちゃんと解消されるかどうか、webpackタスクを実行してみます。
$ gulp webpack
dest/js/bundle.jsが生成されていれば、ひとまずOKです。
JSがきちんと動くかどうかも確認してみます。
$ gulp browser-sync
ブラウザが起動し、画面一番上に Hello! と出ていれば正常に動作できています。
watchタスクの調整
typescriptのコードが変更されたタイミングでコンパイルさせるようにします。gulp/tasks/watch.jsを修正します。
var gulp = require('gulp');
var watch = require('gulp-watch');
var config = require('../config').watch;
gulp.task('watch', function () {
// typescriptを監視 ←これを追加
watch(config.ts, function() {
gulp.start(['typescript']);
});
// js
watch(config.js, function () {
gulp.start(['webpack']);
});
// styl
watch(config.styl, function () {
gulp.start(['stylus']);
});
// jade
watch(config.jade, function(){
gulp.start(['jade']);
});
// www
watch(config.www, function () {
gulp.start(['copy']);
});
});
次に、config.jsを修正します。
// watch
watch: {
ts: relativeSrcPath + '/ts/**', // 追加
js: relativeSrcPath + '/js/main.js', // main.jsのみに変更
styl: relativeSrcPath + '/styl/**',
jade: relativeSrcPath + '/jade/**',
www: relativeSrcPath + '/www/**'
}
typescriptのソースのファイル数分だけwebpackが走ってしまうのを防ぐため、監視対象をmain.jsのみにしました。
これで、typescriptのコードを編集・保存すると自動的にjsに変換後webpackでビルドを行い、自動的にブラウザをリロードして反映、という流れで開発できるようになりました!!
