vue3+TS+Vite+Vuex4+VueRoute 基本项目搭建
注意:暂不包含vuex,后续将继续添加完善
搭建准备
-
在开发之前,你需要确定你的脚手架
vue-cli的版本在3.x以上 -
如果版本不能达到要求,则重新安装
vue-cli
npm install -g @vue/cli
创建项目
vue3 创建项目的时候有两种方式(官方推荐的 vite / webpack),本文介绍使用vite创建项目
- 打开命令工具
npm init @vitejs/app vue-template-ts --template vue-ts
运行结果如下图
输入y运行结果如下图
依次选择vue回车 然后选择vue-ts回车,运行结果如下图
至此一个vite + vue + ts 的项目就创建完成了
接下来运行项目,让项目跑起来
环境变量配置
创建环境变量文件及配置
- 在cli项目中我们可以是配置.env.[mode]文件来配置环境变量
- 在根目录下创建
.env.development和.env.production两个文件,不同文件内容如下
# .env.development
APP_ENV = 'development'
VITE_APP_TITLE= 'vite_project'
VITE_REQUEST_BASE_URL= 'www.xxx.com'
# .env.production
APP_ENV = 'production'
VITE_APP_TITLE= 'vite_project'
VITE_REQUEST_BASE_URL= 'www.xxx.com'
- 修改根目录下
package.json文件, 新增了运行命令指定使用不同的mode,用于覆盖默认的模式 - 例:development会将上面新建的
.env.development打包 - 因此在代码中可以获取不同的环境变量。
{
...
"scripts": {
"dev": "vite --mode development",
"build": "vue-tsc --noEmit && vite build --mode production",
"preview": "vite preview"
},
...
}
代码中获取环境变量
Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量
// 写在main.ts 文件中
const env = import.meta.env
console.log(env)
/* 打印如下值
{
"VITE_APP_TITLE":"vite_admin", // 配置文件定义的值
"VITE_REQUEST_BASE_URL":"www.xxx.com", // 配置文件定义的值
"BASE_URL":"/",
"MODE":"development", // 运行的环境 development or production
"DEV":true, // 是否是开发环境
"PROD":false, // 是否是生产环境
"SSR":false
}
*/
// APP_ENV为何没有打印呢:
为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码
更多关于vite的详细配置点击查看:vite环境变量和模式
项目中的 vite.config.ts 配置
先解决 直接使用require会提示错误 问题
// 二选一
// 1. 命令行安装`@types/node`
npm i --save-dev @types/node
// 2. tsconfig.json中添加代码
{
"compilerOptions": {
...
"types": ["vite/client", "node],
...
}
}
然后将下面文件复制替换项目中的配置,重新运行项目 npm run dev
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
// https://vitejs.dev/config/
export default ({ command, mode }) => {
// let config = {}
// if (command === 'serve') { // dev 独有配置 } else { // build 独有配置 // command === 'build' }
// 根据当前工作目录中的 `mode` 加载 .env 文件
// 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。
const env = loadEnv(mode, process.cwd(), '')
return defineConfig({
root: process.cwd(), // 项目根目录(index.html 文件所在的位置)。可以是一个绝对路径,或者一个相对于该配置文件本身的相对路径。
// 开发或生产环境服务的公共基础路径。合法的值包括以下几种:
// 绝对 URL 路径名,例如 /foo/
// 完整的 URL,例如 https://foo.com/
// 空字符串或 ./(用于嵌入形式的开发)
base: '/',
// 默认: 'development' 用于开发,'production' 用于构建
// 在配置中指明将会把 serve 和 build 时的模式 都 覆盖掉。也可以通过命令行 --mode 选项来重写。
mode: 'development',
publicDir: 'public', // 打包输出到文件夹, 将 publicDir 设定为 false 可以关闭此项功能。
// 被监听的包必须被排除在优化之外,
// 以便它能出现在依赖关系图中并触发热更新。
// optimizeDeps: {
// exclude: ['vuex']
// },
plugins: [vue()],
//服务器配置
server: {
host: "0.0.0.0",
port: 8088,// Number(loadEnv(mode, process.cwd()).VITE_APP_PORT),
strictPort: true, // 端口被占用直接退出
https: false,
open: true, // 在开发服务器启动时自动在浏览器中打开应用程序
//代理配置
proxy: {
"/api": {
target: loadEnv(mode, process.cwd()).VITE_APP_BASE_URL,
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
},
},
hmr: {
overlay: false, // 屏蔽服务器报错
},
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'), //配置@路径
}
},
css: {
// css预处理器
preprocessorOptions: {
// 引入 var.scss 这样就可以在全局中使用 var.scss中预定义的变量了
// 给导入的路径最后加上 ;
// scss: {
// additionalData: '@import "@/assets/styles/global.scss";',
// },
},
},
build: {
chunkSizeWarningLimit: 1500, // 分块打包,分解块,将大块分解成更小的块
// 构建后是否生成 source map 文件。如果为 true,将会创建一个独立的 source map 文件。如果为 'inline',source map 将作为一个 data URI 附加在输出文件中。'hidden' 的工作原理与 'true' 相似,只是 bundle 文件中相应的注释将不被保留。
sourcemap: false, // boolean | 'inline' | 'hidden'
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes("node_modules")) {
return id
.toString()
.split("node_modules/")[1]
.split("/")[0]
.toString();
}
},
},
},
},
})
}
更多详细信息点击查看:vite配置文档
添加 vue-router4
安装路由
npm i vue-router@4
新建文件
依次创建如下文件
- 首先来看一下index.ts 如何编写
// router/index.ts
import { createRouter, createWebHashHistory, createWebHistory, RouteRecordRaw, RouterHistory } from 'vue-router'
// 不做依次引入路由模块,这里直接获取文件进行遍历生成路由模块配置
const modules = import.meta.globEager('./modules/*.ts')
const allRouter: RouteRecordRaw[] = []
for (const path in modules) {
if (!!modules[path].default) {
modules[path].default.forEach((item: RouteRecordRaw) => {
allRouter.push(item)
});
}
}
// const history: RouterHistory = createWebHistory() // history 模式
const history: RouterHistory = createWebHashHistory() // hash 模式
const routes: Array<RouteRecordRaw> = [
...allRouter,
]
console.log('routes=>', routes)
const router = createRouter({
history,
routes,
})
export default router
- modules/*.ts中导出不同路由的配置
// router/modules/*.ts
export default [
]
- 将vue-router 挂载到vue的实例上
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
const app = createApp(App)
// 挂载路由
app.use(router)
app.mount('#app')
- 添加第一个路由跳转页面
// App.vue 添加 router-view 标签
<template>
<router-view></router-view>
</template>
<script setup lang="ts"></script>
<style></style>
在src下新建一个views 文件夹,用来存放页面文件
// views/index/index.vue
<template>
<div>ref: {{ str }}</div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
const str = ref<String>("书婷,出门小心车");
</script>
<style lang="scss" scoped></style>
添加路由
...
const routes: Array<RouteRecordRaw> = [
// 新增路由
{
path: '/',
name: 'index',
component: () => import('@/views/index/index.vue'),
},
...allRouter,
]
...
- 详细文档点击查看: Vue Router官方文档
- 重新运行项目
npm run dev就能看到项目中显示的页面了
添加scss
安装scss
npm install sass --save-dev
npm install sass-loader --save-dev
npm install node-sass --save-dev
npm install vue-style-loader --sava-dev
- node-sass安装失败的解决方法
- 由于众所周知的国内网络环境,从国内安装官方源的依赖包会很慢。可以将npm源设置成淘宝npm(如淘宝npm)
npm install -g cnpm --registry=https://registry.npmmirror.com
// 安装完成后使用
cnpm install node-sass --save-dev
全局配置
- 新建一个文件 assets/styles/global.scss
// assets/styles/global.scss
$color: red;
接下来将文件变成全局的global.scss,让接下来的scss文件中都能使用global.scss中的变量
// 上面讲到的 [项目中的 vite.config.ts 配置]
// vite.config.ts
...
css: {
// css预处理器
preprocessorOptions: {
// 引入 global.scss 这样就可以在全局中使用 global.scss中预定义的变量了
// 给导入的路径最后加上 ;
scss: {
additionalData: '@import "@/assets/styles/global.scss";',
},
},
}
...
如下图所示,全局scss配置已生效,接下来就能在global.scss中定义项目的各种css变量了