vue2 + webpack 老项目升级 node v22 + vite + vue2 实战全记录

news2025/6/2 10:34:22

前言

随着这些年前端技术的飞速发展,几年前的一些老项目在最新的环境下很可能会出现烂掉的情况。如果项目不需要升级,只需要把编译后的文件放在那里跑而不用管的话还好。但是,某一天产品跑过来给你讲要升级某一个功能,你不得不去维护的时候,你可能发现,你的工具链都成问题了。

我就遇到了这样的一个情况。一个五六年前基于 webpack + vue2 开发的一个项目,现在需要升级,这个过程一定是很有纪念意义的,所以特地记录下来。

确定实施方案

  1. 用最新的脚手架搭建底层架构。
  2. 将原有代码 src 目录整体移过来。
  3. 针对问题,一一排除

开干。

# 当前环境版本
fungleo@Studio ~/Sites/myWorks/koa-cms-2025
$ node -v
v22.14.0
fungleo@Studio ~/Sites/myWorks/koa-cms-2025
$ pnpm -v
10.4.1

用 vue 官方脚手架构建底层构架

现在官方推荐使用 create-vue 来构建项目,参考文档地址: https://github.com/vuejs/create-vue

根据官方的文档,以及我们项目的实际情况,我们执行命令,如下图所示:

pnpm create vue@legacy

用脚手架创建项目底层
根据提示,我们执行下面的命令,将项目运行起来。

cd koa-cms-user
pnpm install
pnpm dev

运行截图
接下来,我们把原来项目文件的 src 目录完整的替换这个脚手架下生成的 src 目录。

直接运行一下,肯定是跑步起来的。

出错情况

逐一排查问题

OK,全部都是错误,我们来逐一排查,首先我们遇到的依赖的三方库没有安装,这里,我们一一安装上。

我不建议一次性安装,提示哪个,我们就安装哪个。

使用 sass 替代 node-sass

以前,我们的老项目很多都依赖 node-sass 这个库,这里,我们用 sass 进行替代。需要逐一的是 sass 升级更新比较快,导致升级后语法有些更新,所以为了兼容我们之前写的 scss 文件,我建议使用一个稍微老一点的版本,我这里选择的是 1.66.0 这个版本。

pnpm add sass@1.66.0

原有部分引用文件省略 .vue 后缀的,加上

依赖基本安装好之后,发现在控制台中有 404 的报错,经过排查,发现老代码中,有部分引用,省略了 .vue 的文件后缀,补充上之后,解决了这个问题。

// old
import Frame from '@/layout/frame'
// new
import Frame from '@/layout/frame.vue'

部分函数更新

在老项目中,有一些依赖的三方库,可能因为某些原因,不再适用。因此这些业务代码,需要更新调整。我也遇到了这个问题,主要是 RSA 加密部分的内容。这些,我前几天写过一些文章,大家可以参考:

node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示

浏览器原生 Web Crypto API 实现 SHA256 Hash 加密

大家各自的情况应该都不一样,这里不详述了。一般而言,代码量不会太大。

webpack 自定引入文件的代码替换为 vite 的方式

在我原有的项目中,使用了 webpack 的特性写了一些代码,主要是用来自动注册组件,代码如下

// 自动注册组件文件
const modulesFiles = require.context('./', true, /.vue$/)

const modules = modulesFiles.keys().reduce((modules, path) => {
  const module = modulesFiles(path).default
  const name = module.name
  modules[name] = module
  return modules
}, {})

const install = (Vue, opts = {}) => {
  Object.keys(modules).forEach(name => {
    Vue.component(name, modules[name])
  })
}

export default {
  install,
  ...modules
}

现在,需要更换为 vite 特性的代码

// 自动注册组件文件

const modulesFiles = import.meta.glob('./**/*.vue', { eager: true })
const modules = Object.entries(modulesFiles).reduce((modules, [_, module]) => {
  const name = module.default.name
  modules[name] = module.default
  return modules
}, {})
const install = (Vue, opts = {}) => {
  Object.keys(modules).forEach((name) => {
    Vue.component(name, modules[name])
  })
}

export default {
  install,
  ...modules
}

webpack .env 变量名,替换为 vite .env 变量名

如果你使用到了 .env 文件的变量,这里需要更改前缀,从 VUE_APP_ 更改为 VITE_

此外,在使用的地方也有区别,如下所示:

// 在 webpack 中使用 env 变量
console.log(process.env.VUE_APP_API_URL) 
// 在 vite 中使用 env 变量
console.log(import.meta.env.VITE_API_URL)

OK,我这边经过这些调整,项目已经可以跑起来了。

如果你也有类似的需求,可能会遇到更多不一样的问题,只需要借助搜索引擎和 DeepSeek 我相信都能逐一解决的。

使用 Boime 取代以前的 eslint 实现代码格式化等功能

我觉得在代码格式化方面,现在的 boime 相比以前的 eslint 要更好用一些,主要是配置少,安装的包少,以及速度快。当然,在自定义格式相比较而言要略逊一些,但我感觉可以克服。

目前,我开发的项目,都已经使用 boime 在格式化代码了。这里,我也一样准备使用 boime。

官方网站: https://biomejs.dev/

# 安装
pnpm add @biomejs/biome -D  

在项目根目录创建 biome.json 文件,并录入一下内容:

{
  "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
  "organizeImports": {
    "enabled": true
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true,
      "complexity": {
        "noForEach": "off"
      },
      "style": {
        "noParameterAssign": "off"
      }
    }
  },
  "formatter": {
    "enabled": true,
    "formatWithErrors": false,
    "indentStyle": "space",
    "indentWidth": 2,
    "lineWidth": 120
  },
  "javascript": {
    "formatter": {
      "enabled": true,
      "indentStyle": "space",
      "indentWidth": 2,
      "lineWidth": 120,
      "quoteStyle": "single",
      "semicolons": "asNeeded",
      "trailingCommas": "none"
    }
  }
}

package.json 内加上格式化命令脚本 "format": "biome format --write ./src"

"scripts": {
  "dev": "vite",
   "build": "vite build",
   "preview": "vite preview --port 4173",
   "format": "biome format --write ./src"
},

然后在命令行运行格式化命令

pnpm format

biome 格式化代码

小结

经过轮番混战,终于顺利的把项目从 webpack 更换到了 vite,并且使这个若干年前的古董项目在最新的环境下运行起来了。

如果你也有类似的需求,并且遇到其他问题,欢迎在评论区交流。

最后,如果本文对你有所增益,希望看官您用发财的小手点个小赞哈!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32的HAL编码流程总结(上部)

目录 一、GPIO二、中断系统三、USART串口通信四、I2C通信五、定时器 一、GPIO 1.选择调试类型 在SYS中Debug选择Serial Wire模式 2.选择时钟源 在RCC中将HSE和LSH都选择为内部晶振 3.时钟树配置 4.GPIO配置 在芯片图上选择开启的引脚和其功能 配置引脚的各自属性 5.工…

深度学习|pytorch基本运算

【1】引言 pytorch是深度学习常用的包,顾名思义,就是python适用的torch包,在python里面使用时直接import torch就可以调用。 需要注意的是,pytorch包与电脑配置、python版本有很大关系,一定要仔细阅读安装要求、找到…

替代 WPS 的新思路?快速将 Word 转为图片 PDF

在这个数字化办公日益普及的时代,越来越多的人开始关注文档处理工具的功能与体验。当我们习惯了某些便捷操作时,却发现一些常用功能正逐渐变为付费项目——比如 WPS 中的一项实用功能也开始收费了。 这款工具最特别的地方在于,可以直接把 W…

【K8S】K8S基础概念

一、 K8S组件 1.1 控制平面组件 kube-apiserver:公开 Kubernetes HTTP API 的核心组件服务器。 etcd:具备一致性和高可用性的键值存储,用于所有 API 服务器的数据存储。 kube-scheduler:查找尚未绑定到节点的 Pod,并将…

包含Javascript的HTML静态页面调取本机摄像头

在实际业务开发中,需要在带有摄像头的工作机上拍摄施工现场工作过程的图片,然后上传到服务器备存。 这便需要编写可以运行在浏览器上的代码,并在代码中实现Javascript调取摄像头、截取帧保存为图片的功能。 为了使用户更快掌握JS调取摄像头…

PCB设计实践(三十一)PCB设计中机械孔的合理设计与应用指南

一、机械孔的基本概念与分类 机械孔是PCB设计中用于实现机械固定、结构支撑、散热及电气连接的关键结构元件,其分类基于功能特性、制造工艺和应用场景的差异,主要分为以下几类: 1. 金属化机械孔 通过电镀工艺在孔内壁形成导电层,…

【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)

本篇文章将以一个小白视角,通俗易懂带你了解信号在产生,保存之后如何进行捕捉;以及在信号这个话题中;OS扮演的角色及背后是如何进行操作的;如何理解用户态内核态;还有一些可以引出的其他知识点;…

多功能秒达开源工具箱源码|完全开源的中文工具箱

源码介绍 完全开源的中文工具箱永远的自由软件轻量级运行全平台支持(包括ARMv8)类似GPT的智能支持高效UI高度集成提供Docker映像和便携式版本支持桌面版开源插件库 下载地址 百度网盘下载 提取码:p9ck ▌本文由 6v6-博客网 整理分享 ▶ 更多…

用nz-tabel写一个合并表格

用nz-tabel写一个合并表格 <nz-table #basicTable [nzData]"tableSearchStatus.dataList" nzBordered><thead><tr><th>班级</th><th>姓名</th><th>年龄</th><th>电话</th></tr></thead&…

leetcode hot100刷题日记——29.合并两个有序链表

解答&#xff1a; 方法一&#xff1a;递归 递归的边界条件是啥呢&#xff1f; 递归别想那么多具体步骤&#xff0c;考虑大步骤&#xff0c;小的递归自己会去做的 class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//递归比较大小//先考虑…

【计算机网络】第1章:概述—分组延时、丢失和吞吐量

目录 一、分组延时、丢失 1. 节点处理延时&#xff1a; 2. 排队延时&#xff1a; 3. 传输延时: 4. 传播延时: 5. 节点延时 6. 排队延时 7. 分组丢失 二、吞吐量 三、总结 &#xff08;一&#xff09;分组延时 1. 处理延时&#xff08;Processing Delay&#xff09; …

DeepSeek R1 模型小版本升级,DeepSeek-R1-0528都更新了哪些新特性?

DeepSeek-R1‑0528 技术剖析&#xff1a;思维链再进化&#xff0c;推理性能飙升 目录 版本概览深度思考能力再升级基准测试成绩功能与体验更新API 变动与示例模型开源与下载结语 版本概览 DeepSeek 团队今日发布 DeepSeek‑R1‑0528 —— 基于 DeepSeek V3 Base&#xff08;2…

SQL正则表达式总结

这里写目录标题 一、元字符二、正则表达函数1、 regexp_like(x,pattern[,match_option])2、 regexp_instr(x,pattern[,start[,occurrence[,return_option[, match_option]]]]) 3、 REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]]) 4、 REGEXP_REPLACE(x,patter…

力扣经典算法篇-13-接雨水(较难,动态规划,加法转减法优化,双指针法)

1、题干 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

STM32 -- USB虚拟串口通信

本篇操作: 通过CubeMX Keil&#xff0c;配置STM32作为USB设备端&#xff0c;与电脑上位机进行通信&#xff08;CDC&#xff09;&#xff1b;通用带USB功能的 STM32 芯片 &#xff08;如F1、F4等&#xff0c;系统时钟配置不同&#xff0c;代码通用&#xff09;。 目录 一、 S…

uni-app开发特殊社交APP

uni-app开发特殊社交APP 目录 1.展示APP功能 2.展示项目结构 3.关于我的GitHub 引言 博主最近自己在GitHub上面上传了一个关于社交软件的项目&#xff08;该项目早已开发完毕&#xff09;, 这个社交软件比较特殊, 被称之为blind-date&#xff0c; blind-date 是基于 uni-…

Linux中Shell脚本的常用命令

一、设置主机名称 1、通过修改系统文件来修改主机名称 [rootsakura1 桌面]# vim /etc/hostname sakura /etc/hostname&#xff1a;Linux 系统中存储主机名的配置文件。修改完文件后&#xff0c;在当前的shell中是不生效的&#xff0c;需要关闭当前shell后重新开启才能看到效…

RabbitMQ项目实战

先参考文章&#xff1a;&#xff08;必看&#xff09; 06-MQ基础_mq服务-CSDN博客 07-MQ高级&#xff08;幂等性&#xff09;-CSDN博客 https://cloud.iocoder.cn/message-queue/rabbitmq/#_2-0-%E5%BC%95%E5%85%A5%E4%BE%9D%E8%B5%96%E4%B8%8E%E9%85%8D%E7%BD%AE 1、Rabbi…

安卓开发用到的设计模式(3)行为型模式

安卓开发用到的设计模式&#xff08;3&#xff09;行为型模式 文章目录 安卓开发用到的设计模式&#xff08;3&#xff09;行为型模式1. 命令模式&#xff08;Command Pattern&#xff09;2. 策略模式&#xff08;Strategy Pattern&#xff09;3. 观察者模式&#xff08;Observ…

尚硅谷redis7 90-92 redis集群分片之集群扩容

90 redis集群分片之集群扩容 三主三从不够用了&#xff0c;进行扩容变为4主4从 问题&#xff1a;1.新建两个redis实例&#xff0c;怎么加入原有集群&#xff1f;2.原有的槽位分3段&#xff0c;又加进来一个槽位怎么算&#xff1f; 新建6387、6388两个服务实例配置文件新建后启…