该框架基于vue3
+vite2
,配置了element-plus
+vue-router
+sass
+vuex
,后续还会继续完善~
一、初始化
- 按照官方文档的步骤,我这里是用
vite
来构建项目,且本地npm
版本为7+,使用命令npm init vite@latest vue3-pc -- --template vue
初始化一个命名为vue3-pc的项目 npm i
以及npm run dev
就可将项目跑起来,如下图:
二、引入element-plus UI
- 使用命令行安装
element-plus
:cnpm i --save elemnt-plus
; - 全局引入
element-plus
:进入main.js
中,引入element-plus
,按照官方说的引用element
的css
文件是这么写的:import 'element-plus/theme-chalk/lib/index.css'
,但是报错,看了下node_modules
中,发现theme-chalk
文件夹是直接放在element-plus
目录下的,不是在lib
中
按照上面的引入之后,页面中就可正常使用了,如下:import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) import ElementPlus from 'element-plus' import 'element-plus/theme-chalk/index.css' app.use(ElementPlus) app.mount('#app')
运行后打开页面可看到效果<template> <h1>{{ msg }}</h1> <el-button type="primary" @click="count++">count is: {{ count }}</el-button> </template>
- 测试构建:运行
vite build
脚本,成功打包生成dist
文件夹,进入dist
中,用hs
模拟启动,启动成功,如下图 打开IP地址,也可正常访问到
三、引入sass
- 依次安装
node-sass
:cnpm i node-sass --save-dev
,sass
:cnpm i sass --save-dev
,一个一个安装太慢了,后面几个我是一次性安装上去的:cnpm i sass-loader style-loader style-resources-loader --save-dev
- 上面的安装成功后,在页面中局部使用
scss
运行,页面上看到效果:$text-color: purple; .msg{ color: $text-color; }
- 基于以上,要全局引入
scss
样式和定义全局变量时,在assets
中新建一个文件,放全局样式,之后在vite.config.js
中引入全局外部样式import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ css: { preprocessorOptions: { scss: { additionalData: `@import "./src/assets/scss/variable.scss";` } } }, pluginOptions: { 'style-resources-loader': { preProcessor: 'sass', patterns: [] } }, plugins: [ vue(), ], build: { } })
variable.scss
中定义了全局变量$color-primary: #28cccc
; 在页面中直接使用color: $color-primary;
效果如下: - 以上配置完成后,
build
之后再运行,无问题 - 第3步中,引入全局scss文件时,若想使用@别名,也可通过配置完成,配置如下
配置好别名后,重启项目。import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import path from 'path' // https://vitejs.dev/config/ export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, 'src'), 'views': path.resolve(__dirname, 'src/views') } } })
- 网上看到有些需要另外去引入
path
模块的,很奇怪,我这边不用也能成功配置别名,先存个疑,后面来跟进下~
四、引入vue-router
-
cnpm i vue-router@next --save
安装依赖 -
src
目录下,新建router
文件夹存放路由,在index.js
中加入以下代码,于此同时,也将首页跟登录页新建好;注意路由的mode
配置有history
和hash
模式,以下是配置的history
模式,该模式需要后端也配置参数,用于需要服务端渲染的项目。import { createRouter, createWebHistory } from 'vue-router' export default createRouter({ history: createWebHistory(), routes: [ { path: '/', component: () => import('views/index.vue') }, { path: '/login', component: () => import('views/login.vue') } ] })
若要改为用
hash
模式,引入createWebHashHistory
且注册时使用:history: createWebHashHistory()
-
在入口文件
main.js
中引入路由,代码如下:import { createApp } from 'vue' import App from './App.vue' import router from './router/index' import ElementPlus from 'element-plus' import 'element-plus/theme-chalk/index.css' const app = createApp(App) app.use(ElementPlus) app.use(router) app.mount('#app')
-
App.vue
中加入<router-view />
标签 -
重启就能看到效果啦
-
另外的,在函数式组件
setup
中若需要使用this.$router()
或this.$route()
(vue2
)方法,需要相应的引入import { useRoute, useRouter } from 'vue-router'
,用useRouter
和useRoute
来代替使用
五、引入Vuex状态树管理
- 安装依赖:
cnpm i vuex@next --save
,点击可跳转至Vuex官方文档 vue3
对应的Vuex
也要升级到4.x版本,写法上也要使用组合式API的写法;以下的Vuex
样例,使用了带命名空间的模块,具体可看下官方文档,Vuex官网上也链接了一些案例:github示例的地址; 样例的目录结构为:分2个模块,分别是modules
中的userInfo
模块和common
模块,设置命名空间:namespaced: true
,其余写法跟Vuex3.x
一样,在index.js
中再分别引入,引入方法是通过createStore({modules: {XXX}})
来引入- 在
main.js
中全局引入,代码如下:
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
import ElementPlus from 'element-plus'
import 'element-plus/theme-chalk/index.css'
import store from './store/index'
const app = createApp(App)
app.use(ElementPlus)
app.use(router)
app.use(store)
app.mount('#app')
- 在页面文件中,他的调用方法基本跟
Vuex3.x
一致,不同的是Vue4.x
多了个具名模块的调用;- 若通过
store
拿状态值的话,需要在setup(){}
中return
出来 - 若要使用带命名空间的模块内的方法,需要传参模块名,如下:
mapMutations
跟mapActions
都是通过第一个传参指定某个带命名空间的模块;
import { mapMutations, mapState } from 'vuex' export default { setup () { }, data() { return { title: '登录页' } }, computed: { ...mapState({ userId: state => state.userInfo.userId }) }, methods: { ...mapMutations('userInfo', [ 'SET_USERID', ]) } }
- 带命名空间模块的引用也可通过
createNameSpacedHelpers
来创建基于命名空间的辅助函数,它返回一个对象,对象中包含mapState
`mapMutations`等辅助函数
import { createNamespacedHelpers } from 'vuex' const { mapMutations, mapState } = createNamespacedHelpers('userInfo') export default { setup () { }, data() { return { title: '登录页' } }, computed: { ...mapState({ userId: state => state.userId }) }, methods: { ...mapMutations(['SET_USERID']) } }
- 若通过
- 运行起来后可看到
- 关于持久化存储的,这边没有配置,可自行安装下这个插件
vuex-persistedstate
六、其它的配置
之后会来加上eslint
(规范代码格式)以及husky
(提交自动校验代码格式)等其它,祥见下一篇哦;