typescriptをやってみる
typescriptでも触ってみようということで、gulpで環境をつくってみます
ゴールは、
- tsファイルを監視して、ファイルが更新されたら、コンパイルしてjsファイルを出力する
構築
package.jsonを作成
npm init コマンドでpackage.jsonのひな形を作成。入力内容は適当に。
とりあえず、こんな感じにしておく。
| 1
2
3
4
5
6
7
8
9
 | {
  "name": "gulp_typescript",
  "version": "1.0.0",
  "description": "gulp for typescript",
  "main": "gulpfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}
 | 
gulpをローカルにインストール
ローカルイントールで、–save-devオプションでpackage.jsonを更新する
| 1
 | $ npm install --save-dev gulp
 | 
gulpfile.jsを作成
タスクをファイル分割して管理出来るようにrequire-dirをインストール
| 1
 | $ npm install --save-dev require-dir
 | 
gulpfile.js
| 1
2
3
4
 | var dir = require('require-dir');
dir('./gulp/tasks', {
  recurse: true
});
 | 
default.jsを作成
gulpコマンド実行時に最初に読み込むタスクファイル
gulpのタスクを保存していく ./gulp/tasks とtypescript用 ./src/ts と実行後のjavascript用 ./src/js を作成
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 | $ tree -L 2
.
├── gulp
│   └── tasks
├── gulpfile.js
├── node_modules
│   ├── gulp
│   └── require-dir
├── package.json
└── src
    ├── js
    └── ts
7 directories, 2 files
 | 
./gulp/tasks/default.jsの内容
"watch"タスクを実行しますよってことなので、次にwatchタスクをつくる
./gulp/tasks/default.js
| 1
2
3
 | var gulp = require("gulp");
gulp.task("default", ["watch"]);
 | 
watch.jsを作成
ファイル監視するためにgulp-watchをインストール
| 1
 | $ npm install --save-dev gulp-watch
 | 
./gulp/tasks/watch.jsの内容対象ファイルに変更があったら、"tsc"タスクを実行しますよってこと 対象のファイルは、configから読みこむようにする
./gulp/tasks/watch.js
| 1
2
3
4
5
6
7
8
9
 | var gulp = require("gulp");
var watch = require("gulp-watch");
var config = require("../config");
gulp.task("watch", function() {
  watch(config.ts.src, function() {
    gulp.start(["tsc"]);
  });
});
 | 
./gulp/config.js
| 1
2
3
4
5
 | module.exports = {
  ts: {
    src: "./src/ts/**/*.ts",
  }
};
 | 
tsc.js
typescriptのコンパイラとしてgulp-typescriptをインストール
| 1
 | $ npm install --save-dev gulp-typescript
 | 
./gulp/config.jsに設定追加
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 | module.exports = {
  ts: {
    src: "./src/ts/**/*.ts",
    dest: "./src/js",
    options: {
      removeComments: true,
      noImplicitAny: true,
      noLib: false,
      noEmitOnError: false,
      target: "ES5"
    }
  }
};
 | 
./gulp/tsc.js
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
 | var gulp = require("gulp");
var ts = require("gulp-typescript");
var config = require("../config");
gulp.task("tsc", function() {
  gulp.src(config.ts.src)
    .pipe(ts(config.ts.options))
    .js
    .pipe(gulp.dest(config.ts.dest));
});
 | 
gulpを実行する
なんかwatchしてるっぽい
| 1
2
3
4
5
6
 | $ gulp
[17:03:52] Using gulpfile ~/gulpfile.js
[17:03:52] Starting 'watch'...
[17:03:52] Finished 'watch' after 6.91 ms
[17:03:52] Starting 'default'...
[17:03:52] Finished 'default' after 10 μs
 | 
適当なtypescriptのファイルをおいてみる
./src/ts/sample.ts
| 1
2
3
4
5
6
7
8
 | class Greeter {
  constructor(public greeting: string) { }
  greet() {
    return "<h1>" + this.greeting + "</h1>";
  }
};
var greeter = new Greeter("Hello, world!");
document.body.innerHTML = greeter.greet();
 | 
./src/js/sample.js ができてますね
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 | var Greeter = (function () {
  function Greeter(greeting) {
    this.greeting = greeting;
  }
  Greeter.prototype.greet = function () {
    return "<h1>" + this.greeting + "</h1>";
  };
  return Greeter;
})();
;
var greeter = new Greeter("Hello, world!");
document.body.innerHTML = greeter.greet();
 |