vite搭建vue2项目

搭建过程
1、初始化项目

vite提供了对应的npm命令可以创建各种框架的项目,但是vite在创建vue项目时,默认直接创建vue3,因此这里我们使用原生项目进行创建

1.1 创建项目

注意:这里vite的版本采用2.8.0的,最新的版本创建后续会出现问题

   npm init vite@2.8.0

后续,安装如图

创建好项目后

// 1.进入项目
cd vite-vue2

// 2.安装依赖
 npm install

// 3.启动项目
 npm run dev

效果图如下:

1.2 安装vite对vue2支持的插件

  • 在vite-vue2安装:vite-plugin-vue2

     // 注意:vite-plugin-vue2的版本为1.9.3
     npm install vite-plugin-vue2@1.9.3 -D
    
  • 在根目录创建vite.config.js文件,来注册插件

        import { defineConfig } from 'vite' // 动态配置函数
        import { createVuePlugin } from 'vite-plugin-vue2'
        import { resolve } from 'path'
        export default () =>
        defineConfig({
         plugins: [createVuePlugin()],
         server: {
                  open: true, //自动打开浏览器
                  port: 1567 //端口号
           },
           resolve: {
                   // 别名
          alias: [
                  {
                          find: '@',
                          replacement: '/src'
                   }
               ]
              }
          })
    

1.3 安装vue依赖

  • npm命令安装

写本文时,通过npm install vue安装会直接安装3.0版本的因此要指定好vue版本

   npm install vue@2.x vue-template-compiler@2.x -S 

1.4 修改项目文件结构

1.4.1 创建src目录
在项目根目录下创建src目录,然后把main.js移到src目录里

  import Vue from 'vue'
  import App from './App.vue'

  new Vue({
        render: h => h(App)
  }).$mount('#app')

1.4.2 修改index.html
修改项目启动的入口文件

  // index.html
  <script type="module" src="/src/main.js"></script>

1.4.3 创建App.vue文件
代码如下:

 <template>
    <div>Hello Vite Vue2</div>
 </template>

1.5 运行一下项目
再次运行下项目检验一下之前配置有无问题

  npm run dev
2、vue-router

2.1 安装

 npm install vue-router@3.5.2 -S

2.2 新建router目录

2.2.1 创建路由表

在src目录下创建router目录,并在router目录下创建index.js文件和module目录,在module目录下创建home.js和index.js。这里采用分模块来存放路由表

// /src/router/module/home.js

   export const home = [
        {
         path: '/home',
         meta: { title: '首页' },
         component: () => import('@/views/home/Index.vue')
        }
    ]

// /src/router/module/index.js

   import { home } from './home'
   export const module = [...home]

// /src/router下index.js

import { module } from './module/index'
import VueRouter from 'vue-router'
import Vue from 'vue'
// 使用VueRouter
Vue.use(VueRouter)
   const routes = [
        ...module
 ]

const router = new VueRouter({
        mode: 'history',
        base: '/',
        routes
  })

 export default router

2.2.2 创建路由指向的页面组件
在 src 目录下创建 views 目录,用来存放页面组件。

在 src/views/home 目录下创建1个页面:Index.vue

 <template>
    <div>
      Home
   </div>
 </template>

2.3 全局注册

2.3.1 在main.js里注册

 import Vue from 'vue'
 import App from './App.vue'
 import router from './router/index.js' 
 new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

2.3.2 创建路由跳转标签
修改App.vue文件

 <template>
     <div id="app" class="app">
       <router-view></router-view>
   </div>
</template>
3、vuex

vuex作为大型单页面的状态管理器,使用起来十分方便,在有mapState、mapMutation等语法糖的引入变得更加的简单,但当项目比较小的时候可以不引入,可能会变得臃肿起来,这里为了学习就引入进来了~

3.1 安装

 npm install vuex@3.6.2 -S

3.2 新建vuex目录
在src目录下创建store目录,并在store目录下创建index.js

 // index.js
  import Vue from 'vue'
  import Vuex from 'vuex'
  Vue.use(Vuex) // 使用Vuex
   export default new Vuex.Store({
        state: {
            count: 0
       },
        mutations: {
          increment(state) {
           state.count++
          }
        },
       actions: {},
       modules: {}
   })

3.3 全局注册

 import Vue from 'vue'
 import App from './App.vue'
 import router from './router/index.js'
 import store from './store'

 new Vue({
   router,
   store,
  render: h => h(App)
 }).$mount('#app')

4、组件库
这里组件库我采用了阿里推荐的ant-design-vue,版本采用1.x才兼容vue2

4.1 安装

 npm install ant-design-vue@1.7.8 -S

4.2 按需引入

ps:在官网看半天还以为要引入babel-plugin-import 来按需引入,搞半天最后发现可以直接引入。。。。

在src建立目录plugin/antd目录,在下面创建index.js文件,代码如下:

 import Vue from 'vue'
 import { Button, message } from 'ant-design-vue' // 按需引入
 import 'ant-design-vue/dist/antd.css' // or 'ant-design-vue/dist/antd.less'
 // 挂载全局Message
 Vue.prototype.$message = message
 Vue.use(Button)

4.3 在main.js全局注册

// main.js
// 引入antd
import './plugin/antd'
 new Vue({
   router,
   store,
   render: h => h(App)
 }).$mount('#app')

4.4 在页面中使用

<template>
  <div>
    <a-button type="dashed" @click="onClick">
     Dashed
   </a-button>
   </div>
</template>
<script>
 export default {
    mounted() {
  },
  methods: {
     onClick() {
       this.$message.info('This is a normal message');
     }
    }
 }
 </script>
5、axios

本文会对axios做一个简单的封装。

5.1 安装

 npm install axios -S

5.2 封装axios
在src创建http目录,在其下面创建request.js和home.js

 // request.js
  import axios from 'axios'
  import { message } from 'ant-design-vue'
 // 创建axios实例
 // 创建请求时可以用的配置选项
// 配后端数据的接收方式application/json;charset=UTF-8
// 或者application/x-www-form-urlencoded;charset=UTF-8
 const contentType = 'application/json;charset=UTF-8'
  const instance = axios.create({
/**
 * 是否携带cookie,注意若携带cookie后端必须配置
 * 1.Access-Control-Allow-Origin为单一域名(具体到IP + port,用localhost貌似不行)
 * 2.需要带上响应头Access-Control-Allow-Credentials
 */
// withCredentials: true,
timeout: 1000,
baseURL: 'http://localhost:8000/api/v1',
headers: {
    'Content-Type': contentType
    }
})
 // axios的全局配置
 instance.defaults.headers.post = {
  'Content-Type': 'application/x-www-form-urlencoded'
}
instance.defaults.headers.common = {
 'Auth-Type': 'company-web',
 'X-Requested-With': 'XMLHttpRequest',
  token: 'sdfjlsdfjlsdjflsjflsfjlskd'
}

// 添加请求拦截器(post只能接受字符串类型数据)
instance.interceptors.request.use(
config => {
    const token = window.sessionStorage.getItem('token')
    if (token) {
        config.headers.Authorization = token
    }
    return config
},
error => {
    return Promise.reject(error)
}
)
const errorHandle = (status, other) => {
switch (status) {
    case 400:
        message.error('信息校验失败')
        break
    case 401:
        // @ts-nocheck
        message.error('认证失败')
        break
    case 403:
        message.error('token校验失败')
        break
    case 404:
        message.error('请求的资源不存在')
        break
    default:
        message.error(other)
        break
    }
}

// 添加响应拦截器
instance.interceptors.response.use(
// 响应包含以下信息data,status,statusText,headers,config
res => {
    if (res.data && res.data.code !== 0 && !(res.data instanceof Blob)) {
        message.error(res.data.msg || '服务器出错!')
    }
    // 请求通用处理
    return res.data
},
err => {
    // message.error(err)
    const { response } = err
    if (response) {
        errorHandle(response.status, response.data)
        return Promise.reject(response)
    }
    message.error('请求失败')
    return true
    }
)

export default instance


import request from './request'
 export default {
   getList(model) {
     return request({
     url: '/theme/list',
     method: 'post',
     data: model
    })
   },
}

5.3 在页面中使用

<script>
 import $http from '@/http/home.js'
 export default {
   mounted() {
  
  },
  methods: {
  async onSubmit(){
      const res = await $http.getList({});
      console.log(res)
  }
 }
}
</script>
总结

以上就是我用vite搭建vue2项目的一个全过程啦。希望对大家搭建项目有所帮助,如果有帮助的话,欢迎给文章点个赞👍也欢迎留言提问❓

⭐️最后的最后,附上我的package.json文件(这点真的很重要😰)

{
 "name": "vite-vue2",
 "private": true,
 "version": "0.0.0",
 "scripts": {
   "dev": "vite",
   "build": "vite build",
   "preview": "vite preview"
 },
 "devDependencies": {
  "less": "^3.9.0",
   "less-loader": "^4.1.0",
   "vite": "^2.8.0",
   "vite-plugin-vue2": "^1.9.3"
 },
 "dependencies": {
   "ant-design-vue": "^1.7.8",
    "axios": "^0.27.2",
   "qs": "^6.11.0",
   "vue": "^2.7.8",
   "vue-router": "^3.5.2",
   "vue-template-compiler": "^2.7.8",
   "vuex": "^3.6.2"
 }
}
更新

感谢评论区网页的提问意见。解决了两个问题

安装vue-router时应该是npm install vue-router@3.5.2 -S
使用npm run build之后用npm run preview会出现require is not defined的问题。这个可以参考这篇文章vue cli改造vite最佳实践。注意:经过实践,本项目出现的根源在于组件库ant-design-vue的问题,这里需要在vite.config.js加入如下的配置:

resolve: {
    alias: [
    // 忽略其他代码
     { find: /ant-design-vue$/, replacement: 'ant-design-vue/dist/antd.min' } // 解决关键点。
     ]
 },
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容