使用Vite重构Vue3项目(上)

简介: 使用Vite重构Vue3项目(上)

前言


截止发文时间,vite正式版已经发布快2年时间了,vue3也发布到3.2版本了,它的周边设施基本上已经齐活了。也是时候再次重构下我那个vue3.0的开源项目了。


本篇文章就记录下我的重构过程,欢迎各位感兴趣的开发者阅读本文。


环境搭建


1年多前,我用Vue Cli 4.5构建的此项目,有关此项目的更多细节请移步我的另一篇文章使用Vue3重构Vue2项目。同样的,从CLI迁移到Vite仍然是在package.json中添加vite的依赖项,在项目中添加它的配置文件。


此次项目构建还加入了volta的相关配置,对此感兴趣的开发者请移步:强大的JavaScript工具管理器Volta


新增vite相关依赖项


我们打开package.json,找到devDependencies字段,移除CLI相关的依赖,添加vite相关的依赖,如下所示:


  • +绿色标识代表新增
  • -红色标识代表移除


{
 "dependencies": {
-   "compression-webpack-plugin": "^5.0.1",
 },
 "devDependencies": {
+   "@vitejs/plugin-vue": "^3.0.0",
+   "vite": "^3.0.0",
+    "vue-tsc": "^0.38.4",
+    "@types/node": "^18.6.3",
-    "sass-loader": "^8.0.2",
-    "@vue/cli-plugin-babel": "~4.5.0",
-    "@vue/cli-plugin-eslint": "~4.5.0",
-    "@vue/cli-plugin-router": "~4.5.0",
-    "@vue/cli-plugin-typescript": "~4.5.0",
-    "@vue/cli-plugin-vuex": "~4.5.0",
-    "@vue/cli-service": "~4.5.0",
-   "@vue/compiler-sfc": "^3.0.0-0"
- 
 }
}


随后,我们找到scripts字段,修改项目的运行与构建命令。


{
  "scripts": {
    "serve": "vite --open",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview"
  }
}


vite3.x版本要求node版本必须大于14.18.0,因此我们需要在engines字段中做一下提示,如下所示:


{
  "engines": {
    "npm": "please-use-yarn",
    "yarn": ">= 1.0.0",
    "node": ">= 14.18.0"
  }
}


除了上述配置外,我们还需要在项目的根目录创建.npmrc文件,写入下述内容:


engine-strict = true


配置完成后,我们执行在终端执行yarn install安装依赖即可。


在上述配置中,我们还强制设置了yarn作为项目的包管理工具,如果项目开发成员使用了npm install则不会开始安装依赖并提示其使用yarn来安装依赖。


添加vite配置文件


在vite中,index.html已经从public文件夹迁移到项目的根目录下了,官方文档对此的解释为:在开发期间 Vite 是一个服务器,而 index.html 是该 Vite 项目的入口文件。


有关此变更的详细解释请移步:index.html 与项目根目录


接下来,我们在项目的根目录创建index.html文件(将public目录下的文件删除)


  • 引入静态文件时不需要使用%PUBLIC_URL%作为占位符,可以直接写/来访问,vite会将其解析到public根目录下
  • 通过<script type="module" src="...">标签直接指向Vue的入口文件(文件
  • 后缀可以为js或者ts)
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>chat-system</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>


注意:如果你的项目比较复杂,有多个入口,那么就将index.html文件放到对应入口的根目录下。


最后,我们创建vite.config.ts文件,配置代码如下所示:


  • 设置开发环境的端口号
  • 设置路径别名
  • 设置打包后base地址以及打包输出目录


import { defineConfig } from "vite";
import { resolve } from "path";
import vue from "@vitejs/plugin-vue";
const IS_PRODUCTION = process.env.NODE_ENV === "production";
export default defineConfig({
  plugins: [vue()],
  server: {
    host: true,
    port: 8020,
    proxy: {}
  },
  resolve: {
    // 设置路径别名
    alias: {
      "@": resolve(__dirname, "./src"),
      "*": resolve("")
    }
  },
  base: IS_PRODUCTION ? "/chat-system" : "./",
  define: {
    "process.env": {}
  },
  build: {
    outDir: resolve(__dirname, "dist")
  }
});


注意:我的项目配置比较简单,它只有一个入口,打包后只会部署到生产环境。如果你的项目较为复杂,也不必太过担心,你的应用场景vite也是支持的,按照文档进行相关的配置就好,如下所示:


  • 自定义构建
  • 多页面应用模式
  • 环境变量和模式


当你的项目有多个入口时,期望通过不同命令来启动不同项目时,你可以使用yarn的--cwd指令来指定其运行时的工作目录。


例如:你有两个入口,那么就在src目录下创建两个文件夹:**A、B **。A和B中分别有自己的index.html、main.ts以及package.json文件(配置start、build命令,传入不同的参数来启动/构建不同入口的项目)

根目录的package.json中你就可以配置启动/构建命令为:


{
  "scripts": {
    "dev:A": "yarn --cwd ./src/A run start",
    "dev:B": "yarn --cwd ./src/B run start",
    "build:A": "yarn --cwd ./src/A run build",
    "build:B": "yarn --cwd ./src/B run build",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview"
  },
}


最后,我们以A入口为例,列举下package.json文件中的配置:


{
  "name": "A",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "start": "vite serve --config ../../vite.config-A.ts --mode development",
    "build": "vue-tsc --noEmit && vite build --config ../../vite.config-A.ts --mode production"
  }
}


升级Vue周边依赖项


vue3.2的单文件组件引入了setup规范,它可以让代码变得更简洁,可以使用纯 TypeScript 声明 props 和抛出事件,有着更好的运行时性能。这些优点让我有了升级vue版本的动力,之前的3.0版本写起来很臃肿,需要return一大堆东西,甚是麻烦。


打开package.json文件作出下述变动:


  • 更新了vue、router、vuex的版本号
  • 新增了vueuse包,这是一个基于 Composition API 的实用函数集合,封装了一些常用的功能(实时获取鼠标位置、防抖、节流、获取客户端系统主题等),可以避免一些重复性的工作内容,大大提升开发效率。


{
 "dependencies": { 
-  "vue": "^3.0.0-0",
-   "vue-class-component": "^8.0.0-0"
-  "vue-router": "^4.0.0-0",
-  "vuex": "^4.0.0-0",
+   "vue": "^3.2.37",
+   "vue-router": "^4.1.3",
+   "vuex": "^4.0.2",
+   "@vueuse/components": "^8.9.2",
+   "@vueuse/core": "^8.9.2"
 }
}


最后执行yarn install即可完成整个环境的搭建,本章节重构完成后的完整文件请移步:


  • .npmrc
  • index.html
  • package.json
  • vite.config.ts


经验分享


本章节就跟大家分享下,我切到新环境后做的一些优化点以及遇到的问题和解决方案。

本章节修改到的文件,完整文件代码如下:


  • package.json
  • tsconfig.json
相关文章
|
2天前
|
JSON 数据可视化 前端开发
vue3+threejs+koa可视化项目——模型文件上传(第四步)
vue3+threejs+koa可视化项目——模型文件上传(第四步)
15 7
|
2天前
|
JSON 数据可视化 数据库
vue3+threejs+koa可视化项目——实现登录注册(第三步)
vue3+threejs+koa可视化项目——实现登录注册(第三步)
18 5
|
2天前
|
JavaScript 数据可视化 算法
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
17 6
|
2天前
|
JavaScript 安全 前端开发
Vue 项目中的权限管理:让页面也学会说“你无权访问!
Vue 项目中的权限管理:让页面也学会说“你无权访问!
11 3
|
5天前
|
JavaScript
Vue 如何新建一个项目(如何安装依赖)
Vue 如何新建一个项目(如何安装依赖)
10 0
|
10天前
|
JavaScript 算法 前端开发
vue3和vue2的区别都有哪些
【4月更文挑战第15天】Vue3与Vue2在响应式系统(Proxy vs. Object.defineProperty)、组件模块化(Composition API vs. Options API)、数据变化检测(Reactive API vs. $watch)、虚拟DOM算法(基于迭代 vs. 基于递归)及Tree-Shaking支持上存在显著差异。Vue3的改进带来了更好的性能和灵活性,适合追求新技术的项目。Vue2则因其成熟稳定,适合维护大型项目。选择版本需根据项目需求、团队情况和技术追求来决定。
13 0
|
11天前
|
JavaScript
vue3+vite项目配置ESlint
vue3+vite项目配置ESlint
14 0
|
JavaScript Java 物联网
现有vue项目seo优化
现有vue项目seo优化
|
JavaScript 前端开发
重读vue电商网站45之项目优化上线
重读vue电商网站45之项目优化上线
96 0
重读vue电商网站45之项目优化上线
|
3天前
|
JavaScript 前端开发
【vue】iview如何把input输入框和点击输入框之后的边框去掉
【vue】iview如何把input输入框和点击输入框之后的边框去掉
10 0