vue3 + vite + pinia + ts 基础环境搭建

1,941 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

一、vue3 介绍

Vue 3.0 于2020年9月18日发布至今,已经过去1年多。现在vue的官方网站已经切换为vue3。证明我们迎来的vue3.0的时代,许多公司的项目开发也已经逐渐升级为vue3。

接下来我们从头开始学习如何搭建一个vue3 + vite + pinia + ts基础环境

为什么要选择使用vite 和 pinia 呢?

vite是一个高效、快速的脚手架工具。 Vite 将会使用esbuild预构建依赖。esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。

pinia与vuex一样,是一个状态管理器。与VueX 相比,它提供了更简单、更简洁的 API,并引入了对 Typescript 的原生支持。为了更方便大家使用,Pinia 得到了 Vue devtools 的支持,可以使用chrome浏览器插件Colada,并点击代表存储变化的节点,动态改变应用程序的状态,回到以前的快照,改善 Vue-Pinia 应用程序的调试过程中的复杂状态变化。此外,如果你在安装插件的同时安装 Colada Chrome 扩展,你可以访问一个单独的 Chrome devtools 面板,提供同样的时间旅行功能和增强的 UI。

image.png

二、搭建基础环境

首先需要声明下我们需要配置搭建的东西

  • 脚手架工具:Vite
  • 前端框架:Vue3
  • 状态管理器:Pinia
  • 开发语言:TypeScript
  • UI组件: Element Plus
  • css样式:scss
  • 代码规范:EslintPrettierCommitlint
  • 路由管理:vue-router

2.1 使用vite创建项目

搭建项目注意的点:

兼容性注意:

Vite 需要 Node.js 版本 >= 12.0.0。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。

我们直接使用vue-ts模板来进行创建

我使用的npm版本是8,其余版本可参考官网,使用正确的命令

npm create vite@latest vue3-vite-pinia-ts -- --template vue-ts

生成的目录结构

.
├── node_modules
├── public
│   └── favicon.ico
├── src
│   ├── assets
│   │   └── vue.svg
│   ├── components
│   │   └── HelloWorld.vue
│   ├── App.vue
│   ├── main.ts #项目的启动入口
│   └── vite-env.d.ts
├── .gitignore
├── README.md
├── index.html
├── package-lock.json
├── package.json
├── tsconfig.json   #基本的ts配置文件
└── vite.config.ts  #vite的配置文件

package.json中内容

{
  "scripts": {
    "dev": "vite", // 启动开发服务器
    "build": "vue-tsc && vite build", // 为生产环境构建产物
    "serve": "vite preview" // 本地预览生产构建产物
  }
}

2.2 设置代码规范

2.2.1 配置eslint

参考eslint官网

  1. 安装 ESLint到项目中
npm install eslint --save-dev
  1. 初始化Eslint配置
PS D:\1026_YING\git\vue3-vite-pinia-ts> npx eslint --init
You can also run this command directly using 'npm init @eslint/config'.
√ How would you like to use ESLint? · problems    
√ What type of modules does your project use? · esm
√ Which framework does your project use? · vue
√ Does your project use TypeScript? · No / Yes
√ Where does your code run? · browser, node
√ What format do you want your config file to be in? · JavaScript
The config that you've selected requires the following dependencies:

eslint-plugin-vue@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest
√ Would you like to install them now? · No / Yes
√ Which package manager do you want to use? · pnpm
  1. ESLint 配置文件
module.exports = {
    "env": {
        "browser": true,
        "es2021": true,
        "node": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:vue/vue3-essential",
        "plugin:@typescript-eslint/recommended"
    ],
    "overrides": [
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "vue",
        "@typescript-eslint"
    ],
    "rules": {
    }
}

我们自己的一些校验规则,可以填充在这个文件中,可参考官网

  1. npm scripts 中添加验证脚本
"lint": "eslint src/**/*.{js,jsx,vue,ts,tsx} --fix"
  1. 运行npm run lint

不希望被eslint校验的文件

根目录下添加.eslintignore文件

vite-env.d.ts

错误问题处理

  1. 配置好后,未修改项目,而且vue文 image.png

解决:修改配置文件,主要修改下面部分

"parser": "vue-eslint-parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "parser": "@typescript-eslint/parser",
        "sourceType": "module"
    },

2.2.2 配置prettier

  1. 安装prettier
npm install prettier -D
  1. 在根目录下建立 prettier 配置文件 .prettierrc.js
module.exports = {
    eslintIntegration: true,
    printWidth: 150, // 每行代码长度(默认80)
    tabWidth: 4, // 每个tab相当于多少个空格(默认4)
    useTabs: false, // 使用制表符 (tab) 缩进行而不是空格 (space)(默认false)
    semi: false, // 是否在语句末尾打印分号(默认true)
    singleQuote: true, // 使用单引号(默认false)
    jsxSingleQuote: false, // jsx 不使用单引号,而使用双引号
    trailingComma: 'none', // 多行使用拖尾逗号(默认none)
    bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true)
    jsxBracketSameLine: false, // 多行JSX中的>放置在最后一行的结尾,而不是另起一行(默认false)
    arrowParens: 'avoid', // 只有一个参数的箭头函数的参数是否带圆括号(默认avoid)
    proseWrap: 'always' // 超出print width(上面有这个参数)时就折行
}

2.2.3 解决eslint和prettier冲突的问题

  1. 安装依赖
npm install eslint-config-prettier eslint-plugin-prettier -D
  1. 更改配置,注意,添加了plugin:prettier/recommended
 "extends": [
        "eslint:recommended",
        "plugin:vue/vue3-essential",
        "plugin:@typescript-eslint/recommended",
        'plugin:prettier/recommended'
    ],

2.2.4 配置husty

husty:husky是一个给git增加 hooks 工具

  1. 安装依赖
npm install husky lint-staged -D

2.配置脚本

"prepare": "husky install"
  1. 运行脚本,生成 .husky文件
  2. 然后使用husky命令添加pre-commit钩子,运行
pnpm husky add .husky/pre-commit "npm lint && npm format && pnpm lint:style"

上述命令会在.husky目录下生成一个pre-commit文件

作用:在git commit 时执行npm lint 和 npm format命令,若出现错误,则不会提交。

三、集成pinia

3.1 pinia介绍

为什么使用

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。

  • dev-tools 支持
    • 跟踪动作、突变的时间线
    • Store 出现在使用它们的组件中
    • time travel 和 更容易的调试
  • 热模块更换
    • 在不重新加载页面的情况下修改您的 Store
    • 在开发时保持任何现有状态
  • 插件:使用插件扩展 Pinia 功能
  • 为 JS 用户提供适当的 TypeScript 支持或 autocompletion
  • 服务器端渲染支持

与vuex区别

  • mutations 不再存在,但是状态仍然会记录在devtools中
  • 无需手动添加 store,store 一旦创建便会自动添加
  • 没有 命名空间模块

更多区别请查看官网

3.2 安装

npm i pinia --save

3.3 使用

  1. 在src目录下创建store目录,并创建index.ts文件。
import { createPinia } from 'pinia'
const store = createPinia()
export default store
  1. 在main.ts中引入
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import store from './store'

// 挂载pinia
createApp(App).use(store).mount('#app')
  1. 自己创建一个state,我们常用的用户信息user.ts
import { defineStore } from 'pinia'
export const useUserStore = defineStore({
    id: 'user', // id必填,且需要唯一
    state: () => {
        return {
            name: '以和为贵',
            age: 20
        }
    },
    actions: {
        updateName(name: string) {
            this.name = name
        },
        updateAge(age: number) {
            this.age = age
        }
    }
})
  1. 使用state信息,定义myPinia.vue文件
<template>
    <div>名字:{{ userStore.name }}</div>
    <div>年纪:{{ userStore.age }}</div>
</template>
<script lang="ts" setup>
import { useUserStore } from '@/store/user'
const userStore = useUserStore()
</script>

5.其余使用可参照官网

四、 集成vue-router

4.1 官网介绍

Vue Router 是Vue.js的路由,它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。

4.2 安装

npm i vue-router --save

4.3 使用

  1. 在src目录下创建router目录,并创建index.ts文件,并导出
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
const routes: Array<RouteRecordRaw> = [
    {
        path: '/login',
        name: 'Login',
        meta: {
            title: '登录',
            keepAlive: true,
            requireAuth: false
        },
        component: () => import('@/views/login/index.vue')
    }
]

const router = createRouter({
    history: createWebHashHistory(),
    routes
})
export default router

  1. 在main.ts中引入
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import store from './store'
import router from './router'

// 挂载router
createApp(App).use(store).use(router).mount('#app')
  1. 根据路由创建自己的index.vue文件
<template>
    <div>登录页</div>
</template>
  1. 修改 App.vue
<RouterView />
  1. url访问对应路由

image.png

五 集成安装Element Plus

你可以选择自己喜欢的ui库进行集成,在这里我们以Element Plus为例子

  1. 安装
npm install element-plus --save
  1. 按照推荐的按需引入
npm install -D unplugin-vue-components unplugin-auto-import
  1. vite.config.ts修改
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  // ...
  plugins: [
    // ...
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ]
})
  1. 直接使用,我们在HelloWorld.vue中添加了显示
<el-button>我的按钮样式</el-button>