Nuxt3项目创建(Nuxt3 + Vite +Ts + Pinia + Element-plus + Tailwindcss + NuxtIcon + Vueuse)

一、nuxt3项目创建

node版本最好使用18+

npx nuxi@latest init nuxt3-app

1.1命令运行后会出现几个选项

选择你的包管理器,我喜欢用yarn,根据你的喜好来

是否初始化git仓库

1.2 项目目录结构

1.3 运行项目

yarn dev --open

 出现以下界面,项目运行成功

1.4 新增pages/index.vue 
<template>
  <div>首页</div>
</template>
<script lang="ts" setup>
</script>

app.vue

<template>
  <NuxtPage />
</template>

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

二、添加依赖

2.1. 添加sass预处理器

yarn add sass -D
2.1.1在项目根目录添加assets/css/main.scss  并添加样式代码

 main.scss

.container {
  .text {
      color: red;
      font-size: 32px;
  }
}

app.vue

<template>
  <div class="container">
    <span class="text">文字</span>
  </div>
</template>
 2.1.3 nuxt.config.ts增加配置
export default defineNuxtConfig({
  ...
  css: ["~/assets/css/main.css"],
})

效果:

2.2 添加tailwindcss

yarn add tailwindcss -D
2.2.1 nuxt.config.ts增加配置
export default defineNuxtConfig({
  ...
  postcss: {
    plugins: {
      tailwindcss: {}
    }
  },
})
2.2.2 项目根目录下增加tailwind.config.js文件
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./components/**/*.{js,vue,ts}', './layouts/**/*.vue', './pages/**/*.vue', './plugins/**/*.{js,ts}', './nuxt.config.{js,ts}', './app.vue'],
  theme: {
    extend: {
      colors: {
        'dark': '#000',
        'theme': '#D20001'
      },
      screens: {}
    }
  },
  plugins: []
};
2.2.3 main.scss增加以下代码
@tailwind base;
@tailwind components;
@tailwind utilities;
2.2.4 测试效果
<template>
  <div class="w-36 bg-orange-300">
    <span class="text-theme text-5xl">文字</span>
  </div>
</template>

2.3 安装 nuxt-icons

yarn add nuxt-icons
2.3.1 nuxt.config.ts 中配置
export default defineNuxtConfig({
  ...
  modules: [
    'nuxt-icons',
  ],
})
2.3.2 新建 assets/icons

放一个svg图标

2.3.3 app.vue添加代码 测试效果
<template>
  <NuxtIcon name="wechat" class="text-[80px] text-[#00ff00]"></NuxtIcon>
</template>

2.4 引入element-plus

2.4.1 安装element-plus和@@element-plus/nuxt
yarn add element-plus -D

yarn add @element-plus/nuxt -D
 2.4.2 nuxt.config.ts 配置
export default defineNuxtConfig({
  ...
  modules: [
    'nuxt-icons',
    '@pinia/nuxt',
    '@pinia-plugin-persistedstate/nuxt',
    '@element-plus/nuxt'
  ],
})
 2.4.3 测试效果
<template>
  <el-button type="primary">login</el-button>
</template>

 

2.5 添加 pinia 并做持久化

 2.5.1 安装 pinia
yarn add @pinia/nuxt
 2.5.2 安装 @pinia-plugin-persistedstate/nuxt
yarn add @pinia-plugin-persistedstate/nuxt -D
2.5.3 配置 nuxt.config.ts
export default defineNuxtConfig({
  ...
  modules: [
    'nuxt-icons',
    '@pinia/nuxt',
    '@pinia-plugin-persistedstate/nuxt',
  ],
})
2.5.4 新建 store/auth.ts

auth.ts添加代码

import { acceptHMRUpdate, defineStore } from 'pinia';

interface AuthStore {
  token: string
}

export const useAuthStore = defineStore('auth', {
  state: (): AuthStore => ({
    token: ''
  }),
  getters: {
    isLogin: (state) => state.token !== ''
  },
  persist: true // 开启持久化
});

if (import.meta.hot) {import.meta.hot.accept(acceptHMRUpdate(useAuthStore, import.meta.hot));}

 app.vue添加代码

<template>
  <div>token: {{ token }}</div>
  <div>是否登录:{{ isLogin ? "已登录" : "未登录" }}</div>
  <el-button type="primary" @click="login">login</el-button>
</template>

<script lang="ts" setup>
const authStore = useAuthStore()
const { token, isLogin } = storeToRefs(authStore)

// 模拟登录
const login = () => {
  setTimeout(() => {
    authStore.token = "xxxxx"
  }, 1000)
}
</script>

ps:useAuthStore自动导入 需要在nuxt.config.ts 配置imports 选项

imports: {
    dirs: ['store/**']
  },
2.5.5 测试效果 

持久化成功

2.6 添加Vueuse组合API

yarn add -D @vueuse/nuxt @vueuse/core
 2.6.1 nuxt.config.ts 增加配置
export default defineNuxtConfig({
  modules: [
    '@vueuse/nuxt',
  ],
})
2.6.2 app.vue添加代码
<template>
  <div class="fixed top-0 left-0">垂直滚动距离:{{ y }}</div>
  <div class="h-[2000px] bg-[#00ff00]"></div>
</template>

<script lang="ts" setup>
const { y } = useWindowScroll()
</script>
2.6.3 测试效果

 vueuse官网还有很多用法,可以参考Vueuse中文文档

三、接口封装(不建议使用axios,nuxt3官方推荐使用useFetch和$fetch)

 3.1 新建plugins/my-fetch.ts

import type { FetchResponse } from 'ofetch';
import Message from '@/components/Message'; // 自定义封装的message

export interface ResOptions<T> {
  code: number
  data: T
  msg: string
}

/**
 * 定义request response 错误类型
 */
export enum ResponseStatusCodes {
  SUCCESS = 200,
  TOKEN_EXPIRATION = 401,
  CUSTOM = 4096,
  ERROR = 500,
}

/**
 * message全局提示信息
 * @param text
 */
const err = (text: string) => {
  Message.error({
    text: text,
    duration: 1500
  });
};

/**
 * 清除登录信息
 */
const clearLoginInfo = () => {
  // storeToRefs(useAuthStore()).token.value = '';
};

/**
 * 处理请求错误
 * @param response
 */
const handleFail = <T>(
  response: FetchResponse<ResOptions<T>> & FetchResponse<ResponseType>
) => {
  err('网络服务异常,请重新加载或联系客服');
  return Promise.reject(new Error('网络服务异常,请重新加载或联系客服'));
};

/**
 * 处理请求异常
 * @param response
 */
const handleResponse = <T>(
  response: FetchResponse<ResOptions<T>> & FetchResponse<ResponseType>
): any => {
  // 500错误
  if (response._data?.code === ResponseStatusCodes.ERROR) {
    err('网络服务异常,请重新加载或联系客服');
    return Promise.reject(new Error('网络服务异常,请重新加载或联系客服'));
  }
  // 401
  if (response._data?.code === ResponseStatusCodes.TOKEN_EXPIRATION) {
    clearLoginInfo();
    return Promise.reject(new Error('登录失效,请重新登录'));
  }
  // 后端自定义错误
  if (response._data?.code === ResponseStatusCodes.CUSTOM) {
    err(response._data.msg);
    return Promise.reject(new Error(response._data.msg));
  }
};

export default defineNuxtPlugin(() => {
  const runtimeConfig = useRuntimeConfig();
  const myFetch = $fetch.create({
    // 请求拦截器
    onRequest({ options }) {
      options.baseURL = runtimeConfig.public.apiBaseURL;
      options.headers = new Headers(options.headers);
      // token.value && options.headers.set('token', token.value);
      options.headers.set('platform', '11');
      options.headers.set('c-fronted', 'c-fronted-identify');
      options.headers.set('X-Requested-With', 'XMLHttpRequest');
      options.headers.set('Content-type', 'application/json');
    },
    // 响应拦截
    onResponse({ response }): any {
      // 在这里判断错误
      if (response.status !== ResponseStatusCodes.SUCCESS) {
        return handleFail(response);
      }
      // 成功返回
      // 成功返回
      if (response._data?.code === ResponseStatusCodes.SUCCESS) {
        response._data = response._data.data;
      } else {
        return handleResponse(response);
      }
    },
    // 错误处理
    onResponseError({ response }) {
      return handleFail(response);
    }
  });
  return {
    provide: { myFetch }
  };
});

3.2  新建apis/home.ts

export type BannerListItem = {
  bannerUrl?: string;
  id?: number;
  link?: string;
  name?: string;
  type?: number;
}

// 获取轮播图列表
export const getBannerList = (params: { type: number }) => {
  const { $myFetch } = useNuxtApp();
  return $myFetch<BannerListItem[]>('/tsoweb/frontend/banner/list', {
    method: 'GET',
    params
  });
};

3.3 组件使用

<script lang="ts" setup>
// banner数据
const bannerList = ref<BannerListItem[]>([]);
const { data: bannerData } = await useAsyncData(() => getBannerList({ type: 6 }));
bannerList.value = bannerData.value || [];

</script>

getBannerList无需引入,需要在nuxt.config.ts 配置imports选项

 imports: {
    dirs: ['store/**', 'apis/**']
  },

更多详细文档请参考nuxt3中文文档

<think>嗯,用户想知道如何搭建Nuxt3项目。我需要先整理已有的引用内容,看看里面有没有相关的步骤。引用[1]提到Nuxt3的安装、element-plus和scss的配置,还有目录结构。引用[2]有创建项目和目录结构的信息,引用[3]讲的是安装Element Plus,引用[4]可能和项目启动或访问有关。 首先,我应该分步骤来写,安装、启动、配置Element Plus和SCSS,还有目录结构。根据引用[1],安装Nuxt3是通过npx nuxi init,然后安装依赖并启动,端口默认是3000。可能需要提到如何修改端口,比如在package.json里改启动命令。 接下来是Element Plus的安装,引用[3]说要用pnpm装element-plus和@element-plus/nuxt模块,然后在nuxt.config.ts里配置。可能还需要在组件中使用,比如按需导入ElButton。 然后是SCSS的配置,引用[1]提到安装sass和sass-loader,全局变量的配置可能需要创建_variables.scss并在nuxt.config里引入。这部分要说明如何设置全局变量,避免每个文件都导入。 目录结构部分,引用[1]和[2]都提到了,需要列出主要的目录如app.vue、pages、components、assets等,解释各自的作用,比如app.vue是入口,pages自动生成路由。 还要注意用户可能遇到的问题,比如端口被占用,或者模块配置错误。引用[4]提到访问地址,可能启动后访问localhost:3000,如果端口冲突,修改启动命令里的端口号。 另外,用户可能需要知道如何创建页面,引用[2]提到创建页面,可能在pages目录下新建vue文件,自动生成路由。比如pages/index.vue对应根路由。 最后,生成相关问题,比如如何配置路由、优化性能、部署,或者整合其他UI库,这些可以基于现有的步骤扩展。</think>### Nuxt3项目搭建教程 #### **1. 环境准备** - 确保已安装Node.js(≥16.11.0)和包管理工具(npm/yarn/pnpm)。 - 推荐使用`pnpm`(可通过`corepack enable`启用支持[^1])。 #### **2. 创建Nuxt3项目** **步骤:** ```bash npx nuxi init <project-name> # 初始化项目,例如npx nuxi init nuxt-demo cd <project-name> # 进入项目目录 pnpm install # 安装依赖(或使用npm/yarn) ``` **目录结构说明[^2]:** ``` ├── app.vue # 应用入口 ├── pages/ # 自动生成路由 ├── components/ # 公共组件 ├── assets/ # 静态资源(图片、字体等) ├── nuxt.config.ts # 配置文件 └── package.json ``` #### **3. 启动项目** ```bash pnpm dev # 默认运行在http://localhost:3000[^4] ``` - **修改端口**:在`package.json`的`dev`命令后添加`--port=新端口号`,例如`"dev": "nuxt dev --port=4000"`[^1]。 #### **4. 集成Element-Plus** **安装依赖[^3]:** ```bash pnpm add element-plus @element-plus/nuxt -D ``` **配置`nuxt.config.ts`:** ```typescript export default defineNuxtConfig({ modules: [&#39;@element-plus/nuxt&#39;] }); ``` **使用组件(示例):** ```vue <template> <el-button type="primary">按钮</el-button> </template> ``` #### **5. 配置SCSS支持** **安装依赖:** ```bash pnpm add sass sass-loader -D ``` **全局变量配置:** 1. 创建`assets/scss/_variables.scss`,定义变量如`$primary-color: #409EFF;` 2. 在`nuxt.config.ts`中添加: ```typescript export default defineNuxtConfig({ vite: { css: { preprocessorOptions: { scss: { additionalData: &#39;@use "@/assets/scss/_variables.scss" as *;&#39; } } } } }); ``` #### **6. 创建页面** - 在`pages/`目录下新建`.vue`文件,例如`pages/index.vue`,Nuxt3会自动生成路由[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值