Using 1 worker with 2048MB memory limit をどうにかする

# はじめに

Vue.js や Nuxt.js で TypeScript を使って開発したプロジェクトをビルドすると、以下のような記述を見る事があります。

```bash
Using 1 worker with 2048MB memory limit
```

## Vue.js + TypeScript のビルド時

<img width="1202" alt="Vue.jsビルド時-2048MB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/862bf573-6b07-c6cf-b6a2-40ac35c409ea.png">

## Nuxt.js + TypeScript のビルド時

最近のバージョンではこのメッセージは見かけなくなりましたけど少し前までは出ていました。

<img width="1202" alt="Nuxt.JSビルド時-2048MB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/a316b7f0-8631-18f1-4189-e16914384a79.png">

## これは何？

これは読んで字の如く TypeScript の型チェックを実行するのに最大こんだけのメモリを使いますぜと言っているわけですが、この 2048MB と言う数字はどこから来ているのか。
これは、この型チェックプロセスを担当する [fork-ts-checker-webpack-plugin](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin) さんが初期値として持っている値です。
最近の Nuxt.js でこのメッセージが出なくなったのは、同梱されているこのプラグインのバージョンが 3.x 系から 4.x 系に変わったからであるようです。

# 2048MB をどうにかする

型チェックごときに貴重なメモリを 2GB もおごってやるのって剛毅すぎない？もう少しささやかな量で満足してもらえない？と言う場合、あるいは 2GB とかみみっちい事言ってるんじゃない！欲しいなら 2TB くらいくれてやるわ！と言う場合に、どこをどうすればこの数字を弄れるのかを解説します。

## Vue.js + TypeScript の場合

`vue.config.js` で、Webpack の設定をいじる事ができます。
以下のように `chainWebpack` のところに追記してやります。（ファイルがなければ作成）
試しに制限値を `512MB` にしてみます。

```javascript:vue.config.js
module.exports = {
  // ...省略
  chainWebpack: (config) => {
    config.plugin("fork-ts-checker").tap((args) => {
      args[0].memoryLimit = 512;
      return args;
    });
  },
  // ...省略
};
```

これでビルドしてみると、
<img width="1202" alt="Vue.jsビルド時-512MB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/3f603e2b-1d5d-98b3-5184-a430cdc3a037.png">

512MB に変わってますね！

上の `512` の部分を好きに変えれば良いわけですが、まあ小さすぎてもダメでしょうし、`2` とか `3` とかでうまく行く気はしませんね。
プロジェクトの具合によって程良い数字を見つけて貰えればと思います。

## Nuxt.js + TypeScript の場合

Nuxt.js の場合は、`create-nuxt-app` でプロジェクトを始めれば `nuxt.config.ts` と言うファイルがあるはずですので、そこに追記します。

```typescript:nuxt.config.ts
export default {
  // ...省略
  typescript: {
    typeCheck: { memoryLimit: 512 },
    ignoreNotFoundWarnings: true,
  },
  // ...省略
};
```

これでビルドすると・・・

<img width="1202" alt="Nuxt.jsビルド時-512MB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/5c86281f-d8a9-c928-4da5-8b29ed49b7a9.png">

こちらも 512MB の制限が有効になりました。

ビルドオプションについては [Nuxt TypeScript のドキュメント](https://typescript.nuxtjs.org/ja/guide/setup.html#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3) にもざっくりと記載がありますが、設定できる値等細かい話はプラグイン側のドキュメントを見なさいよと言うスタンスですね。

# そもそもなんでこんな事をやることになったのか

Nuxt.js + TypeScript で作ったプロジェクトを EC2 で動かそうとした時に、ビルドがいつまで経っても終わらなくて何じゃこれってなったのがきっかけでした。
で、よくよく見たらどうもこの `Using 1 worker with 2048MB memory limit` が怪しいぞ、と。t2.micro ってメモリ 1GB しかないのに 2GB とか要求されたらそらいつまでも終わらないわけだよ、と。
じゃあこの `2048MB` をどうにかしてやらなきゃいけないけど、ググっても意外と情報転がってませんね、と。
あんまりこんな事で困る人自体がいないせいかとも思ったわけですが、日本語でこの辺に言及している記事も見当たらないので記録として書いておこうかな、と思った次第です。

この記事が同じ疑問にぶち当たった誰か（とか数ヶ月後の自分とか）の役に立てばと思います。

# 参考

[CircleCI 上での Typescript + vue.js プロジェクトのビルドが不安定な時にやったこと](https://medium.com/r21nomi-log/circleci%E4%B8%8A%E3%81%A7%E3%81%AEtypescript-vue-js%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%81%8C%E4%B8%8D%E5%AE%89%E5%AE%9A%E3%81%AA%E6%99%82%E3%81%AB%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8-28360d98a963)