上周末花了一些时间把手头的一个小项目从 Vue 2.6 升级到 Vue 3.2,把 webpack 从 2 点多升到 了 5。本篇文章记录一下过程。


迁移原因

  1. 心理原因:小项目的模板是从一个旧的 monorepo 的项目脱胎出来的,Webpack 的配置有些杂乱有些绕,属于能跑就行。改不太动,索性升级,不然这块内容对我来说永远是技术债,是不想去触摸的一团模糊。
  2. 直接原因:想给应用加一个 Notification 的功能,这个功能需要 https 环境。 但是 webpack-dev-server 的 https 配不成功,开启 https 后一访问服务就崩溃。
  3. 其他原因:积累经验

迁移目标

  1. 原先的项目能跑
  2. 原先的 webpack 配置,觉得有用的,在迁移后要保留下来
  3. 在迁移后,能够通过阅读 webpack 文档
    1. 自由地测试各提供方的 Loader 和 Plugin
    2. 自由地测试 webpack 的新功能
    3. 将来可从工具链角度优化项目性能,使其不再是一团模糊
    4. 进阶:以 webpack 为抓手,扩展了解不同构建工具:**gulp, babel, parcel, snowpack,esbuild,vite,swc。(**这些名次对我来说很眼熟,但只在初学 HTML 时接触过 parcel,所以不好意思有可能把不同类型的东西并列在了一起

迁移了哪些内容

在迁移之前,首先是过了一下这个里面提到 https://v3-migration.vuejs.org/ 的问题。

因为首次完整通读了的文档版本就是 Vue 3 的,所以不会心怯,也不需要再读一遍了。

(这是基于初识 Vue 3 所练手的一个小东西:‣)

迁移目标的第一点决定了我几乎只记录 breaking change。

  1. 项目上的改动**:**
  2. 依赖上的改动
    1. vuex, vue router 升级,但项目没有用到什么新特性
    2. 一些普通的运行时依赖:
      1. 如果还能用,没有报错,就没有升级
      2. 对 Vue2 和 Vue3 区分了不同版本的依赖
        1. 如 vue-toastification 则进行了升级
        2. 如 vue-codemirror 报错,其有 Vue3 版本
          1. 配置方式发生改变,API 接口改变。兼容 Vue 2版本的 vue-codemirror 的配置粒度较细,兼容 Vue 3 版本的 vue-codemirror 提供了一个 basic-setup 启动配置,基本满足需求。像原来的 keymap 如今包含在 basic-setup 中了
          2. 引入依赖的方式发生改变。现在需要单独安装需要用到的 codemirror extensions。比如 language package 或 theme,有利于摇树、节省体积
          3. Vue 3 版本的 vue-codemirror 还待完善,比如 theme 目前只支持一个 one-dark。由此可见虽然 Vue 3 的主生态算是比较完善了,但各依赖对 Vue 3 的适配还在“进行时”,尤其是像 codemirror 这种比较重的东西。