参考にさせていただいたページ
Vue.extendとnameオプションについて
メモリの割り当てを増やす
- Nuxt (+TS) の開発サーバーがメモリ不足でクラッシュする事象を暫定的に回避する
- JavaScript heap out of memory in Dev env, several times a day · Issue #5396 · nuxt/nuxt.js · GitHub
- Nuxt.jsのSSRでメモリリークを発見して解消した #nuxtjs #ssr - Timers Tech Blog
- Nuxt.jsでビルド時にout of memoryになる – APPSWINGBY Developers Blog
- Nuxt.jsでOut of memory・・・ | Shimer-System BLOG
eslintの対象を絞る
standaloneをtrueにする
- revert: revert node-externals disabling in dev mode by clarkdo · Pull Request #5452 · nuxt/nuxt.js · GitHub
- The build Property - NuxtJS
はじめに
JavaScript heap out of memoryになってしまう原因は色々なものがあると思います。
結局凡ミスだったのですが、今回の私の例について紹介します。
自分のケースの問題と解決
example.vueで以下のように、HogeとFooという2つのコンポーネントをimportしていました。
import Hoge from '~/components/common/hoge/index.vue' import Foo from '~/components/common/foo/index.vue'
hoge/index.vueの方には以下のように、name: 'Hoge'
を設定していました。これは意図したものです。
export default Vue.extend({ name: 'Hoge', 〜略〜 })
foo/index.vueの方にも以下のように、name: 'Hoge'
を設定してしまっていました。これは意図しないものです。
export default Vue.extend({ name: 'Hoge', 〜略〜 })
コンストラクタ名が重複することによって、ビルド時に問題が起こっていました。
こんなミスとは気づかず、しばらく「JavaScript heap out of memory」とかでWeb検索してハマっていました...。
foo/index.vueの方のnameを以下のように、name: 'Foo'
とすることで「JavaScript heap out of memory」の問題が解決されました。
export default Vue.extend({ name: 'Foo', 〜略〜 })
その他のケースについて
タイミングとしては、test実行時、eslint実行時、ビルド実行時など色々なタイミングでメモリ不足になっているようです。
冒頭に書いたように、様々な理由でメモリ不足が起こるのですが、今回のことでいくつかの対応方法を試しました。
メモリ不足になる原因によっては以下の対応によって問題に対処できるかもしれません。
メモリの割り当てを増やす
例えば yarn dev
コマンドで開発サーバーを起動させていたときに「JavaScript heap out of memory」になった場合についてです。
まずnuxt.config.jsのtypescript.memoryLimitを設定します。
typescript: { typeCheck: { typescript: { memoryLimit: 8192, // ここ }, }, },
そのうえで、package.jsonのscriptsを以下のように変更します。
"dev": "NODE_OPTIONS='--max-old-space-size=8192' nuxt-ts",
これで、改めて yarn dev
すると今度はメモリ不足にはならないかもしれません。
メモリの値はご自身の端末で割り当て可能な値を適度に設定してみてください。
eslintの対象を絞る
eslintの実行時にメモリ不足になる場合は、eslintの対象範囲を絞ることで問題が解決するかもしれません。
例えばnuxt.config.jsの以下のようになっている箇所を
typescript: { typeCheck: { eslint: { files: './**/*.{ts,js,vue}', }, }, },
以下のように変更したり、
typescript: { typeCheck: { eslint: { files: './src/**/*.{ts,js,vue}', }, }, },
.eslintrc.jsのignorePatternsの設定を以下のように変更するなどで問題が解決するかもしれません。
ignorePatterns: [ './node_modules/', '.nuxt/', ],
これは、.eslintignoreファイルを作成することでも同じ効果が得られます。
standaloneをtrueにする
「revert: revert node-externals disabling in dev mode by clarkdo · Pull Request #5452 · nuxt/nuxt.js · GitHub」に書いてあって、効果がよくわかっていないのですが、一応これも貼っておきます。
nuxt.config.jsのstandaloneの項目を以下の通り変更するようです。
build: { standalone: true, },