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.pswp.cn/news/43475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43475.shtml
英文地址,請注明出處:http://en.pswp.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…

trees和woods使用有什么區別

“Trees” 和 “woods” 都指的是樹木&#xff0c;但它們在語境和用法上有一些區別&#xff1a; 數量和單個實體&#xff1a;“Trees” 是一個通用的名詞&#xff0c;用來指代多個樹木。它沒有限定數量&#xff0c;可以表示任意多的樹木。 “Woods” 則更常用于指一片有密集樹木…

【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命令是一款強大的文…