当前位置:

首页 > 编程开发 > 如何从零开始搭建vue3项目

如何从零开始搭建vue3项目

说明记录一次Vue3的项目搭建过程。文章基于vue3.2.6和vite2.51版本,使用了ui库Elementplus,vue-router4,Layout布局封装,axios请求封装,别名配置等。开始1.使用vscode开发工具安装vue3的插件Volar,在vue2中我们使用的是Vetur。vue3在线code工具传送门sfc.vuejs.org/2.执行初始化及安装命令:npminitvite初始化vite此过程可以输入项目名、选择vue/react项目及js/ts环境选择,vue3已经完全支持ts

本文目录

      说明

      记录一次Vue3的项目搭建过程。文章基于 vue3.2.6 和 vite2.51 版本,使用了ui库 Element plus,vue-router4,Layout布局封装,axios请求封装,别名配置等。

      开始

      1. 使用 vscode 开发工具安装vue3的插件 Volar ,在vue2中我们使用的是Vetur。

      • vue3在线code工具 传送门sfc.vuejs.org/

      2. 执行初始化及安装命令:

      npm init vite 初始化vite此过程可以输入项目名、选择vue/react项目及js/ts环境选择,vue3已经完全支持ts,此文章使用的是js。npm install 安装依赖。最后执行npm run dev运行项目。

      如何从零开始搭建vue3项目

      运行过程时如果出现上图的报错信息,可以手动执行 node node_modules/esbuild/install.js,然后再执行npm run dev

      3. 安装vue-router

      执行 npm install vue-router@4 , vue3对应的vue-router和vuex的版本都是 4.0。执行命令安装完成之后,在目录下创建 src/router/index.js 写入下面的配置:

      import { createRouter, createWebHistory } from 'vue-router'
      const routes = [
      // ...
      ]
      
      export default createRouter({
      history: createWebHistory(),
      routes,
      })

      main.js中使用

      // ...+
      import router from './router/index'
      createApp(App).use(router).mount('#app')

      vue-router4写法和以前的有些区别 hash模式 createWebHashHistory history模式 createWebHistory,具体可查看官网。

      4. 全局样式及sass安装(使用@路径需要配置别名,后文有相应的说明)

      执行命令npm i sass -D,然后在目录下创建 src/styles/index.scss:

      // @import './a.scss'; 
      // 作为出口组织这些样式文件,同时编写一些全局样式

      在 mian.js 中引入

      import '@/styles/index.scss'

      tips: vue3中样式穿透 使用::deep(.className) 或者 deep(.className)

      5. Element plus按需引入和全局引入

      执行npm i element3 -S命令安装,如果你能用到里面的大多数组件,就用全局引入方式,如下:

      // main.js
      import element3 from "element3";
      import "element3/lib/theme-chalk/index.css";
      createApp(App).use(router).use(element3).mount('#app')

      如果你只用到几个组件,就可以按需加载优化性能,创建src/plugins/element3.js,如下

      // 按需引入 plugins/element3.js
      import { ElButton, ElMenu, ElMenuItem } from 'element3'
      import 'element3/lib/theme-chalk/button.css'
      import 'element3/lib/theme-chalk/menu.css'
      import 'element3/lib/theme-chalk/menu-item.css'
      export default function (app) {  
          app.use(ElButton) 
          app.use(ElMenu) 
          app.use(ElMenuItem)
      }
      // main.js中引用
      import element3 from '@/plugins/element3.js'
      createApp(App).use(router).use(element3).mount('#app')

      6. Layout布局,创建文件src/layout/index.vue

      // src/layout/index.vue
      
      
      
      import Navbar from './Navbar.vue'
      import AppMain from './AppMain.vue'
      import Footer from './Footer.vue'
      

      根据自己的需求设计布局,使用Layout布局时,需要注意将Layout.vue作为父路由,路由设计大概像下面这样:

      // src/router/index.js
      import { createRouter, createWebHistory } from 'vue-router'
      import Layout from '@/layout/index.vue'
      import Home from '@/views/home/Home.vue'
      import Test from '@/views/test/Test.vue'
      const routes = [
        {
          path: '/',
          component: Layout,
          children: [{ path: '', component: Home }],
        },
        {
          path: '/test',
          component: Layout,
          children: [{ path: '', component: Test }],
        },
      ]
      
      export default createRouter({
        history: createWebHistory(),
        routes,
      })

      7. axios请求封装

      执行命令 npm i axios 安装axios

      新建 src/utils/request.js,在此文件中进行封装axios

      import axios from 'axios'
      // 可以导入element plus 的弹出框代替alert进行交互操作
      
      // create an axios instance
      const service = axios.create({
        baseURL: import.meta.env.VITE_APP_BASEURL, // 使用设置好的全局环境
        timeout: 30 * 1000, // request timeout
      })
      
      // request interceptor
      service.interceptors.request.use(
        (config) => {
          // 此处可以执行处理添加token等逻辑
          // config.headers["Authorization"] = getToken();
          return config
        },
        (error) => {
          console.log(error)
          return Promise.reject(error)
        }
      )
      
      // response interceptor
      service.interceptors.response.use(
        (response) => {
          const res = response.data // 根据接口返回参数自行处理
      
          if (res.code !== 200) {
            if (res.code === 50000) {
              // 根据状态码自行处理
              alert('服务器内部出现异常,请稍后再试')
            }
            return Promise.reject(new Error(res.msg || 'Error'))
          } else {
            // 调用成功返回数据
            return Promise.resolve(res)
          }
        },
        (error) => {
          console.log('err' + error) // 出现异常的处理
          return Promise.reject(error)
        }
      )
      
      export default service

      新建 src/api 目录,可以每个模块或每个页面单独建立一个js文件,方便管理维护api。此处示例,新建 src/api/home.js 文件,写入代码

      // 引入封装好的 request.js
      import request from '@/utils/request'
      
      export function getList(query) {
        return request({
          url: '/list',
          method: 'get',
          params: query,
        })
      }

      在 home.vue 中使用

      
      import { getList } from '@/api/home.js'
      const query = { pagenum: 1 }
      getList(query)
        .then((res) => {
          console.log(res) // 调用成功返回的数据
        })
        .error((err) => {
          console.log(err) // 调用失败要执行的逻辑
        })
      

      8. 环境变量相关

      项目根目录下创建三个文件.env.production 生产环境 .env.development 开发环境 .env.staging 测试环境 ,分别加入下面的代码,在不同的编译环境下,打包时自动执行当前环境下的代码

      # .env.production
      VITE_APP_BASEURL=https://www.prod.api/
      # .env.development
      VITE_APP_BASEURL=https://www.test.api/
      # .env.staging
      VITE_APP_BASEURL=https://www.test.api/

      使用:

      console.log(import.meta.env.VITE_APP_BASEURL)
      // 在不同编译环境下控制台会输出不同的url路径

      在package.json中通过传递 --mode 选项标志来覆盖命令使用的默认模式

        "scripts": {
          "dev": "vite",
          "build:stage": "vite build --mode staging",
          "build:prod": "vite build --mode production",
          "serve": "vite preview"
        },

      这样,生产环境打包执行npm run build:prod,测试/预发布环境打包npm run build:stage

      9. vite中别名配置

      根目录下 vite.config.js 文件添加代码

      import { defineConfig } from 'vite'
      import vue from '@vitejs/plugin-vue'
      import { resolve } from 'path'
      
      // https://vitejs.dev/config/
      export default defineConfig({
        plugins: [vue()],
        resolve: {
          alias: [{ find: '@', replacement: resolve(__dirname, 'src') }],
        },
        base: './',
      })
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Vue3
      相关文章 更多
      pinia数据持久化的步骤详解与插件配置教程
      pinia数据持久化的步骤详解与插件配置教程

      详解Pinia数据持久化的实现步骤,包括手动订阅状态、封装通用插件及处理序列化例外,帮助开发者构建稳定的前端状态存储方案。

      vue3中getCurrentInstance怎么使用
      vue3中getCurrentInstance怎么使用

      父组件中:1.setup语法糖中导入子组件2.在子组件标签上绑定ref值3.setup内部从vue中按需导出getCurrentInstance方法4.调用getCurrentInstance方法导出proxy5.通过proxy.$refs.子组件ref名.子组件内属性/方法实现调用子组件count+1import{getCurrentInstance,ComponetInternalInstance,ref}from"vue";importChildfrom"./zi.vue";constchild=r

      怎么使用vue3搭建后台系统
      怎么使用vue3搭建后台系统

      首先使用npm或者yarn创建一个vue项目//使用npm创建一个基于vite构建的vue项目npmcreatevite@latest//使用yarn创建一个基于vite构建的vue项目yarncreatevite@latest在创建的构成中选择vuevue-ts创建完之后将项目拖到编译器打开一、配置vite在vite.config.ts文件中配置项目的服务数据,配置如下://此处配置项目服务参数server:{host:"0.0.0.0",//项目运行地址,此处代表localhostport:8888,

      Vue3基于countUp.js怎么实现数字滚动的插件
      Vue3基于countUp.js怎么实现数字滚动的插件

      countUp简介CountUp.js是一种无依赖项的轻量级JavaScript类,可用于快速创建以更有趣的方式显示数字数据的动画。CountUp可以在两个方向上进行计数,具体取决于传递的开始和结束值。虽然现在市面上基于countUp.js二次封装的Vue组件不在少数,但我个人是不太喜欢使用这些第三方封装的,因为第三方组件的更新频率很难保证,也许作者只是一时兴起封装上传了,并未打算继续维护,如果使用了等于后续根本没有维护性了,所以这种二次封装我推荐自行实现,我们可以通过本次封装熟悉一下vue3,ts的语法

      vue3中addRoute路由变化但页面未更新如何解决
      vue3中addRoute路由变化但页面未更新如何解决

      解决办法,每次addRoute时深复制组件对象importtimefrom"../views/time"functioncopyObj(obj){if(typeofobj=="object"){if(Array.isArray(obj)){letarr=[];for(letitemofobj){arr.push(Object.assign(copyObj(item)));}returnarr;}elseif(obj==null){returnnull;}else{letobj1={};for(letind

      怎么将Vue3 Axios拦截器封装成request文件
      怎么将Vue3 Axios拦截器封装成request文件

      1、创建一个名为request.js的新文件,并导入Axios:importaxiosfrom'axios';2、创建一个名为request的函数,并将其导出:这将创建一个名为request的函数,并将其设置为具有基本URL的新的Axios实例。要在封装的Axios实例中添加超时设置,可以在创建Axios实例时传递timeout选项。exportconstrequest=axios.create({baseURL:'https://example.com/api',time

      Vue3侦听器的实现原理是什么
      Vue3侦听器的实现原理是什么

      侦听响应式对象前面我们聊到计算属性,它可以自动计算并缓存响应式数据的值。而如果我们仅需要在响应式数据变化时,执行一些预设的操作,就可以使用watch侦听器。我们还是先来实现一个最简单的例子,然后来一点一点扩充它。constdata={foo:1}constobj=reactive(data)watch(obj,()=>{console.log('obj已改变')})在这个例子中,我们使用了watch侦听器,当obj的属性被改变时,控制台应该会打印出obj已改变。基于前面我们对计算属性的实现

      vue3中的createApp怎么使用
      vue3中的createApp怎么使用

      函数定义createApp函数定义在文件packages/runtime-dom/src/index.ts中exportconstcreateApp=((...args)=>{constapp=ensureRenderer().createApp(...args)if(__DEV__){injectNativeTagCheck(app)injectCompilerOptionsCheck(app)}const{mount}=appapp.mount=(containerOrSelector:Element

      vue3中<script setup>和setup函数的区别是什么
      vue3中<script setup>和setup函数的区别是什么

      是在单文件组件(SFC)中使用组合式API的编译时语法糖。当同时使用SFC与组合式API时该语法是默认推荐。相比于普通的语法,它具有更多优势:更少的样板内容,更简洁的代码。能够使用纯TypeScript声明props和自定义事件。更好的运行时性能(其模板会被编译成同一作用域内的渲染函数,避免了渲染上下文代理对象)。更好的IDE类型推导性能(减少了语言服务器从代码中抽取类型的工作)。以上是vue3官网对的说明,其实<scriptsetup>就是setup函数的一个语法糖。一、基本语法setup函数的写法im

      Vue3进阶主题Composition API如何使用
      Vue3进阶主题Composition API如何使用

      什么是CompositionAPICompositionAPI是Vue3中引入的一种新的API风格,旨在提高代码的可读性、可维护性和可重用性。CompositionAPI不同于Vue2中的OptionsAPI,它采用了一种基于函数的编程方式,将组件内的逻辑分解成更小的可组合函数单元,以实现更加灵活和高效的代码组织方式。为什么Vue3推荐使用CompositionAPIVue3推荐使用CompositionAPI的主要原因是为了更好地组织和重用组件逻辑。在Vue2中,我们通常使用OptionsAPI,其中我

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。