nuxt.config.js配置

473 阅读4分钟

nuxt3总结文档

一、配置文件

1、nuxt.config.js
import * as dotenv from 'dotenv'
import { NuxtPage } from 'nuxt/schema'
import { version } from './package.json'const dotenvResult = dotenv.config({ path: './.env' })
if (dotenvResult.error) {
  throw dotenvResult.error
}
​
export default defineNuxtConfig({
  ssr: false,
  // TODO
  // serverHandlers: [],
  typescript: {
    includeWorkspace: true
    // typeCheck: true
  },
  devtools: { enabled: false },
  //npm包下载的依赖在此注入
  modules: [
    '@vant/nuxt',
    '@nuxt/devtools',
    'nuxt-icons',
  ],
​
  // 使用环境变量构建后需要指定的私有或公共令牌。
  //页面使用useRuntimeConfig()api可以直接获取
  runtimeConfig: {
    apiServerHost: process.env.NUXT_API_SERVER_HOST,
    //客户端可用
    public: {
      requestAppid: process.env.NUXT_PUBLIC_REQUEST_APPID,
      requestAppkey: process.env.NUXT_PUBLIC_REQUEST_APPKEY,
      BUILD_ENV: process.env.NUXT_BUILD_ENV,
​
      clientType: process.env.NUXT_PUBLIC_CLIENT_TYPE,
      //
      apiClientHost: process.env.NUXT_PUBLIC_API_CLIENT_HOST,
      apiBase: process.env.NUXT_PUBLIC_API_BASE,
      // ...envViteData,
      version,
      WX_APP_ID: process.env.NUXT_WX_APP_ID,
      QQ_APP_ID: process.env.NUXT_QQ_APP_ID,
      QQ_AUTH_URI: process.env.NUXT_QQ_AUTH_URI,
​
      USER_KEY: process.env.VITE_USER_KEY,
    },
  },
  //看nitro官网配置
  nitro: {
    //本地代理
    devProxy: {
      '/dev': {
        target: 'xxxxx',
        prependPath: true,
        changeOrigin: true,
      },
      '/stage-api': {
        target: 'xxxx',
        prependPath: true,
        changeOrigin: true,
      },
    },
  },
  imports: { dirs: ['./apis', './utils', './types'] },
  hooks: {
    // TODO 提取到 build/ 目录
    'pages:extend' (pages) {
      function removePagesMatching (pattern: RegExp, pages: NuxtPage[] = []) {
        const pagesToRemove = []
        for (const page of pages) {
          if (pattern.test(page.file!)) {
            pagesToRemove.push(page)
          } else {
            removePagesMatching(pattern, page.children)
          }
        }
        for (const page of pagesToRemove) {
          pages.splice(pages.indexOf(page), 1)
        }
      }
      removePagesMatching(/(components|hooks)/, pages)
    },
  },
  css: [
    '~/assets/css/main.css',
    '@/assets/css/common.scss',
    'swiper/swiper.min.css',
    // '@kukejs/business-wap/vue3/style.css',
  ],
  app: {
    head: {
      htmlAttrs: {
        lang: 'zh-CN',
      },
      viewport:
        'width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no',
​
      meta: [
        {
          name: 'renderer',
          content: 'webkit',
        },
      ],
      // 设置script
      script: [
        {
          src: '/libs/lottie_light.min.js',
        },
        {
          src: process.env.NUXT_ICONFONT_CDN,
        },
        {
          src: process.env.NUXT_WXLOGIN_CDN,
          body: true,
        },
      ],
    },
  },
  telemetry: false,
  extends: [
    '../base',                     // 从本地继承
    '@my-themes/awesome',          // 从 npm 安装
    'github:my-themes/awesome#v1', // 从 github 下载
  ]
  vite: {
    css: {
      preprocessorOptions: {
        scss: {
          additionalData:
            '@use "@/assets/css/_colors.scss" as *;\n@use "@/assets/css/vant.scss" as *;\n',
        },
      },
    },
    // TODO 提取到 build/ 目录
    esbuild: {
      drop: ['LOCAL', 'LOCAL_STAGING', 'DEV', 'STAGING'].includes(process.env.NUXT_BUILD_ENV!)
        ? []
        : ['console', 'debugger'],
      pure: ['LOCAL', 'LOCAL_STAGING', 'DEV', 'STAGING'].includes(process.env.NUXT_BUILD_ENV!)
        ? []
        : ['console.log', 'console.info'],
    },
  },
  // workspaceDir: '',
  postcss: {
    plugins: {
      'postcss-pxtorem': {
        rootValue ({ file }: { file: string }) {
          // if (file.includes('base/components')) {
          //   console.log('*************************', file)
          // }
          return /(vant)/.test(file) ? 50 : 100
        },
        propList: ['*'],
        // exclude: /(node_modules)/,
        // include: [],
        // minPixelValue: 1,
        selectorBlackList: ['body', 'html', '.rem-ignore'],
      },
​
      tailwindcss: {},
      autoprefixer: {
        overrideBrowserslist: ['last 5 version', '>1%'],
      },
      ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}),
    },
  },
  webpack: {
    extractCSS: true,
  },
  // srcDir: "src/",
  experimental: {
    componentIslands: false,
    respectNoSSRHeader: false,
  },
})
2、app.config.js
export default defineAppConfig({
  defaultTitle: '',
  defaultKeywords: '',
  defaultDescription: '',
  lesseeId: '',
  theme: {
    dark: false,
  },
  logo: {},
})
​

注意: 这个配置文件中的数据可以在页面用useAppConfig() 直接使用

二、api

  • definePageMeta
definePageMeta({
  layout: 'user',
  alias: ['/function-page/:type.html'],  //可以加html 打开页面加上html也可以打开,目前只知道这么用?
  validate: (route) => {
    return /^[a-zA-Z0-9]+$/.test(route.params.type as string)
  },
})

三、项目文件目录

1、Composables 目录

Nuxt 3使用composables/目录使用auto-imports自动将Vue组合导入到应用中!,Nuxt只扫描 composables/ 目录的顶层文件,意思是在此目录下新建的ts文件写的方法可以在页面直接使用

注意: 模块化代码有一定的限制,比如在composables目录下新建一个test文件夹,在test目录下智能新建名为index的ts文件,用其他的名字在页面内无法引用方法并且会报错。

2、Components 目录

自动导入组件 我们把Vue组件放在components/目录,这些组件可以被用在页面和其他组件中,以往我们使用这些组件需要导入并注册它们,但Nuxt会自动导入components/目录中的任意组件。比如:

| components/
--| TheHeader.vue
--| TheFooter.vue

layouts/default.vue:

<template>
  <div>
    <TheHeader />
    <slot />
    <TheFooter />
  </div>
</template>

组件名称约定 没有嵌套的组件会以文件名直接导入,但如果存在嵌套关系哪?例如下面的路径:

| components/
--| base/
----| foo/
------| Button.vue

那么组件名称将会基于路径和文件名连起来,比如上面的base/foo/Button.vue注册名称将会是BaseFooButton,将来用起来会像下面这样:

<BaseFooButton />

四、中间件

Nuxt3 中间件类型可以分为以下两种:

  1. 服务端中间件:供服务器使用,每次请求都会运行。
  2. 客户端中间件: 仅在客户端运行,运行时并不改变页面内容,通常用于处理路由守卫等场景。

其中,服务端中间件位于 server/middleware 目录下,客户端中间件位于 middleware 目录下。服务端中间件只能在服务端生命周期期间使用,不能直接在页面内部使用。

1、匿名中间件

匿名中间件,直接在使用它们的页面中定义,这些中间件只会针对当前页面组件生效,对其他页面组件不会造成影响。

definePageMeta({
  middleware(to, from) {
    console.log('匿名中间件,只在当前页面使用');
  }
})
2、具名中间件

具名中间件是指在 middleware 目录下存放的中间件文件以及其文件名即为其名称。下面是一个具名中间件的示例:

//middleware下新建test.ts
export default defineNuxtRouteMiddleware((to, from) => {
  console.log('具名中间件' + to.path); 
})

如果你需要将该中间件用作给定页面或页面组件的中间件,则可以通过在页面或组件的 middleware 属性中列出中间件名称来指定该中间件。例如:

//在页面中使用
definePageMeta({
  middleware: ['test']
})
3、全局中间件

全局中间件,在 middleware 目录下创建 test.global.ts, 后缀为.global.ts则认定该组件为全局中间件,这样不需要在页面中指定中间件,每个页面访问都会自动使用到该中间件