Vue2.7.14、vuecli@5.0.8 升级 vite@4.4.8

2023-11-05

 项目背景

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' },

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue2.7.14、vuecli@5.0.8 升级 vite@4.4.8 的相关文章

随机推荐

  • [游戏开发][Shader]GLSLSandBox转Unity-CG语言

    官网 GLSL Sandbox Galleryhttps glslsandbox com 屏幕坐标计算 fragCoord与 ScreenParams mat2矩阵转换 vec2向量 在GLSL里mat2 a b c d 函数返回vec2
  • yolov3之数据集预处理

    目录 txt标签文件的说明 将jpg与txt文件分开 txt生成xml标签文件 xml标签详解 xml标签生成txt txt标签文件的说明 获取到的数据集是这样的 需要转换为VOC格式 其实就是将txt转换为xml文件 打开txt文件可以看
  • 在线代码编辑器:Monaco Editor

    monaco editor是微软开源的一款web版代码编辑器 它支持智能提示 代码高亮 代码格式化 Monaco Editor是为VS Code提供支持的代码编辑器 运行在浏览器环境中 编辑器提供代码提示 智能建议等功能 供开发人员远程更方
  • 2013年9月10日星期二(DEMO8_6矩阵)

    首先设置了2个矩阵 1 把所有的点存储为1 2矩阵 typedef struct MATRIX1X2 TYP float M 2 MATRIX1X2 MATRIX1X2 PTR M X Y 2把所有变换矩阵采用3 2矩阵 typedef s
  • 带你玩转kubernetes-k8s(第21篇:k8s-深入掌握Pod-初始化容器、Pod滚动升级)

    上节内容的错误 还请大家不要太在意 后面我们会解决的 理解Job的作用 概念就可以了 下面我们进入正题 Init Container 初始化容器 在很多应用场景中 应用在启动之前都需要进行如下初始化操作 等待其他关联组件正确运行 例如数据库
  • Gitbash 无法显示中文

    GitBash gt 右键 gt options gt 左侧text 设置locale zh cn 设置Character set GBK save gt apply GitBash输入 systeminfo看能否正常显示
  • 几种C/C++语言安全检测工具介绍

    转自新浪微博http www vckbase com index php wv 1635 针对C C 语言安全漏洞的分析检测也出现了大量的工具 按照不同的机理主要分为以下几类 如表所示 分析类型 机理 分析工具 备注 静态分析 预处理 Fo
  • ## Hive分区、桶、与倾斜

    Hive的分区 1 在Hive Select 查询中一般会扫描整个表内容 会消耗很多时间做没必要的工作 有时候查询 只需要扫描表中关心的一部分数据 因此建表时引入partition概念 2 分区表指的是在创建表时指定的partition的分
  • 数据库查询最近N天数据

    查询最近7天数据 1 查询最近7天订单金额 用到了虚表和UNION ALL的知识 其中 price是要查询的数据 orders是表名 IFNULL b price 0 是指b price如果值为空 则将空值设置为0 SELECT a cli
  • Java版手写数字(0~9)BP神经网络识别

    MNIST的样本集太无趣 连图片都看不到 也无法用人手进行输入 所以 基于BP神经网络的理论知识 参见数据挖掘黑书212页起 讲得甚好 纯手写了一版带训练和测试的小玩具 Java语言 效果如下 代码已上传github https githu
  • 多项式回归(非线性回归)的python代码实现

    1 概述 在解决回归问题中 很多数据集中输入空间与输出空间并非完全呈线性关系 使用线性回归无法解决此类问题 为了解决存在非线性关系的数据集的回归问题 需要进行多项式回归 但sklearn并未提供多项式回归模型的类 多项式回归使用的还是线性回
  • 字节的对齐方式

    VC对结构的存储的特殊处理确实提高CPU存储变量的速度 但是有时候也带来了一些麻烦 我们也屏蔽掉变量默认的对齐方式 自己可以设定变量的对齐方式 重要规则 1 复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储 第一个成员的地址和整个类型
  • 【k8s】k8s部署网络插件Calico、创建网络策略

    一 简介 01 calico简介 calico官网 flannel实现的是网络通信 calico的特性是在pod之间的隔离 通过BGP路由 但大规模端点的拓扑计算和收敛往往需要一定的时间和计算资源 纯三层的转发 中间没有任何的NAT和ove
  • String、StringBuffer与StringBuilder之间区别

    String StringBuffer StringBuilder String的值是不可变的 这就导致每次对String的操作都会生成新的String对象 不仅效率低下 而且浪费大量优先的内存空间 StringBuffer是可变类 和线程
  • Σ-Δ ADC的高精度数模转化,是如何实现的?

    以前接触过 ADC24位采样芯片 一直对其原理没有搞清楚 最近看到有对其原理讲解的文章 因此收集下来作为参考 我们在了解Delta Sigma ADC原理之前 先明确几个概念 1 量化噪声 下图中 蓝色斜线是连续的模拟信号 阶梯状波形是经过
  • Flask学习笔记_异步CMS(五)

    Flask学习笔记 异步CMS 五 1 环境 1 安装nvm 2 安装node 2 使用vue cli创建项目 3 安装相关插件 4 后台CMS开发 1 页面结构 1 app vue搭建结构 2 element icon组件的使用 3 ic
  • matlab rand randn 每次生成的随机数都一样的解决方案

    文章目录 问题说明 解决方案 例子 生成不重复的随机数 生成重复的随机数 结论 参考文献 问题说明 在Matlab应用中 我们经常需要用到随机数 比如rand randn 等函数 都是生成某一类随机数的函数 对于rand 函数来说 每一次启
  • HDR到底是什么?

    此文章转发自互联网 先感谢论坛好友 xiaoyuer520的耐心讲解及推荐这篇文章给我 我愿意分享给大家一起共同进步 谢谢 大家如果有像我一样的 看到文字多的帖子就看不下去 但又很想知道HDR是什么Dolby Vision和HDR10的区别
  • MySQL入门篇之Xtrabackup备份与恢复

    一 Xtrabackup介绍 MySQL冷备 mysqldump MySQL热拷贝都无法实现对数据库进行增量备份 在实际生产环境中增量备份是非常实用的 如果数据大于50G或100G 存储空间足够的情况下 可以每天进行完整备份 如果每天产生的
  • Vue2.7.14、vuecli@5.0.8 升级 vite@4.4.8

    项目背景 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