Nuxt3+Vuetify 環境構築
Nuxt3+Vuetify 環境構築

Nuxt3+Vuetify 環境構築

UMORiH
UMORiH投稿日:2024-06-24 最終更新日:2024-07-18

プロジェクト作成手順

1. Nuxt3の環境を構築

npx nuxi@latest init src
mkdir @types
mkdir src
mkdir src/assets
mkdir src/components
mkdir src/composables
mkdir src/layouts
mkdir src/pages
mkdir src/plugins
mv public src
rm app.vue
touch .env
yarn

2. Vuetify 等のライブラリをインストール

yarn add -D vuetify@latest sass pug dayjs @nuxtjs/i18n @mdi/font
mkdir src/assets/lang
touch src/assets/lang/ja.json
mkdir src/assets/styles
touch src/assets/styles/main.sass
touch src/assets/styles/customize.scss
touch src/plugins/vuetify.ts
touch src/pages/index.vue

3. コンフィグファイルの設定

// nuxt.config.ts

// <https://nuxt.com/docs/api/configuration/nuxt-config>
import { resolve } from 'path'

export default defineNuxtConfig({
  srcDir: 'src',
  modulesDir: [
    'node_modules',
    resolve(__dirname, '..', '..', 'node_modules'),
  ],
  devtools: { enabled: true },
  app: {
    head: {
      title: process.env.APP_NAME,
    },
  },
  modules: ['@nuxtjs/i18n',],
  i18n: {
    defaultLocale: 'ja',
    locales: [{ code: 'ja', iso: 'ja-JP', file: 'ja.json' }],
    langDir: 'assets/lang',
  },
  imports: {
    autoImport: true,
  },
  css: [
    '@/assets/styles/customize.scss',
    '@/assets/styles/main.sass',
  ],
  nitro: {
    prerender: {
      ignore: [
        '/200',
        '/404',
      ],
    },
  },
  vite: {
    ssr: {
      noExternal: [
        'vuetify',
      ],
    },
    build: {
      target: ['esnext'],
    },
  },
  build: {
    transpile: [/vuetify/],
  },
})

4. 各種ファイルの中身

// plugins/vuetify.ts

import { createVuetify } from 'vuetify';
import * as components from 'vuetify/components';
import * as directives from 'vuetify/directives';
import 'vuetify/styles';
import '@mdi/font/css/materialdesignicons.css'

export default defineNuxtPlugin((nuxtApp) => {
  // const config = useRuntimeConfig().public as any;
  const vuetify = createVuetify({
    ssr: true,
    components: {
      ...components,
    },
    icons: {
      iconfont: 'mdi', // default - only for display purposes
    },
    directives,
    display: {
      thresholds: {
        sm: 604,
      },
    },
  });

  // Vue.js で Vuetify を使用する
  nuxtApp.vueApp.use(vuetify);
});


// styles/main.sass

body
  font-family: Noto Sans JP

// styles/customize.scss

$family: 'Noto Sans JP', sans-serif;

// @use "@mdi/font/css/materialdesignicons.css";
@forward 'vuetify' with (
  $body-font-family: $family,
  $grid-breakpoints: (
    'xs': 0,
    'sm': 604px,
    'md': 960px,
    'lg': 1280px,
    'xl': 1920px,
    'xxl': 2560px,
  )
);

@import url('<https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap>');


// pages/index.vue

<template lang="pug">
h1 {{$t('pages.index.greeting')}}

</template>

<script setup lang="ts"></script>

<style scoped lang="sass"></style>

// layouts/default.vue

<template lang="pug">
v-app
  v-app-bar(color="primary")
    v-app-bar-title
  v-main()
    v-container.h-100(
      fluid
    )
      v-row(
        align="center"
        justify="center"
      )
        v-col.flex-grow-0
          slot
</template>

<script setup lang="ts">
</script>

<style scoped lang="sass">
</style>


// assets/lang/ja.json

// 空だとビルドでエラーになる

{
  "layout": {},
  "pages": {
    "index": {
      "greeting": "Hello World!!"
    }
  }
}

4. 起動

yarn dev

備考

Q. require()~ みたいなエラーが起こる

A. package.json に下記追加して、再度 yarn install する。
参照:https://github.com/nuxt/nuxt/issues/21231

  "resolutions": {
    "string-width": "4.2.3"
  }