vue2.6升级vue2.7(panjiachen升级指南)vue-cli5多页面应用升级的坑

news2024/11/18 13:39:35

vue2.7升级指南

vue2.7升级指南

之前的架子使用的是 panjiachen,使用的是 vue2.6.14,现在升级为 vue2.7.x

升级@vue/cli

vue upgrade

这里推荐使用 vue upgrade 命令自动升级

# 确保安装全局 @vue/cli
$ npm install -g @vue/cli
$ vue upgrade

WARN  There are uncommitted changes in the current repository, it's recommended to commit or stash them first.
? Still proceed? Yes
✔  Gathering package information...
  Name                    Installed       Wanted          Latest          Command to upgrade
  @vue/cli-service        4.4.4           4.4.4           5.0.8           vue upgrade @vue/cli-service
  @vue/cli-plugin-babel   4.4.4           4.4.4           5.0.8           vue upgrade @vue/cli-plugin-babel
  @vue/cli-plugin-eslint  4.4.4           4.4.4           5.0.8           vue upgrade @vue/cli-plugin-eslint
? Continue to upgrade these plugins? Yes
Upgrading @vue/cli-service from 4.4.4 to 5.0.8
🚀  Running migrator of @vue/cli-service
✔  Successfully invoked migrator for plugin: @vue/cli-service
Upgrading @vue/cli-plugin-babel from 4.4.4 to 5.0.8
🚀  Running migrator of @vue/cli-plugin-babel
✔  Successfully invoked migrator for plugin: @vue/cli-plugin-babel
Upgrading @vue/cli-plugin-eslint from 4.4.4 to 5.0.8
🚀  Running migrator of @vue/cli-plugin-eslint
📦  Installing additional dependencies...
✔  Successfully invoked migrator for plugin: @vue/cli-plugin-eslint
 eslint  ESLint upgraded from v5. to v7

这里发现有 3 个文件发生了修改,babel.config.js 实际上没有发生改变

image-20230810101857391

vue upgrade 帮你做的事情

如果不这么做,需要进行如下操作,十分麻烦。如果依赖冲突,可以使用 npm i --legacy-peer-deps 进行安装

  1. @vue/cli-xxx 依赖升级至最新版本范围,这里我打算使用 vue-cli5

    • v4 升级至 ~4.5.18
    • v5 升级至 ~5.0.6
    $ npm i @vue/cli-plugin-babel@5 @vue/cli-plugin-eslint@5 @vue/cli-service@5 -D
    
    - "@vue/cli-plugin-babel": "4.4.4"
    - "@vue/cli-plugin-eslint": "4.4.4"
    - "@vue/cli-service": "4.4.4"
    + "@vue/cli-plugin-babel": "^5.0.8"
    + "@vue/cli-plugin-eslint": "^5.0.8"
    + "@vue/cli-service": "^5.0.8"
    
  2. 升级 eslint,并安装 @babel/core

    $ npm i eslint@7 eslint-plugin-vue@8 -D
    - "eslint": "6.7.2"
    - "eslint-plugin-vue": "6.2.2"
    + "eslint": "^7.32.0"
    + "eslint-plugin-vue": "^8.0.3"
    + "@babel/core": "^7.12.16"
    

    还需要升级 eslint 对应的 parser,安装 @babel/eslint-parse

    $ npm un babel-eslint
    $ npm i @babel/eslint-parser@7 @babel/core@7
    
    - "babel-eslint": "10.1.0"
    + "@babel/eslint-parser": "^7.12.16"
    

    之后修改 .eslintrc.js 对应的 parse

    module.exports = {
      parserOptions: {
        parser: '@babel/eslint-parser'
      }
    }
    

解决@vue/cli报错

升级完 vue-cli 需要解决一下 vue-cli 语法升级报的错,需要修改 vue.config.js

  1. 之前使用 JSDoc 的形式可以改为 defineConfig 帮手函数

    /**
     * @type {import('@vue/cli-service').ProjectOptions}
     */
    module.exports = { }
    
    // 需要改为如下内容
    const { defineConfig } = require('@vue/cli-service')
    module.exports = defineConfig({ })
    
  2. devtool 更加严格,填写之前去 webpack 官网查一下:

    https://www.webpackjs.com/configuration/devtool/

    # 报错信息
    ValidationError: Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.
    	- configuration.devtool should match pattern "^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map$".
    	BREAKING CHANGE since webpack 5: The devtool option is more strict.
    Please strictly follow the order of the keywords in the pattern
    

    比如:你写 cheap-module-eval-source-map 是不合法的,需要改为 eval-cheap-module-source-map

    config.when(process.env.NODE_ENV === 'development', config => config.devtool('eval-cheap-module-source-map'))
    
  3. devServer 有很多配置发生了变化,比如:

    {
      devServer: {
        hotOnly: true
        overlay: {
          warnings: false,
          errors: true
        },
        before: require('./mock/mock-server.js'),
        disableHostCheck: true
      }
    }
    
    // 需要改为
    {
      devServer: {
        hot: "only",
        onBeforeSetupMiddleware: require('./mock/mock-server.js'),
        client: {
          overlay: {
            warnings: false,
            errors: true
          }
        },
        allowedHosts: "all"
      }
    }
    

    可以参考:https://github.com/webpack/webpack-dev-server/blob/master/migration-v4.md

    比如这里报错 ‘disableHostCheck’ 是未知属性,就可以在这个文档中查一下,看看它改成了什么

    # 报错信息
    ValidationError: Invalid options object. Dev Server has been initialized using an options
    
    object that does not match the API schema.
    	- options has an unknown property 'disableHostCheck'. These properties are valid:        
    	object { allowedHosts?, bonjour?, client?, compress?, devMiddleware?, headers?, historyApiFallback?, host?, hot?, http2?, https?, ipc?, liveReload?, magicHtml?, onAfterSetupMiddleware?, onBeforeSetupMiddleware?, onListening?, open?, port?, proxy?, server?, setupExitSignals?, setupMiddlewares?, static?, watchFiles?, webSocketServer? }
    
  4. svg 报错问题

    ERROR in ./src/pages/xx/icons/svg/wechat.svg
    Module build failed (from ./node_modules/svg-sprite-loader/lib/loader.js):
    Error: Cannot find module 'webpack/lib/RuleSet'
    

    升级 svg-sprite-loader 即可

    $ npm i svg-sprite-loader@6
    - "svg-sprite-loader": "4.1.3"
    + "svg-sprite-loader": "^6.0.11"
    
  5. path 模块找不到问题

    Module not found: Error: Can't resolve 'path' in 'E:\xx\src\pages\xx\components\layout\components\Sidebar'
    
    BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
    
    This is no longer the case. Verify if you need this module and configure a polyfill for it.
    If you want to include a polyfill, you need to:
    	- add a fallback 'resolve.fallback: { "path": require.resolve("path-browserify") }'
    	- install 'path-browserify'
    If you don't want to include a polyfill, you can use an empty module like this: resolve.fallback: { "path": false }
    

    webpack5 不再自动填充 Node 核心模块,如果你想使用的话需要从 npm 安装兼容的模块并自己包含它们。其它模块同理

    https://webpack.js.org/configuration/resolve/#resolvefallback

    $ npm i path-browserify -D
    + "path-browserify": "^1.0.1"
    

    引入即可。不过这里我尝试用链式调用的写法去写,没生效

    {
      configureWebpack: {
        resolve: {
          fallback: {
            path: require.resolve('path-browserify')
          }
        }
      }
    }
    
  6. npm i 报错

    可以使用 npm i --legacy-peer-deps 解决

    npm ERR! Fix the upstream dependency conflict, or retry
    npm ERR! this command with --force, or --legacy-peer-deps
    npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
    

    不过也要统一把对应插件的版本全部升级一遍。比如:copy-webpack-pluginhtml-webpack-plugin

    • copy-webpack-plugin@5 对应 webpack@4

      里面的配置写法稍有变更,照着提示改下即可

    • html-webpack-plugin@3 对应 webpack@4

    • script-ext-html-webpack-plugin@2 对应 webpack@4

      内联 runtime 的代码就直接删掉了

    $ npm i copy-webpack-plugin@11 -D
    - "copy-webpack-plugin": "5.0.5"
    + "copy-webpack-plugin": "^11.0.0"
    
    $ npm i html-webpack-plugin@5
    - "html-webpack-plugin": "3.2.0"
    + "html-webpack-plugin": "^5.5.3"
    
    $ npm un script-ext-html-webpack-plugin
    - "script-ext-html-webpack-plugin": "2.1.3"
    
  7. css 全局变量

    需要把 pretendData 改为 additionalData

    {
      css: {
        loaderOptions: {
          sass: {
            additionalData: '@import "~@/styles/variables.scss";'
          }
        }
      }
    }
    
  8. 多入口 plugin 异常问题(没有使用多入口的可以跳过这个问题)

    # 报错信息
    Error: Cannot call .tap() on a plugin that has not yet been defined. Call plugin('preload')
    

    可以参考:https://cli.vuejs.org/zh/config/#pages 这里面的提示

    如果你试图修改 html-webpack-pluginpreload-webpack-plugin 插件的选项,可以使用 vue inspect --plugins 看看都有哪些 plugin

    $ npm i @vue/preload-webpack-plugin -D
    + "@vue/preload-webpack-plugin": "^2.0.0"
    

    之前直接使用 tap 连接即可,现在需要指定 plugin

    Object.keys(pages).forEach(name => {
      config.plugin(`preload-${name}`).tap(() => [
        {
          rel: 'preload',
          fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
          include: 'initial'
        }
      ])
      config.plugins.delete(`prefetch-${name}`)
    })
    
    // 需要改为如下内容
    Object.keys(pages).forEach(name => {
      config.plugin(`preload-${name}`).use(require('@vue/preload-webpack-plugin'), [
        {
          rel: 'preload',
          fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
          include: 'initial'
        }
      ])
      config.plugins.delete(`prefetch-${name}`)
    })
    
  9. sass 警告问题

    Deprecation Warning: Using / for division outside of calc() is deprecated and will be removed in Dart Sass 2.0.0.
    Recommendation: math.div($--tooltip-arrow-size, 2) or calc($--tooltip-arrow-size / 2)
    More info and automated migrator: https://sass-lang.com/d/slash-div
       ╷
    89 │     margin-bottom: #{$--tooltip-arrow-size / 2};
       │                      ^^^^^^^^^^^^^^^^^^^^^^^^^
       ╵
        node_modules\element-ui\packages\theme-chalk\src\popper.scss 89:22         @content
        node_modules\element-ui\packages\theme-chalk\src\mixins\mixins.scss 74:5   b()
        node_modules\element-ui\packages\theme-chalk\src\popper.scss 4:1           @import
        node_modules\element-ui\packages\theme-chalk\src\select-dropdown.scss 3:9  @import
        node_modules\element-ui\packages\theme-chalk\src\select.scss 4:9           @import
        node_modules\element-ui\packages\theme-chalk\src\pagination.scss 4:9       @import
        node_modules\element-ui\packages\theme-chalk\src\index.scss 2:9            @import
        stdin 25:9                                                                 root stylesheet
    Warning: 33 repetitive deprecation warnings omitted.
    

    升级 sass 版本 和 sass-loader 版本,注意里面 deep 写法也需要改变,需要改为 ::v-deep

    $ npm i sass sass-loader@12
    - "sass": "1.26.2"
    - "sass-loader": "8.0.2"
    + "sass": "^1.44.0"
    + "sass-loader": "^12.6.0"
    

    这个一定要解决

    warning  in ./src/pages/xx/components/layout/components/Sidebar/index.vue?vue&type=script&lang=js&
    export 'default' (imported as 'variables') was not found in '@/styles/variables.scss' (module has no exports)
    

    因为页面里用到了 variables.scss 导出的变量,新版如果没有进行处理会导致页面阻塞

    • 需要将 variables.scss 名改为 variables.module.scss
  10. 打包两次问题,Vue-cli5 以后你会发现会打包两次

    vue2 项目升级到 vue3 之后 npm run build 执行两遍打包

    -  Building legacy bundle for production...
    -  Building module bundle for production...
    

    主要是因为要兼容浏览器导致,可以在 .browserslistrc 里配置 not deadnot ie 11

    > 1%
    last 2 versions
    not dead
    not ie 11
    

    再进行打包就只会打包一次

    -  Building for production...
    
  11. eslint 可能会有一些警告或报错

    • 可以先整体修复一遍,之后再解决一下没办法修复的
    {
      "scripts": {
        "lint": "eslint . --ext .html,.vue,.js,.jsx --fix"
      }
    }
    

升级vue

  1. 升级 vue 至 2.7。同时可以将 vue-template-compiler 从依赖中移除

    如果你在使用 @vue/test-utils,那么 vue-template-compiler 需要保留

    $ npm i vue@2.7
    $ npm un vue-template-compiler
    
    - "vue": "2.6.10",
    - "vue-template-compiler": "^2.6.11",
    + "vue": "^2.7.14",
    
  2. 这里我没有使用 vite,很多和 vite 相关的就没必要处理了

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

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

相关文章

Vue 2 自定义指令

Vue 2自定义指令 Vue自定义指令允许我们在DOM元素上添加自己想要的行为来扩展Vue的功能。 一个自定义指令需要一个名称和一个定义对象。在定义对象中&#xff0c;你可以使用一些钩子函数来控制指令的行为&#xff1a; bind&#xff1a;在指令被绑定到元素上时使用&#xff0…

基于IMX6ULLmini的linux裸机开发系列七:中断处理流程

中断上下文 cpu通过内核寄存器来运行指令并进行数据的读写处理的&#xff0c;它在进入中断前一个时刻的具体值&#xff0c;称为中断上下文 中断上下文是指CPU在进入中断之前保存的寄存器状态和其他相关信息。当CPU接收到中断请求时&#xff0c;它会保存当前正在执行的指令的状…

广州华锐互动:3D数字孪生开发编辑器助力企业高效开发数字孪生应用

3D数字孪生开发编辑器是一种新兴的技术&#xff0c;它可以帮助企业更好地管理和维护其物联网设备。这些工具可以帮助企业实现对设备的实时监控、故障排除和优化&#xff0c;从而提高生产效率和降低成本。 数字孪生系统是一种将物理世界与数字世界相结合的技术&#xff0c;它可以…

Python web实战之细说 Django 的单元测试

关键词&#xff1a; Python Web 开发、Django、单元测试、测试驱动开发、TDD、测试框架、持续集成、自动化测试 大家好&#xff0c;今天&#xff0c;我将带领大家进入 Python Web 开发的新世界&#xff0c;深入探讨 Django 的单元测试。通过本文的实战案例和详细讲解&#xff…

【C#学习笔记】C#特性的继承,封装,多态

文章目录 封装访问修饰符静态类和静态方法静态构造函数 继承继承原则sealed修饰符里氏替换原则继承中的构造函数 多态接口接口的实例化 抽象类和抽象方法抽象类和接口的异同 虚方法同名方法new覆盖的父类方法继承的同名方法 运行时的多态性编译时的多态性 照理继承封装多态应该…

Chapter 14: Using Web Services | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Python and Web ServicesUsing Web ServiceseXtensible Markup Language - XMLParsing XMLJavaScript Object Notation - JSONParsing JSONApplication Programming InterfacesSecurity and API usageGlossary Python for Everybody Expl…

all in one之安装docker、青龙和青龙卸载更新(第三章)

安装docker和青龙 ubuntu安装docker 参考教程0 参考教程1 参考教程2 apt-get install docker-ce docker-ce-cli containerd.io更改docker国内源 一、国内加速地址 Docker中国区官方镜像 https://registry.docker-cn.com网易 http://hub-mirror.c.163.comustc https://d…

Monitor.Analog采集软件详细设计说明

Monitor.Analog模拟量采集软件概要设计&#xff1a; 1. 引言&#xff1a; 模拟量采集软件的目标是实现对模拟量信号的采集、处理和展示。该软件旨在提供一个用户友好的界面&#xff0c;允许用户配置采集参数、实时监测模拟量信号&#xff0c;并提供数据分析和导出功能。 2. 功能…

多功能数据采集主机——数据集中采集

无论是机房监控系统还是仓库监控系统&#xff0c;又或者是其他大型场所的监控系统都会用的一个设备——多功能数据采集主机。 在环境监控系统中会用到温湿度、水浸、烟感等多种传感器&#xff0c;时时监测周围环境&#xff0c;这些传感器都可以通过多功能数据采集主机&#xff…

学习笔记230816---vue项目中使用第三方组件{el-dropdown}如何设置禁止事件功能

问题描述 使用第三方组件elementui&#xff0c;在导航菜单el-menu的el-menu-item中嵌入一个下拉菜框el-dropdown。点击...icon弹出下拉菜单el-dropdown-menu&#xff0c;那么这时会触发事件冒泡&#xff0c;el-menu-item菜单项的点击事件也会触发。 解决方法 阻止事件冒泡&am…

学习笔记230804---逻辑跳转this.$router.push在写法上的优化

今天和资深前端代码写重&#xff0c;同时写页面带参跳转&#xff0c;组长觉得他写的方式比我高端一点&#xff0c;我觉得确实是&#xff0c;像资深大佬学习。 我的写法&#xff1a; this.$router.push(/bdesign?applicationId${this.data.id}&appName${this.data.name})…

【单片机毕业设计4-基于stm32c8t6的红外测温系统】

【单片机毕业设计4-基于stm32c8t6的红外测温系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇4基于stm32的红外测温系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -------------------…

mysql主从复制最简单环境搭建(一主一从)

提示&#xff1a;前面有相应的文章利用不同方式进行的主从配置 文章目录 前言一、概述二、主从复制的优点三、原理四、搭建五、主库配置六、从库配置七、测试 前言 一、概述 主从复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上…

Mac 使用 rar 命令行工具解压和压缩文件

在 Mac 中常遇到的压缩文件有 zip 和 rar 格式的&#xff0c;如果是 zip 格式的 Mac 系统默认双击一下文件就能直接解压了&#xff0c;但 rar 文件就不行。 需要额外下载 rar 工具了实现。 第一步&#xff1a;下载 rar 工具 工具网址&#xff1a;https://www.rarlab.com/dow…

【C++】stack/queue/优先级队列的模拟实现

目录 1. stack/queue1.1 模拟实现 2. 优先级队列2.1 模拟实现2.2 仿函数 1. stack/queue stack文档说明 queue文档说明 stack和queue被称为容器适配器。 容器适配器是什么&#xff1f; 它是一种特殊的容器类型&#xff0c;通过封装已有的容器类型来提供特定功能的接口函数&a…

探索1688 API的无限商机与应用

为了更好地满足用户需求&#xff0c;1688.com开放了丰富强大的API接口&#xff0c;使得开发者可以便捷地与平台进行集成&#xff0c;实现自动化的商务操作。 产品查询与筛选&#xff1a;通过调用1688 API&#xff0c;你可以根据自定义条件进行商品查询和筛选&#xff0c;获取符…

JAVA三种拦截方式

最近面试有遇到拦截方式的场景&#xff0c;结合网上xdm的代码整理了下&#xff0c;分为以下三种&#xff1a; java原生过滤器Filter、springMVC拦截器、aop切面 目录&#xff1a; 一、java原生过滤器Filter二、springMVC拦截器三、aop切面 一、java原生过滤器Filter package c…

C++初阶语法——new,delete开辟/销毁动态内存空间

前言&#xff1a;在C语言中&#xff0c;有malloc&#xff0c;realloc&#xff0c;calloc开辟动态内存空间&#xff0c;free销毁动态内存空间。而在C中&#xff0c;使用new开辟动态内存空间&#xff0c;delete销毁动态内存空间。不仅简化了操作&#xff0c;更为重要的是&#xf…

springcloud3 hystrix实现服务监控显示3(了解)

一 hystrix的服务监控调用 1.1 hystrix的服务监控调用 hystrix提供了准实时的监控调用&#xff08;hystrix dashbord&#xff09;&#xff0c;Hystrix 会持续的记录所有通过hystrix发送的请求的执行信息&#xff0c;并以统计报表和图形的形式展示给用户&#xff0c;包括每秒执…

在海外如何进行应用商店的关键词优化

分析市场&#xff0c;了解我们的应用类别&#xff0c;将我们的应用与竞争对手的优点和缺点进行比较&#xff0c;找到市场上的空白或所谓未满足的需求&#xff0c;并思考如何填补。 1、应用商店关键词优化。 关键词优化的目的是找到最相关的关键词 &#xff0c;并测试应用元数据…