当前位置:   article > 正文

使用Vite构建Vue项目,整合vuex、vue-router、axios、scss_用vite 构建项目

用vite 构建项目

从webpack到Vite,为什么推荐使用Vite,而不是vue-cli,因为Vite是一种新的、更快地 web 开发工具

Vite的优势:

Vite具有如下特点:

  1. 快速的冷启动
  2. 即时的模块热更新
  3. 真正的按需编译

使用Vite构建的项目和使用Vue-cli构建的项目对比,给我最直观的感受有两点:

  1. Vite:冷启动时,几乎秒启动
  2. Vite:热更新时,保存代码和页面渲染几乎同时完成

原因可参考官网解释:为什么选 Vite | Vite.js中文网 (vitejs.net)

如何使用Vite构建项目:

安装和创建项目:(开箱即用)

npm init @vitejs/app my-vue-app --template vue

打开项目,项目结构如下:

由图可知,代码结构与Vue-cli构建的项目类似

整合router(路由)

安装:

npm install vue-router@next

创建一个文件,用来配置route:

router.js中:

  1. import { createRouter,createWebHistory} from "vue-router"
  2. //已经创建好了login和home组件,这里不过多赘述
  3. //且配置好了根路径别名:‘@’,后面会讲(常用的配置)
  4. const routes = [
  5. {
  6. path:'/',
  7. redirect: 'login'
  8. },
  9. {
  10. path:'/login',
  11. component: () => import('@/pages/login/login.vue')
  12. },
  13. {
  14. path:'/home',
  15. component: () => import('@/pages/home/home.vue')
  16. }
  17. ]
  18. // 导出路由
  19. const router = createRouter({
  20. history: createWebHistory(), //开启history模式
  21. routes
  22. });
  23. export default router;

创建好了router文件后,记得一定要导出,在main.js中使用

  1. //main.js
  2. import { createApp } from 'vue'
  3. import App from '@/App.vue'
  4. //导入router配置文件
  5. import route from '@/route/router'
  6. //类似于:
  7. /**
  8. vue-cli:
  9. Vue.use(router)
  10. const app = new Vue({
  11. render: h => h(App)
  12. }).$mount("#app")
  13. */
  14. const app = createApp(App)
  15. //全局注册
  16. app.use(route)
  17. app.mount('#app')

启动项目:npm run dev

访问:localhost:3000 (样式会在整合sass中讲解)

整合Vuex:(相对比较简单)

可以参考官网:https://next.vuex.vuejs.org/

安装:

npm install vuex@next --save

新建文件store.js:

  1. //store.js:
  2. import { createStore } from 'vuex'
  3. const store = createStore({
  4. state () {
  5. return {
  6. count: 0
  7. }
  8. },
  9. getters:{
  10. getCount(state){
  11. return state.count
  12. }
  13. },
  14. mutations: {
  15. increment (state) {
  16. state.count++
  17. }
  18. }
  19. })
  20. export default store

在main.js中使用:

  1. // main.js:
  2. import { createApp } from 'vue'
  3. import App from '@/App.vue'
  4. import route from '@/route/router'
  5. import store from '@/store/store'
  6. const app = createApp(App)
  7. //全局注册
  8. app.use(route)
  9. app.use(store)
  10. app.mount('#app')

在login中使用Vuex中的数据:在Vue3中至此多个根节点

  1. <template>
  2. <h1>登录</h1>
  3. <button @click="login">点击登录</button>
  4. <router-link to="/home">跳转</router-link>
  5. <!--这里是vuex的数据,不要直接在这里使用:this.$store.state.count-->
  6. <h3>{{count}}</h3>
  7. <button @click="click">添加</button>
  8. </template>
  9. <script>
  10. export default {
  11. data(){
  12. return {
  13. count:this.$store.state.count //注意这一块
  14. }
  15. },
  16. methods:{
  17. click(){
  18. this.$store.commit('increment')
  19. this.count = this.$store.state.count
  20. }
  21. },
  22. }
  23. </script>

整合axios

安装:

npm install axios

配置axios,新建两个文件:

  1. //axios.js: axios配置
  2. import axios from 'axios'
  3. const http = axios.create({
  4. // baseURL:"http://localhost:8080/", //配置 baseURL
  5. timeout:3000, //配置请求超时时间
  6. })
  7. //请求拦截器
  8. http.interceptors.request.use((config) => {
  9. //在发送请求之前的业务逻辑
  10. console.log("请求之前")
  11. return config
  12. },(error) => {
  13. //请求发生错误的业务逻辑
  14. console.log("请求发生错误")
  15. return Promise.reject(error)
  16. })
  17. //响应拦截器
  18. http.interceptors.response.use((response)=>{
  19. //对响应数据的处理
  20. //如果后端响应的状态不是200,那么直接抛出异常
  21. console.log("响应成功")
  22. if(response.data.status != 200){
  23. return Promise.reject(response)
  24. }else{
  25. return Promise.resolve(response);
  26. }
  27. },(error) => {
  28. console.log("响应出现错误")
  29. if(error.response.status){
  30. //响应错误
  31. let status = error.response.status
  32. //根据不同的状态码,提示不同的信息
  33. switch(status){
  34. case 404:
  35. console.log("你访问的网页不存在")
  36. break
  37. case 401:
  38. console.log("身份验证失败")
  39. break
  40. case 403:
  41. console.log("登录过期")
  42. break
  43. default:
  44. console.log(error.response.data.msg) //其他的错误,抛出错误提示
  45. }
  46. return Promise.reject(error)
  47. }
  48. })
  49. export default http
  1. //api.js: 请求方法封装
  2. import http from "@/request/axios.js"
  3. import qs from 'qs' //把参数序列化
  4. //qs.stringify()是将对象 序列化成URL的形式,以&进行拼接
  5. const api = {}
  6. //封装login方法
  7. api.loginFun = (username,password) => {
  8. let url = `login`
  9. let response = http.post(url,qs.stringify({
  10. username,
  11. password
  12. }))
  13. console.log("response: "+response)
  14. return response
  15. }
  16. export default api

如何使用封装后的loginFun方法:

将封装的方法挂载为全局方法,这样就可以在任一组件中调用,在main.js中配置:

  1. import { createApp } from 'vue'
  2. import App from '@/App.vue'
  3. import route from '@/route/router'
  4. import store from '@/store/store'
  5. import api from '@/request/api.js' //导入封装后的请求方法
  6. const app = createApp(App)
  7. app.use(route)
  8. app.use(store)
  9. //主要代码如下:
  10. //挂载全局属性或者方法,类似于 Vue.prototype.$api = api
  11. app.config.globalProperties.$api = api
  12. app.mount('#app')

挂载好方法后,在组件中调用方法:

  1. <template>
  2. <h1>登录</h1>
  3. <button @click="login">点击登录</button>
  4. <router-link to="/home">跳转</router-link>
  5. <h3>{{count}}</h3>
  6. <button @click="click">添加</button>
  7. </template>
  8. <script>
  9. export default {
  10. data(){
  11. return {
  12. count:this.$store.state.count
  13. }
  14. },
  15. mounted(){
  16. // console.log(this.$axios)
  17. },
  18. methods:{
  19. click(){
  20. this.$store.commit('increment')
  21. this.count = this.$store.state.count
  22. },
  23. login(){
  24. //调用封装好的请求方法
  25. let response = this.$api.loginFun("admin","123")
  26. }
  27. },
  28. }
  29. </script>

发起登录请求:(我的接口在本地,会出现跨域的问题,所以需要在配置文件中配置代理,后面会讲解)

整合scss:

安装:

npm install sass

在组件中使用:指定语言lang="scss",@mixin和@include都是scss中的用法

  1. //在login.vue中:
  2. ...
  3. <style lang="scss" scoped>
  4. @mixin styleFun(){
  5. color: red;
  6. border: 1px solid red;
  7. background: green;
  8. }
  9. h1{
  10. @include styleFun()
  11. }
  12. </style>

常用的配置,如下:

  1. //vite.config.js:
  2. import { defineConfig } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import path from "path";
  5. // https://vitejs.dev/config/
  6. export default defineConfig({
  7. plugins: [vue()],
  8. resolve:{
  9. //配置根路径别名: import('@/pages/login/login.vue')
  10. alias: {
  11. "@": path.resolve(__dirname, "src")
  12. },
  13. },
  14. server:{
  15. host: '0.0.0.0', //配置host,0.0.0.0:时可以通过ip地址访问
  16. port: 3000, // 配置启动端口
  17. open: true, //项目启动自动在浏览器中打开
  18. https: false, //是否启用https
  19. proxy:{ //配置代理,解决跨域问题
  20. "/login":{
  21. target:"http://localhost:8888/",
  22. changeOrigin:true
  23. }
  24. }
  25. }
  26. })

与Vue-cli不同使用方式:

  • 挂载全局方法:app.config.globalProperties.$api = api
  • 注册全局组件:app.component("myGlobal",global)

main.js全部代码:

  1. import { createApp } from 'vue'
  2. import App from '@/App.vue'
  3. import route from '@/route/router'
  4. import store from '@/store/store'
  5. import api from '@/request/api.js'
  6. import global from '@/components/global.vue'
  7. const app = createApp(App)
  8. app.use(route)
  9. app.use(store)
  10. //挂载全局属性,或者方法,类似于 Vue.prototype.$api = api
  11. app.config.globalProperties.$api = api
  12. //注册全局组件
  13. app.component("myGlobal",global)
  14. app.mount('#app')

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/229151
推荐阅读
相关标签
  

闽ICP备14008679号