@babel/cliと@babel/registerと@babel/preset-typescriptでTypeScriptを実行する

Babel ではバージョン 7 から @babel/preset-typescript を使うことで TypeScript のトランスパイルもできるようになりました。

今回は webpackbabel-loader は使わず、@babel/cli を使って TypeScript をビルドする、もしくは @babel/register を使って TypeScript を実行するという内容です。

実行環境

$ node -v
v10.14.1
.
|-- .babelrc
|-- src
|   |-- index.ts
|   `-- register.js
`-- package.json
.babelrc
{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-typescript"
  ]
}
package.json
"devDependencies": {
  "@babel/cli": "^7.2.3",
  "@babel/core": "^7.2.2",
  "@babel/preset-env": "^7.2.3",
  "@babel/register": "^7.0.0",
  "typescript": "^3.2.2"
}

実行するTypeScriptファイル

まず、TypeScript で書かれた src/index.ts を用意します。今回はこのファイルを対象とします。

src/index.ts
import * as path from 'path';

const add = (x: number, y: number) => x + y;

console.log(path.resolve(__dirname, '../'));
console.log(add(1, 4));

@babel/cliでトランスパイル

package.json
"scripts": {
  "build": "babel src -D -d build --extensions '.js,.ts'"
}

build コマンドを追加します。src ディレクトリ下のファイルを変換して build に出力します。ポイントは拡張子オプション --extensions '.js,.ts' を指定することです。これがないと .ts は変換されません。.tsx を使う場合は --extensions '.js,.jsx,.ts,.tsx' で指定します。

ビルドして実行

$ npm run build
Successfully compiled 1 file with Babel.

$ node build/index.js
/app/sandbox/babel-cli-register-typescript
5

エラーなく実行できました。

@babel/registerで実行

src/register.js
require('@babel/register')({
  extensions: ['.js', '.ts'],
});
require('./index');

node コマンドから TypeScript を実行します。ただし .ts ファイルを直接実行するのではなく、@babel/register をロードしている .js ファイルを実行します。

実行

$ node src/register.js
/app/sandbox/babel-cli-register-typescript
5

動きました。

余談

開発中は @babel/register を、production の事前ビルドに @babel/cli を使っているサーバー環境に TypeScript を導入する機会がありました。

今回のように、@babel/preset-typescript と拡張子オプションを指定することで問題なく TypeScript に移行できそうです。

参考