Vue2.7.14、[email protected] 升级 [email protected]

 项目背景

Vue2.7.14、vuecli@5.0.8、element-ui@2.15.13、node14.18.3

本项目内部项目,不涉及CDN加速

vite安装

pnpm add vite@4.4.8 -D

入口文件index.html

文件位置修改

将pulic里的index.html移到根目录下

根目录/public/index.html 到 根目录/index.html

文件内容修改

<link rel="icon" href="<%= BASE_URL %>favicon.ico"> #remove
<link rel="icon" href="/favicon.ico"> #add
<script type="module" src="/src/main.js"></script> #add

<title>Vue</title> 

 title如果是动态的,可以引入 vite-plugin-html

vite.config.js

import { defineConfig } from 'vite'
//让浏览器支持commonjs语法
import { viteCommonjs } from '@originjs/vite-plugin-commonjs'
//配置vue
import vue from '@vitejs/plugin-vue2'
import path from 'path'
//兼容require
import vitePluginRequire from 'vite-plugin-require'
//gzip压缩
import viteCompression from 'vite-plugin-compression'
import { visualizer } from 'rollup-plugin-visualizer'
import obfuscatorPlugin from 'vite-plugin-javascript-obfuscator'

const REPLACEMENT = `${path.resolve(__dirname, './src')}/`

export default defineConfig({
  server: {
    host: '0.0.0.0',
    https: false,
    port: 8080,
    proxy: {
      '/web': {
        // 路径中有 /api 的请求都会走这个代理 , 可以自己定义一个,下面移除即可
        target: 'https://baidu.com:8080', // 目标代理接口地址,实际跨域要访问的接口,这个地址会替换掉 axios.defaults.baseURL
        secure: false,
        changeOrigin: true, // 开启代理,在本地创建一个虚拟服务端
        ws: true //,       // 是否启用  websockets;
      }
    }
  },

  resolve: {
    alias: {
      '@utils': `${path.resolve(__dirname, './src/utils')}/`,
      styles: `${path.resolve(__dirname, './src/styles')}/`,
      '@assets': `${path.resolve(__dirname, './src/assets')}/`,
      '@': REPLACEMENT,
      '@/': REPLACEMENT,
      'src/': REPLACEMENT,
      vue: 'vue/dist/vue.esm.js' //解决el-table 生产环境不显示
    },
    extensions: ['.vue', '.js', '.jsx', '.mjs', '.ts', '.tsx', '.json', '.css', '.scss']
  },
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/common.scss";`
      }
    }
  },
  build: {
    minify: 'esbuild',
    sourcemap: false,
    // 进行压缩计算
    brotliSize: false,
    modulePreload: false,
    chunkSizeWarningLimit: 10240,
    target: 'es2015', // 设置目标浏览器的最低版本
    rollupOptions: {
      treeshake: true,
      output: {
        chunkFileNames: 'js/[name]-[hash].js',
        entryFileNames: 'js/[name]-[hash].js',
        assetFileNames: '[ext]/[name]-[hash].[ext]',
        // 分包
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString()
          }
        }
      }
    }
  },
  plugins: [
    visualizer(), //分析构建
    vue(), //配置vue
    viteCommonjs(),
    vitePluginRequire(), //兼容require
    viteCompression({
      verbose: true, // 输出压缩成功默认即可
      disable: false, //开启压缩(不禁用),默认即可
      deleteOriginFile: false, //删除源文件
      threshold: 1024, //压缩前最小文件大小
      algorithm: 'gzip', //压缩算法
      ext: '.gz' // 生成的压缩包后缀
    }),
    obfuscatorPlugin({
      include: ['src/*.js', 'src/utils/*.js'],
      exclude: [/node_modules/],
      apply: 'build',
      debugger: true,
      options: {
        debugProtection: true
      }
    })
  ],
  optimizeDeps: {
    include: ['vue', 'vuex', 'sass', 'vue-router'],
    exclude: ['fsevents']
  }
})

package.json

"scripts": {
    "dev": "vite",
    "build": "vite build",
    "build-dev": "vite build --mode dev",
 },

代码优化

为保险起见,上面的东西配置好了之后,本地启动检查没问题,打包放到测试也没问题,接下来开始进行配置优化。

vue.config.js、webpack、vue/cli-service、babel多余的插件和配置开始逐步删除和卸载

删了发现还是正常可以跑的,自己检查没啥问题,就放心发到测试环境交给测试了


打包优化

因为项目里需要进行深度混淆加密,一开始打包用的是vite自带的terser

//vite.config.js
build{
    minify: 'terser',
    terserOptions: {
      compress: {
        // 打包自动删除console
        drop_console: true,
        drop_debugger: true
      },
      keep_classnames: true
    },
}

但是打包时间过久,所以决定将terser改回esbuild,然后深度混淆加密采用的外部插件 vite-plugin-javascript-obfuscator

pnpm add vite-plugin-javascript-obfuscator -D

//vite.config.js
import obfuscatorPlugin from 'vite-plugin-javascript-obfuscator'
obfuscatorPlugin({
    include: ['src/*.js', 'src/utils/*.js'],
    exclude: [/node_modules/],
    apply: 'build',
    debugger: true,
    options: {
       debugProtection: true
    }
})

 块大小警告的限制(以 kbs 为单位)

chunkSizeWarningLimit: 1024, -----> chunkSizeWarningLimit: 10240,

效果: 打包时间由原来的48s左右变为10s左右,大的项目由2min 提速到了1min左右,当然如果不是内部项目,加上CDN,可以起飞了


vite打包和启动问题汇总

1、The JSX syntax extension is not currently enabled

The esbuild loader for this file is currently set to "js" but it must be set to "jsx"

to be able to parse JSX syntax. You can use "loader: { '.js': 'jsx' }" to do that.

如果是在.vue文件中带有jsx语法, 则在script标签下增加该标识

//.vue文件
<script lang="jsx">

2、/src/element-variables.scss Error: Can't find stylesheet to import.

// vite.config.js
css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/common.scss";`
      }
    }
  },

3、No matching export in "src/utils/dialogUtils.js" for import "loading"

dialogUtils.js 不存在loading,找到对应的.vue文件删除loading 引入

4、Internal server error: Unexpected token (1:0)  Uncaught ReferenceError: require is not defined

pnpm i @originjs/vite-plugin-commonjs -D
// vite.config.js
import { viteCommonjs } from '@originjs/vite-plugin-commonjs'
plugin:[
    viteCommonjs()
]

5、[vite] Internal server error: Can't find stylesheet to import.

@import '~element-ui/packages/theme-chalk/src/index';

删除 @import '~element-ui/packages/theme-chalk/src/index';

使用 import 'element-ui/lib/theme-chalk/index.css'

6、使用qrcodejs2生成二维码,报错:Cannot read properties of undefined (reading ‘_android‘)

pnpm add qrcodejs2-fix -D
import QRCode from 'qrcodejs2'; //remove
import QRCode from 'qrcodejs2-fix'; //add

7、开发环境el-table无法渲染的问题

一开始插件引入了vite-plugin-vue2 --->  <Vue2.7

后移除改成 @vitejs/plugin-vue2 --->  Vue2.7

pnpm add @vitejs/plugin-vue2 -D
//vite.config.js
import vue from '@vitejs/plugin-vue2'

plugins: [
    vue()
]

8、[ERROR] No loader is configured for ".node" files: node_modules/fsevents/fsevents.node

// vite.config.js
optimizeDeps: { exclude: ["fsevents"] },

9、import * as _vite_plugin_require_transform_get_intrinsic_0 from "get-intrinsic";

 var GetIntrinsic = _vite_plugin_require_transform_get_intrinsic_0.default || _vite_plugin_require_transform_get_intri...

import * as vite_plugin_require_transform./_1 from "./";

pnpm add vite-plugin-require-transform -D
// vite.config.js
import requireTransform from 'vite-plugin-require-transform'
requireTransform({
        fileRegex: /.vue$/
      })

10、第9个搞完后启动没问题、打包报错

pnpm remove vite-plugin-require-transform

pnpm add vite-plugin-require -D
import vitePluginRequire from 'vite-plugin-require';
plugins: [vitePluginRequire()],

11、启动打包到测试环境发现el-table不显示,本地没问题

alias: { vue: 'vue/dist/vue.esm.js' },

<think>嗯,用户想排查Vue项目依赖树中的问题,特别是@vue/cli-plugin-babel、@vue/cli-plugin-pwa和@vue/cli-service的版本冲突或潜在问题。首先,我需要回忆Vue CLI项目结构以及这些插件的兼容性。 首先,Vue CLI使用semver版本控制,主版本号需要一致。比如,如果@vue/cli-service是4.x,那么其他插件也应该用4.x。用户提到的三个插件都属于核心插件,版本必须与CLI服务一致。所以第一步应该检查package.json中这些插件的版本是否匹配。 接下来,用户可能需要运行npm ls或yarn list来查看依赖树,确认是否有不同版本的Vue CLI相关包。如果有,可能需要更新或降级某些包。比如,使用npm update命令更新到兼容版本,或者手动指定版本号安装。 另外,vue-cli-service的版本可能影响整个项目的构建,如果用户升级Vue CLI但没有更新插件,就会出问题。这时需要检查全局和本地的CLI版本是否一致,避免因为全局安装的旧版本导致本地项目使用错误版本。 还可能存在依赖冲突,比如其他第三方库依赖不同版本的babel或webpack,这时候需要查看警告信息,用npm install --force或yarn install --force覆盖,或者手动解决冲突。 用户提供的引用中提到了使用全局安装Vue CLI,所以需要确认项目本地是否安装了正确版本,避免全局和本地版本不一致的问题。比如,全局安装了最新版,但项目用的是旧版,这时候可能需要卸载全局的,或者在项目内重新安装。 另外,引用[4]提到了Jest配置,如果用户使用了测试相关的插件,可能也需要检查相关依赖是否兼容。不过用户的问题主要集中在babel、pwa和cli-service上,可能暂时不需要处理测试部分。 最后,建议用户检查Vue的官方文档,确保所有插件的版本符合要求,或者使用Vue UI可视化工具来管理依赖,这样更直观。如果问题依旧,可能需要清除node_modules和lock文件,重新安装依赖。</think>### Vue项目依赖树问题排查指南 #### 一、版本兼容性检查 1. **核心依赖关系** Vue CLI生态中`@vue/cli-service`是核心服务,`@vue/cli-plugin-*`插件必须与其主版本匹配。例如: $$ \text{@vue/cli-service@5.x} \Rightarrow \text{@vue/cli-plugin-babel@5.x} $$ 建议通过以下命令验证版本: ```bash npm list @vue/cli-service @vue/cli-plugin-babel @vue/cli-plugin-pwa ``` 2. **Vue CLI全局与本地版本冲突** 若全局安装的Vue CLI版本(如6.x)与项目本地版本(如5.x)不一致,可能导致依赖树混乱[^2]。可通过以下命令统一版本: ```bash npm uninstall -g @vue/cli # 卸载旧全局版本 npm install -g @vue/cli@5 # 安装指定版本 ``` #### 二、依赖树分析工具 1. **使用npm/yarn内置命令** ```bash npm ls --depth=5 # 显示依赖树前5层 yarn why @vue/cli-plugin-babel # 查看特定依赖来源 ``` 2. **可视化工具** 运行`vue ui`打开Vue项目管理器,通过图形界面查看依赖关系[^3]。 #### 三、常见冲突场景 | 冲突类型 | 表现示例 | 解决方案 | |---------|---------|---------| | **主版本不匹配** | `@vue/cli-service@5.0.8`与`@vue/cli-plugin-babel@4.5.19`共存 | 统一升级5.x版本:`npm update @vue/cli-plugin-babel@5` | | **子依赖冲突** | `webpack`版本被不同插件强制锁定(如PWA插件依赖旧版) | 使用`npm install --force`或调整插件版本 | | **全局污染** | 全局安装的`vue-cli`与本地`@vue/cli`混合使用 | 彻底卸载旧版`vue-cli`:`npm uninstall -g vue-cli` | #### 四、操作示例 ```bash # 分步更新依赖 npm install @vue/cli-service@5.0.8 --save-exact npm install @vue/cli-plugin-babel@5.0.8 --save-dev npm install @vue/cli-plugin-pwa@5.0.8 --save-dev # 清理后重新安装 rm -rf node_modules package-lock.json npm install ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值