Skip to content
On this page

本文主要介绍了从零搭建一个nuxt3 的SSR项目:页面配置、CSS处理、路由使用、组件定义、自定义hooks、server、middleware

中文官网: https://www.nuxtjs.org.cn

环境搭建:node 版本 > 14 我是 14.18.1

初始化项目

typescript
// 初始化
npx nuxi init appName
// 进入项目 & 安装依赖 可以使用 yarn npm 或者其它
cd appName && yarn 

注意:初始化失败处理

如果没有以下报错则忽略继续往下

typescript
ERROR  Failed to download template from registry: request to https://raw.githubusercontent.com/nuxt/starter/templates/templates/v3.json failed,reason: getaddrinfo ENOENT raw.githubusercontent.com

开始是觉得 没有翻墙的问题,还没搭了梯子还是不行,只能去git拉模板了

启动项目

typescript
yarn dev -o 

看到下面的初始化页面,说明成功启动了项目

项目目录

细心的小伙伴就会发现,我们的目录很简洁

typescript
- .nuxt
- node_modules
- .gitignore 
- app.vue 
- nuxt.config.ts
- package-lock.jso
- package.json
- README.md
- tsconfig.json  

这里我们可以配置成平常的开发目录

新增src 目录

注意:nuxt是约定式的目录结构

我们新增了src框架本身并不能识别,所以需要配置在 nuxt.sonfig.ts文件中进行配置

项目开发注意点

1.配置 title 、meta 、及外链的引入 【全局和具体页面】

typescript
// 这里配置的是全局的
// nuxt.config.ts 
app: {
    head: {
      title: '项目名称',
      meta: [],
      script: [],
      link: [],
      style: []
    }
  },

// 具体页面
<script lang="ts" setup>
useHead({
  titleTemplate: '项目名称', // 可以写模板
  viewport: 'width=device-width, initial-scale=1, maximum-scale=1',
  charset: 'utf-8',
  meta: [
    { name: 'description', content: 'My amazing site.' }
  ],
  // body添加类名
  bodyAttrs: {
    class: 'test'
  }
})
</script>

2. css 预处理

安装less

如果我们vue 文件中使用了 less、scss 或者其它css预处理语言,会报错,因为nuxt3 没有内置

typescript
yarn add less -D 
// 或
npm i less -D

安装less 之后就可以正常使用less 语法了

全局css 样式、var
typescript
// nuxt.config.ts 
// 这里和vite 中配置的意义
vite: {
        css: {
            preprocessorOptions: {
              less: {
                modifyVars: {
                  '@theme-colors': '#333333',
                  '@assist-colors': '#EE1B24',
                  '@white': '#FFFFFF'
                },
                javascriptEnabled: true,
                additionalData: `@import "${resolve(__dirname, 'src/assets/style/mixin.less')}";`
              },
            },
          },
    },
postcss 配置
typescript
postcss: {
        plugins: {
            // 这个工具可以实现自动添加CSS3前缀
            "autoprefixer": {
                overrideBrowserslist: ["last 5 version", ">1%", "ie >=8"]
            },
            'postcss-pxtorem': {
                rootValue: 192, // 指定转换倍率,我现在设置这个表示1rem=192px;
                propList: ['*'], // 属性列表,表示你要把哪些css属性的px转换成rem,这个*表示所有
                mediaQuery: false, // 是否允许使用媒体查询,false媒体查询的代码可用,true不可用
                exclude: 'ignore',
                replace: true, // 替换包含rem的规则,而不是添加回退
                minPixelValue: 1, // 需要转换的最小值,一般1px像素不转换,以上才转换
                unitPrecision: 6, // 转换成rem单位的小数点后的保留位数
                selectorBalckList: ["/.van-/"], // 匹配不被转换为rem的选择器
            },
        },
    },

3. 路由定义

不需声明路由文件及配置,需在pages下写对应的页面,嵌套路由配置成文件夹

4.组件定义

和路由一样,不需要额外申明,需在components下定义

组件的使用: 在任意vue 文件中使用 正常使用组件懒加载

typescript
// 正常使用
<template>
  <ListButton />
</template>

// 组价**懒加载** 前面 + Lazy
<template>
  <LazyListButton />
</template>

组件懒加载

5.自定义hooks

composables 下声明文件

使用

6.server 的使用

server 下声明并使用

typescript
// src/server/api/user.ts
export default () => {
    return Promise.resolve({
        code: 200,
        data: {
            name: 'xiaoyi'
        }
    })
}

// pages/index.vue
<script lang="ts" setup>
const res = await $fetch("/api/user");
console.log(res) // {"code": 200, "data": { "name": "xiaoyi"} }
</script>

除了已上的使用,我们还可以使用中间件,针对业务打一些日志呀什么的,需要注意的是 它是所有请求都会经过这个中间件

typescript
// 这里需要先安装一下 h3
yarn add h3

在服务端获取数据的使用

  • useAsyncData
  • useFetch
  • useLazyAsyncData
  • useLazyFetch

源码

nuxt3-temple