Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8825

babelの設定ファイルをTypeScriptで書く

$
0
0

表題の通りです。
babelの設定ファイルといえば .babelrcbabel.config.jsでの記述が一般的だと思います。これを babel.config.tsに記述できるようにします。

1. 必要モジュールのインストール

とりあえず webpack前提で必要最低限なものだけインストールします。

npm i -D webpack webpack-cli typescript ts-node @babel/core @types/babel__core babel-loader @babel/preset-env

ほとんど説明するほどのものではないですが、重要なのは @types/babel__coreです。
ここに設定ファイルで使用する型情報が載っています。

2. TypeScriptの設定

tsconfig.jsonを書きます。

tsconfig.json
{"ts-node":{"compilerOptions":{"module":"commonjs","target":"es5",},},}

ここでは ts-nodeの設定だけ行います。

3. babelの設定

ここからが本題です。 babel.config.tsを書きますが、 設定の読み込み方によって書き方も変わってきます。
だいたい次の2通りに分けられるんじゃないでしょうか。

  1. プロジェクトルートにある babelの設定ファイル( .babelrcbabel.config.js)を babelが自動的に読み込む
  2. webpackから実行環境によって手動(設定ファイルのコード上)で呼び出す設定を変える

上記2パターンそれぞれについて説明をしていきます。

3.1. 設定ファイルを自動的に読み込む場合

この場合、 babel.config.tsは次のように書くことができます。

babel.config.ts
import{TransformOptions,ConfigAPI}from'@babel/core'exportdefaultfunction(api:ConfigAPI):TransformOptions{return{presets:['@babel/preset-env',],}}

TransformOptionsConfigAPIという見慣れないものが出てきましたが、 TransformOptionsはお馴染みの babelの設定ファイルの内容ConfigAPIbabelの設定APIのことです。
これを .tsではなく .jsで書くと次のようになります(ドキュメントにほぼ同じものが載っていますが)。

babel.config.js
module.exports=function(api){return{presets:['@babel/preset-env',],};}

ここまでくればあとは babel.config.tsbabelに読み込ませるだけですが、 babelwebpackのように .tsの設定ファイルをいい感じに解釈してくれません。

webpack.config.ts
// ...module:{rules:[{test:/\.[jt]sx?$/,loader:'babel-loader',exclude:/node_modules/,options:{configFile:'babel.config.ts'},},// ...

このように書いたとしても babelbable.config.tsをJSONとして読み込もうとするので構文エラーになります。
そこで tscコマンドで .jsファイルにトランスパイルする必要があります。

npx tsc babel.config.ts

これで babel.config.jsが生成されるので設定ファイルを読み込むことができますが、いちいちトランスパイルするのは面倒ですし、 babel.config.tsbabel.config.jsの2ファイルが並ぶのはあまり気持ちのいいものではないですね。

3.2. webpackから実行環境によって設定を変える場合

3.1. の方法だとあまりすっきりできないので、自分はこちらの方法を採用しています。
特に webpack4では webpack-mergeを使って呼び出す設定ファイルを切り替えるのがメジャーらしい(?)のでこちらの方が合っている気がします。

babel.config.ts
import{TransformOptions}from'@babel/core'// 開発環境用の設定exportconstdev:TransformOptions={presets:['@babel/preset-env',],sourceMaps:true,}// 本番環境用の設定exportconstprod:TransformOptions={presets:['@babel/preset-env',],}
webpack.config.dev.ts
import{Configuration}from'webpack'importmergefrom'webpack-merge'importconfigfrom'./webpack.config.common'import{devasdevBabelConfig}from'./babel.config'constdevConfig:Configuration=merge(config,{mode:'development',devtool:'source-map',devServer:{contentBase:path.resolve(__dirname,'dist'),},module:{rules:[{test:/\.[jt]sx?$/,loader:'babel-loader',exclude:/node_modules/,options:devBabelConfig,},// ...}exportdefaultdevConfig
webpack.config.prod.ts
import{Configuration}from'webpack'importmergefrom'webpack-merge'importconfigfrom'./webpack.config.common'import{prodasprodBabelConfig}from'./babel.config'constprodConfig:Configuration=merge(config,{mode:'production',module:{rules:[{test:/\.[jt]sx?$/,loader:'babel-loader',exclude:/node_modules/,options:prodBabelConfig,},// ...}exportdefaultprodConfig

おわりに

以上、 babelの設定ファイルを TypeScriptで書いてみました。
TypeScriptで記述することでタイポなども減らせていいんじゃないでしょうか。
もっといい方法などあれば教えて頂けるとうれしくなります。


Viewing all articles
Browse latest Browse all 8825

Trending Articles