Nuxt.js

「Nuxt.js」+「TypeScript」でWebアプリの開発

以前に「Next.js」+「TypeScript」でWebアプリの環境構築をしましたが、今回は「Nuxt.js」+「TypeScript」となります。
「Nuxt.js」は「Vue.js」を使用して開発するフレームワークとなります。
また「Nuxt.js」は、バージョン3から大きく変更されており、今回は「Nuxt3」でのやり方となります。
ちなみに2023年4月1日現在では「create-nuxt-app」でプロジェクトを用意した場合は、バージョン2がインストールされているようです。

環境

  • npm 9.6.3
  • yarn 1.22.17
  • nuxt 3.3.2

Nuxt.js」プロジェクトの作成

以下のコマンドで「Nuxt.js」のプロジェクトを作成します。

$ npx nuxi init {プロジェクト名}

「nuxt.js」のバージョンを確認して「y」と入力して、インストールを開始します。

Need to install the following packages:
  nuxt@3.3.2
Ok to proceed? (y) y

プロジェクト作成が完了すると、必要なパッケージをインストールする必要があります。

$ cd {プロジェクト名}
$ yarn install

以下のコマンドでローカルにサーバーを立ち上げて確認できます。

$ yarn dev

サーバーを起動すると以下のURLにアクセスします。

http://localhost:3000/

以下の画面が表示されれば「Nuxt.js」のプロジェクトが作成されています。

Nuxt3からはこのままTypeScriptが使用でき、使用する場合「<script>」タグに「lang=”ts”」で宣言すればTypeScriptが使用出来ます。

<script setup lang="ts">

</script>

ソースディレクトリの変更

通常は開発をそのまま続けると設定ファイルとソースコードが混在してしまいます。
そのためは「src」フォルダ内で開発するようにします。

まずは以下のコマンドで「src」ディレクトリを作成します。

$ mkdir src

nuxt.config.ts」に以下を追加して上書き保存します。

export default defineNuxtConfig({
  ... 省略

  srcDir: 'src',
})

「src」フォルダ内に「pages」フォルダを作成し「index.vue」を作成します。

<template>
  <div>
    HelloWorld
  </div>
</template>

また「src」ディレクトリに「app.vue」を移動させ「NuxtWelcome」の箇所を「NuxtPage」に置き換えます。

<template>
  <NuxtPage />
</template>

先ほどアクセスしたURLを表示して、以下の画面となれば「pages」の「index.vue」が認識されたようになります。

「Vuetify」をインストールする

「Vue.js」でマテリアルデザインを使用するためのモジュール「Vuetify」をインストールします。

$ yarn add -D vuetify@next vite-plugin-vuetify sass mdi

プロジェクト直下に「plugins」フォルダを作成して、「vuetify.ts」を作成します。

import { createVuetify } from 'vuetify'
import * as components from 'vuetify/components'

export default defineNuxtPlugin((nuxtApp) => {
    const vuetify = createVuetify({
        components
    });

    nuxtApp.vueApp.use(vuetify);
});

また同様に「nuxt.config.ts」に以下の記述をしておきます。

export default defineNuxtConfig({
    css: ['vuetify/lib/styles/main.sass', 'mdi/css/materialdesignicons.min.css'], // 修正
    build: {
        transpile: ['vuetify'],
    },
    vite: {
        define: {
            'process.env.DEBUG': false,
        }
    },
});

以下は「Vuetify」を使った例となります。

<template>
  <div>
    <v-container>
      <v-btn
          depressed
          color="primary"
          @click="increment"
      >
        <v-icon
            dark
            right
        >
          mdi-checkbox-marked-circle
        </v-icon>
        Primary
      </v-btn>
      <v-btn
          depressed
          color="error"
      >
        Error
      </v-btn>
    </v-container>
  </div>
</template> 

「Vuetify」のコンポーネント別の情報は以下から確認してください。

https://vuetifyjs.com/en/components/all/

現状把握している問題

2023年4月1日現在では、バージョン3では「nuxt/pwa」が動作していないようです。

 ERROR  Cannot destructure property 'nuxt' of 'this' as it is undefined.                                                                                                                                10:06:25

  at pwa (node_modules/@nuxtjs/pwa/dist/pwa.js:733:10)
  at installModule (node_modules/@nuxt/kit/dist/index.mjs:452:21)
  at async initNuxt (node_modules/nuxt/dist/index.mjs:2476:7)
  at async loadNuxt (node_modules/nuxt/dist/index.mjs:2530:5)
  at async loadNuxt (node_modules/@nuxt/kit/dist/index.mjs:540:19)
  at async Object.invoke (node_modules/nuxi/dist/chunks/build.mjs:41:18)
  at async Object.invoke (node_modules/nuxi/dist/chunks/generate.mjs:39:5)
  at async _main (node_modules/nuxi/dist/cli.mjs:49:20)

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

PWA」でアプリを作成する場合はバージョン2で作るか、対応するまで待った方が良さそうです。