typescript

gulp.jsでtypescript+webpackをビルドする

先日のエントリーで、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でビルドを行い、自動的にブラウザをリロードして反映、という流れで開発できるようになりました!!

LINEで送る
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です