LoginSignup
5
1

Nuxt2 から Nuxt3 への変更点を整理する

Posted at

目次

  1. 背景
  2. 変更点

1. 背景

Nuxt2を業務で使用しています。年内にサポート切れするということでNuxt3に移行する必要がある為です。

2. 変更点

2.1 VuexはNuxt3本体に含まれていない

  • Vueの公式がpiniaを推奨してます
    • Nuxtモジュールとして提供されています。
    • 以下のライブラリが必要です。
  • useState
    • Nuxt Bridge から useState が使えます。
      pinia、vuex、useStateの比較記事はまた別で書こうと思います。

2.2 axiosではなくFetch APIか、unjs/ohmyfetchの$fetchを使う形になる

Nuxt3でaxiosはなくなり、Fetch APIをつかうらしい
移行中で対応する時間がない場合は以下のようにすることで大丈夫だそうです。

nuxt.config.ts
import { defineNuxtConfig } from "nuxt";

// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
  vite: {
    server: {
      proxy: {
        "/api/": {
          target: "https://api.example.com",
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, ""),
        },
      },
    },
  },
});

2.3 静的ファイルのディレクトリ名をstaticからpublicに変更

2.4 @nuxtjs/style-resources がnuxt3に対応していない

以下のように対応したら良いそうです。
nuxt2

nuxt.config.ts
export default defineNuxtConfig({
  buildModules: ['@nuxtjs/style-resources'],
  styleResources: {
    scss: ['./assets/variables.scss'],
  },
});


nuxt3

nuxt.config.ts
export default defineNuxtConfig({
  vite: {
        css: {
            preprocessorOptions: {
                scss: {
                    additionalData: '@import "@/assets/scss/variables.scss";',
                },
            },
        },
    }
});

2.5 process.envから値が取得できない

nuxt2

nuxt.config.js
console.log('ENV_NAME', process.env.ENV)


nuxt3

nuxt.config.js
console.log('ENV_NAME', useRuntimeConfig().public.ENV)

2.6 head プロパティ

headの上にappプロパティが必要です。(オブジェクトは重複排除のためのhidキーを持たなくなリます)。

nuxt2

nuxt.config.js
export default {
  head: {
    titleTemplate: '%s - Nuxt',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: 'Meta description' }
    ]
  }
}


nuxt3

nuxt.config.js
export default defineNuxtConfig({
  app: {
    head: {
      titleTemplate: '%s - Nuxt',
      meta: [
        { charset: 'utf-8' },
        { name: 'viewport', content: 'width=device-width, initial-scale=1' },
        { name: 'description', content: 'Meta description' }
      ]
    }
  }
})

2.7 nuxt.configでCommonJS構文を使えない

module.exportsやrequire、require.resolveのようなCommonJS構文を使わないようにしてください。これはすぐに非推奨となり、サポートされなくなります

Update nuxt.config

2.8 components ディレクトリの自動インポート

components ディレクトリ内に書いた vue コンポーネントは、 import 文無しで使うことができます。

例えば、components/header/HeaderSearchButton.vue という名前のコンポーネントは、 インポート無しで <HeaderSearchButton>として使えます。

また、 components/header/SearchButton.vue という名前のコンポーネントも同じく、 <HeaderSearchButton> として使えます。

ディレクトリ名 + ファイル名 でコンポーネント名になりますが、ファイル名の先頭とディレクトリ名が重複する場合、重複する部分は打ち消されます。

2.9 Nuxt3だとページ遷移時にdocument.getElementByIdで要素取得できない

https://github.com/nuxt/framework/issues/3587
以下のようにすると良いそうです。

sample.vue
<template>
  <div>
    <h1 ref="myElement">Hello Nuxt3!</h1>
    <!-- その他のコンテンツ -->
  </div>
</template>

<script>
import { ref, onMounted } from 'vue'

export default {
  data() {
    return {
      myElement: ref(null)
    }
  },
  mounted() {
    if (this.myElement) {
      this.myElement.style.color = 'red'
    }
  }
}
</script>

2.10 プラグインの書き方の変更

nuxtApp.provide を実行することでで、システムグローバルに $xxxxx という名前で使える関数を定義できます。
テンプレート内でも、script setup 内でも使えます。

plugins/filter.ts
export default defineNuxtPlugin((nuxtApp) => {

  /**
   * 金額をカンマ区切りに表示します。
   * $addComma(1000) => 1,000
   */
  nuxtApp.provide('addComma', function (val: number) {
    if (val === 0) {
      return '0'
    }

    if (!val) {
      return ''
    }

    if (typeof val === 'string') {
      val = Number(val)
    }

    return val.toLocaleString()
  })
})

参考

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1