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

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 upgradeWARN  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-eslinteslint  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: trueoverlay: {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 optionsobject 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         @contentnode_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           @importnode_modules\element-ui\packages\theme-chalk\src\select-dropdown.scss 3:9  @importnode_modules\element-ui\packages\theme-chalk\src\select.scss 4:9           @importnode_modules\element-ui\packages\theme-chalk\src\pagination.scss 4:9       @importnode_modules\element-ui\packages\theme-chalk\src\index.scss 2:9            @importstdin 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.mzph.cn/news/43475.shtml

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

相关文章

水库大坝安全监测MCU,提升大坝管理效率的利器!

水库大坝作为防洪度汛的重要设施&#xff0c;承担着防洪抗旱&#xff0c;节流发电的重要作用。大坝的安全直接关系到水库的安全和人民群众的生命财产安全。但因为水库大坝的隐患不易被察觉&#xff0c;发现时往往为时已晚。因此&#xff0c;必须加强对大坝的安全管理。其安全监…

RFID技术助力汽车零配件装配产线,提升效率与准确性

随着科技的不断发展&#xff0c;越来越多的自动化设备被应用到汽车零配件装配产线中。其中&#xff0c;射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术凭借其独特的优势&#xff0c;已经成为了这一领域的重要技术之一。本文将介绍RF…

【SLAM】ORBSLAM34macOS: ORBSLAM3 Project 4(for) macOS Platform

文章目录 配置ORBSLAM34macOS 版本运行步骤&#xff1a;版本修复问题记录&#xff1a;编译 fix运行 fix 配置 硬件&#xff1a;MacBook Pro Intel CPU 系统&#xff1a;macOS Ventura 13.4.1 ORBSLAM34macOS 版本 https://github.com/phdsky/ORB_SLAM3/tree/macOS 运行步骤&…

初识结构体

文章目录 目录1. 结构体类型的声明1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化 2. 结构体成员的访问3. 结构体传参 目录 结构体类型的声明结构体初始化结构体成员访问结构体传参 1. 结构体类型的声明 1.1 结构的基础知识 结构是一些值的…

三维可视化平台有哪些?Sovit3D可视化平台怎么样?

随着社会经济的发展和数字技术的进步&#xff0c;互联网行业发展迅速。为了适应新时代社会发展的需要&#xff0c;大数据在这个社会经济发展过程中随着技术的进步而显得尤为重要。同时&#xff0c;大数据技术的快速发展进程也推动了可视化技术的飞速发展&#xff0c;国内外各类…

四层和七层负载均衡的区别

一、四层负载均衡 四层就是ISO参考模型中的第四层。四层负载均衡器也称为四层交换机&#xff0c;它主要时通过分析IP层和TCP/UDP层的流量实现的基于“IP端口”的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。 以常见的TCP应用为例&#xff0c;负载均衡器在接收到第一个来…

hive-无法启动hiveserver2

启动hiveserver2没有反应&#xff0c;客户端也无法连接( beeline -u jdbc:hive2://node01:10000 -n root) 报错如下 查看hive的Log日志&#xff0c;发现如下报错 如何解决 在hive的hive_site.xml中添加如下代码 <property><name>hive.server2.active.passive…

电机故障诊断(python程序,模型为MSCNN结合LSTM结合注意力机制模型,有注释)

代码运行环境要求&#xff1a;TensorFlow版本>2.4.0&#xff0c;python版本>3.6.0 1.电机常见的故障类型有以下几种&#xff1a; 轴承故障&#xff1a;轴承是电机运转时最容易受损的部件之一。常见故障包括磨损、疲劳、过热和润滑不良&#xff0c;这些问题可能导致噪音增…

Hlang--用Python写个编程语言-判断与循环

文章目录 前言语法描述判断循环词法解析语法解析定义节点生成节点判断节点循环节点解释器处理判断节点循环处理前言 okey,很好,在上一篇文章当中,我们实现了这个基本的逻辑运算,所以的话,在这里,我们将可以实现到我们的这个判断和循环了。由于这里的话,我们的操作其实和…

TiDB Bot:用 Generative AI 构建企业专属的用户助手机器人

本文介绍了 PingCAP 是如何用 Generative AI 构建一个使用企业专属知识库的用户助手机器人。除了使用业界常用的基于知识库的回答方法外&#xff0c;还尝试使用模型在 few shot 方法下判断毒性。 最终&#xff0c;该机器人在用户使用后&#xff0c;点踩的比例低于 5%&#xff0…

汽车租赁管理系统/汽车租赁网站的设计与实现

摘 要 租赁汽车走进社区&#xff0c;走进生活&#xff0c;成为当今生活中不可缺少的一部分。随着汽车租赁业的发展&#xff0c;加强管理和规范管理司促进汽车租赁业健康发展的重要推动力。汽车租赁业为道路运输车辆一种新的融资服务形式、广大人民群众一种新的出行消费方式和…

龙蜥社区安全联盟(OASA)正式成立,启明星辰、绿盟、360 等 23 家厂商重磅加入

7 月 28 日&#xff0c;由启明星辰、绿盟、360、阿里云、统信软件、浪潮信息、中兴通讯&#xff5c;中兴新支点、Intel、中科院软件所等 23 家单位共同发起的龙蜥社区安全联盟&#xff08;OASA&#xff0c;OpenAnolisSecurityAlliance&#xff09;&#xff08;以下简称“安全联…

insightface安装过程中提示 Microsoft Visual C++ 14.0 or greater is required.

pip install insightface安装过程中提示 Microsoft Visual C 14.0 or greater is required.Get it with "Microsoft C Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ 根据提示网站访问官网下载生成工具 打开软件后会自动更新环境&#…

集群、负载均衡集群、高可用集群简介,LVS工作结构、工作模式、调度算法和haproxy/nginx模式拓扑介绍

一.集群的定义 1.定义 2.分类 &#xff08;1&#xff09;负载均衡集群&#xff08;LBC/LB&#xff09; &#xff08;2&#xff09;高可用集群&#xff08;HAC&#xff09; 二.使用集群的意义 1.高性价比和性能比 2.高可用性 3.可伸缩性强 4.持久和透明性高 三.常见的…

运维监控学习笔记9

2、画出拓扑图的小案例&#xff1a; 3、在连接的线上显示网络流量&#xff0c;使用了一个简单的公式&#xff1a; {nginx-server:net.if.out[ens33].last(0)} 4、在screens中显示nginx的状态页面&#xff1a; 5、zabbix报警&#xff1a; 发送邮件的选项。Email可以使用&#xf…

【Nginx18】Nginx学习:WebDav文件存储与图片媒体处理模块

Nginx学习&#xff1a;WebDav文件存储与图片媒体处理模块 今天的内容怎么说呢&#xff1f;有两个感觉非常有意思&#xff0c;另外一些就差点意思。有意思的是&#xff0c;咱们可以直接用 Nginx 的 Webdav 功能搭建一个网盘&#xff0c;另外也可以实现动态的图片处理。这两个功能…

安装jenkins-cli

1、要在 Linux 操作系统上安装 jcli curl -L https://github.com/jenkins-zh/jenkins-cli/releases/latest/download/jcli-linux-amd64.tar.gz|tar xzv sudo mv jcli /usr/local/bin/ 在用户根目录下&#xff0c;增加 jcli 的配置文件&#xff1a; jcli config gen -ifalse …

nginx 配置反向代理的逻辑原则案例(值得一看)

一 实操步骤 1.1 架构图 1.2 配置原则 匹配准则&#xff1a; 当proxy_pass代理地址端口后有目录(包括 / 和/xxx),相当于是绝对根路径&#xff0c;则 nginx 不会把 location 中匹配的路径部分代理走; 当proxy_pass代理地址端口后无任何内容&#xff0c;可以理解为相对路径…

【Linux命令详解 | gzip命令】 gzip命令用于压缩文件,可以显著减小文件大小

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 基本压缩和解压2. 压缩目录3. 查看压缩文件内容4. 测试压缩文件的完整性5. 强制压缩6. 压缩级别7. 与其他命令结合使用8. 压缩多个文件9. 自动删除原文件 总结 简介 在Linux中&#xff0c;gzip命令是一款强大的文…

python+django+mysql项目实践四(信息修改+用户登陆)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 用户信息修改 修改用户信息需要显示原内容,进行修改 通过url传递编号 urls views 修改内容需要用数据库的更新,用update进行更新,用filter进行选择 输入参数多nid,传递要修…