1 minute read

题图是封闭期间隔着小区的围栏拍的外卖小哥

注意,本文不是教程,只是自己折腾的记录,方便自己以后折腾的时候查阅

现在 vue 生态都在建议 vue3 的项目使用 vite 作为打包和开发的脚手架。但是我有许多历史项目都还是使用 @vue/cli 创建出来的 webpack 的版本。

从 vue-cli 的 Github 上看,这个项目已经处于生命周期的末期,目前只是维护。所以迁移到 vite 是迟早的事情,为了能更好的迁移,我决定先创建两个新项目来演练一下。

我的项目配置都是 typescript + eslint + Prettier + vue router 。所以分别用两个工具各自按照需求创建好了之后的文件结构如下:

webpack

webpack

vite

vite

可以看到,其实文件区别不是特别大。public 里面的 index.html 换到了外面,同时我们知道 vite 是通过浏览器自己的 esm 来进行模块加载的,所以 index里面的加载方式也有一些改变。如下

webpack的index.html

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

vite 的 index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite App</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

所以第一步就是把文件结构整理得和 vite 版本一样,并且替换 index.html

第二步就比较简单了,把 vite.confg\tsconfig\eslint 等等config复制过来,同时如果有重名的config记得先备份一下,然后按需求merge,同样地,babel 的config 就可以删除掉了,因为用不到了。vue.confg.js 同理,但是可以先保存一下,因为可能有一些特殊的配置需要迁移过去。 这里还有个特殊的 config ,就是 eslint 的,记得从旧的 config 把你特有的 rule 复制过来

第三步则是比较麻烦的,需要去修改package.json

我的操作逻辑如下

  • 替换 scripts 为 vite 的命令(这里记得保留一些前置的命令,比如 cross-env 之类的)
  • 删除 devDependencies 里面所有和 vue-create 生成项目相关内容 (这里可以建立一个空项目来看看)
  • 删除 core-js 依赖
  • 增加 devDependencies

至此,已经可以安装依赖了,你是喜欢 npm install 或者 yarn 都可以

当然,这才是第一步,因为如果是一个老项目,你一定会遇到非常多的报错。

最常见的如:

vite 不支持 typescript 的类型检查,所以需要明确的分别导入导出类型

import type { T } from 'only/types'
export type { T }

虽然说新的项目都建议直接使用 css 来进行开发,因为现代 css已经非常强大,scss 的存在早已不是必要。但是兼容老项目,所以你还是得装一下 scss

 yarn add -D sass

一些其他的坑

scss additionalData

//vite.config.js
css: {
  preprocessorOptions: {
    //define global scss variable
    scss: {
      additionalData: `@import '@/styles/variables.scss';`,
    },
  },
}

api 反代和server配置 https://vitejs.dev/config/#server-host

变量执行顺序

vite 因为不会像 babel 那样给你整体的处理一边,所以在定义 computedRef 的时候要注意访问的顺序,不能先访问再定义,会报错

svg inline loader

官方有个issue Support inlining SVG assets #1204 目前我就打算先手动管理,后续等官方这个有支持了,再考虑变成 inline 吧

搞定一切后,一定要打包一下看看打包后的 release 版本有没有问题。

Tags: ,

Categories:

Updated: