从零开始搭建vue3+vite2项目

发布于:2023-01-29 ⋅ 阅读:(784) ⋅ 点赞:(0)

目录

1、创建项目

2、根据提示打开项目

3、安装scss

4、引入element-plus

4.1 安装

4.2 完整引入 

4.3 按需引入 

5、vite.config.js文件

6、App.vue

7、新建vue页面

8、配置路由Vue Router

8.1 安装

8.2 新建router相关文件

8.3 main.js引入

9、vuex

9.1 安装

9.2 新建vuex相关文件

9.3  main.js引入

10、axios

10.1 安装

10.2 新建相关文件

.env.development

.env.production

request.js

user.js

页面请求:

11、综合 main.js

12、配置i18实现语言切换

13、配置scss全局变量

14、自适应及自动添加前缀配置


1、创建项目

选择一个文件夹,用终端打开,输入:

npm init vite@latest

如下图所示,输入项目的文件名(这里是vuePro)--》选择vue--》再次选择vue

 

2、根据提示打开项目

依次输入以上三行命令,启动项目,画面是这个样子的⬇️

3、安装scss

⚠️注意是 sass 不是 scss ⬇️

(使用vite搭建项目只安装sass即可,不需要安装node-sass,sass-loader)

npm i sass

 若是后面用scss时报错了重启一下项目

4、引入element-plus

参考官网:安装 | Element Plus

4.1 安装

npm install element-plus --save

4.2 完整引入 

main.js:

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

// 引入el-icon(注意 icon 是需要额外引入的)
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

app.use(ElementPlus)

// el-icon
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

4.3 按需引入 

安装:

npm install -D unplugin-vue-components unplugin-auto-import

main.js:(按需引入的方式引入 icon 就可以)

// 引入el-icon
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

// el-icon
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

按需引入需要在 vite.config.js 做一些配置,参考 5 ⬇️

5、vite.config.js文件

import vue from '@vitejs/plugin-vue'
import { resolve } from 'path' // node中的内置模块
// elememt-plus按需引入才需要加上下面三行!!!!!!
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

const pathResolve = (dir) => {
    return resolve(__dirname, ".", dir)
}

const alias = {
    '@': pathResolve("src") // 别名,注意这个别漏了!!
}

alias['vue-i18n'] = 'vue-i18n/dist/vue-i18n.cjs.js'

// https://vitejs.dev/config/
export default ({ command }) => {
    const prodMock = true;
    return {
        base: './',
        resolve: {
            alias
        },
        server: {
            port: 3004, // 前端端口
            host: '0.0.0.0',
            open: true,
            // proxy: { // 前端跨域 (需要跨域开启这一段)
            //    '/api': {
            //        target: 'http://192.168.xxx.x:8080',	// 内网ip地址
            //        changeOrigin: true,
            //        rewrite: (path) => path.replace(/^\/api/, '')
            //    },
            // },
        },
        build: {
            rollupOptions: {
                output: {
                    manualChunks: {

                    }
                }
            }
        },
        plugins: [
            vue(),
            // AutoImport和Components是elememt-plus按需引入才需要加的!!!!!!!
            AutoImport({
                resolvers: [ElementPlusResolver()],
            }),
            Components({
                resolvers: [ElementPlusResolver()],
            }),
        ]
    };
}

6、App.vue

⚠️注意:不要漏掉<router-view></router-view>,每次都没加导致以为路由有问题!!!!

<template>
    <div id="app">
        <router-view></router-view>
    </div>
</template>

<script setup>
</script>

<style scoped>
</style>

7、新建vue页面

便于后续路由跳转测试

 main--》index.vue:⬇️所有vue页面都套用这个基础模版(修改下name的值就可以)

<template>
	<div>
        我是首页
	</div>
</template>

<script>

import { defineComponent } from 'vue'

export default defineComponent({
	name: 'frontPage',
	components: {
	},
	setup() {
		
	}

})
</script>

<style lang="scss" scoped>
</style>

8、配置路由Vue Router

8.1 安装

在此项目目录下打开终端,输入:

npm install vue-router@4 --save

8.2 新建router相关文件

src下新建router文件夹,router下再新建index.js和routes.js

index.js:

import { createRouter, createWebHashHistory } from 'vue-router'
import routes from './routes.js'

const router = createRouter({
    history: createWebHashHistory(),// 开启历史模式
    routes
})

export default router

routes.js:

const routes = [
    {
        name:'index', // 首页
        path: '/',
        component: () => import('@/views/main/index.vue'),
    },
    {
        name:'page2', 
        path: '/page2',
        component: () => import('@/views/page2/index.vue'),
    }
]

export default routes

8.3 main.js引入

import router from './router'
app.use(router)

  现在的main.js长这样:

 

9、vuex

9.1 安装

在此项目目录下打开终端,输入:

npm i vuex

9.2 新建vuex相关文件

index.js:

import { createStore, createLogger } from 'vuex'
import user from './user'

const store = createStore({
    modules: {
        user
    }
})

export default store

 user.js:

const state = {}
const actions = {}
const mutations = {}
const getters = {}

export default { state, actions, mutations, getters }

9.3  main.js引入

import store from './store'
app.use(store)

10、axios

10.1 安装

npm i axios --save

10.2 新建相关文件

根目录下新建 .env.development 和 .env.production

.env.development

(本地开发环境配置)

ENV = 'development'

# VITE_BASE_URL = http://localhost:3004/api 
// 需要跨域的话写上面👆这个(前端地址),并且需要在vite.config.js加上 proxy 配置


VITE_BASE_URL = http://192.168.125.2:8080

.env.production

(线上环境配置)

ENV = 'production'

VITE_BASE_URL = '线上地址'

其他文件: 

request.js

import axios from 'axios'
import store from '@/store'
import { ElMessage } from 'element-plus'
const baseURL = import.meta.env.VITE_BASE_URL

const service = axios.create({
  baseURL: baseURL,
  timeout: 5000
})

// 请求前的统一处理
service.interceptors.request.use(
  (config) => {
    // JWT鉴权处理
    if (store.getters['user/token']) {
      config.headers['token'] = store.state.user.token
      config.headers['Authorization'] = ''
    }
    return config
  },
  (error) => {
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

service.interceptors.response.use(
  (response) => {
    const res = response.data
    if (res.code === 200) {
      return res
    } else {
      showError(res)
      return Promise.reject(res)
    }
  },
  (error)=> {
    console.log(error) // for debug
    const badMessage = error.message || error
    const code = parseInt(badMessage.toString().replace('Error: Request failed with status code ', ''))
    showError({ code, message: badMessage })
    return Promise.reject(error)
  }
)

function showError(error) {
  if (error.code === 403) {
    // to re-login
    store.dispatch('user/loginOut')
  } else {
    ElMessage({
      message: error.msg || error.message || '服务异常',
      type: 'error',
      duration: 3 * 1000
    })
  }
  
}

export default service

user.js

import request from '@/utils/system/request'

export function getApi(data) {
  return request({
    url: '',
    method: 'post',
    baseURL: '',
    data
  })
}

页面请求:

<script>
import { defineComponent } from 'vue'
import { getApi } from '@/api/user.js'

export default defineComponent({

const getData = () => {
            getApi()
                .then(res => {
                    console.log(res)
                })
                .catch(error => {
                    console.log(error)
                })
                .finally(() => {
                })
        }
})
getData()
</script>

11、综合 main.js

import { createApp } from 'vue'

import App from './App.vue'

// element-plus 完整引入才要下面这两行
// import ElementPlus from 'element-plus'
// import 'element-plus/dist/index.css'

import router from './router'
import store from './store'

// 引入el-icon
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

const app = createApp(App)

// el-icon
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

// element-plus 完整引入才要下面这一行
// app.use(ElementPlus)

app.use(router)
app.use(store)

app.mount('#app')

下面的内容因为之前写过了,就直接放链接吧

12、配置i18实现语言切换

vue3国际化(i18n简繁体及英文切换)_RainHg的博客-CSDN博客

13、配置scss全局变量

vue3+vite引入scss全局变量,设置主题颜色_RainHg的博客-CSDN博客_vite vue3 使用scss

14、自适应及自动添加前缀配置

vue3+vite使用postcss-pxtorem、autoprefixer实现自适应和自动添加前缀_RainHg的博客-CSDN博客_postcss-pxtorem vue3


网站公告

今日签到

点亮在社区的每一天
去签到