vue2老项目vite升级改造过程记录

   2023-02-08 学习力0
核心提示:目录前言背景改造过程保留webpack的选项vite引入和配置vite-plugins引入require报错问题 配置完整配置结束总结前言Vite是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能

前言

Vite是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:

Vite 意在提供开箱即用的配置,同时它的 插件 APIJavaScript API 带来了高度的可扩展性,并有完整的类型支持。

vite包含如下特点:

  • 光速启动
  • 热模块替换
  • 按需编译

本次在开发环境增加vite的启动方式,提升开发效率,在生产环境保持原有模式。

背景

本次改造的工程是公司内一个很重要,迭代维护了3年的老项目,随着项目代码量的逐渐增加,项目启动速度的速度越来越慢,已经严重影响了开发效率,启动时间接近2分钟。

vue2老项目vite升级改造过程记录

该项目由@vue/cli 搭建的webpack模版,之前做过一次webpack3->的一次升级,现使用webpack4.x版本。

在搭建vite的过程中,理想状况是业务代码的0改动。

改造过程

保留webpack的选项

由于vite使用ES6 Module方式组织代码,index.html的导入方式不通,复制index.html->prod.html

并修改webpack HtmlWebpackPlugin插件的template(开发和生产配置会有不同,保留原有配置即可)

new HtmlWebpackPlugin({ template: 'prod.html', }),

vite引入和配置

安装

npm i vite --save-dev

并在根目录新建vite.config.js文件

import { defineConfig } from 'vite' 
import path from 'path' 
export default () => defineConfig({
      resolve: {
                extensions: ['.js', '.vue', '.json', '.less'],       
                alias: {
                              vue: 'vue/dist/vue.esm.js',            
                              '@': path.resolve(__dirname, 'src'),        
                       }
                },    
      server: {
                port: 8080, // vite默认是3000端口,保留原有的端口号
                proxy: {
                              '/api': { 
                                               target: 'http://baidu.com/',                
                                               changeOrigin: true,                
                                               rewrite: path => path.replace(/^\/api/, '')           
                                        } 
                               }    
                  } 
          })

添加 packge.json 中 scripts 命令,并改变原有的webpack命令

{  
  "scripts": { 
        "dev": "vite" , 
          "dev:w": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --profile"
       } 
    }

修改 index.html中的入口文件导入方式

配置完后我们就可以尝试运行vite了

命令行输入npm run dev

vue2老项目vite升级改造过程记录

运行后,我们可以看到很多报错,这么多错误信息如果手动修改的话,无疑是一项巨大的工程,而且这些改动没有任价值。针对vite 工程的改造,我们可以通过插件解决对应问题。

vite-plugins引入

虽然 vite 发展很快,npm 上面也陆陆续续有vite的插件更新,但是总有一些没有覆盖到的场景,官方的核心插件如下,我们的项目使用的是vue2版本的,所以用的是vite-plugin-vue2插件。

vue2老项目vite升级改造过程记录

// vite.config.js
import { createVuePlugin } from 'vite-plugin-vue2'

export default {
  plugins: [
    createVuePlugin({
        jsx: true,
    })
  ],
}

针对这个场景,使用的是自己写了一个插件vite-plugin-vue2-jsx,将需要修改的处理,全部由插件来进行转化

使用 vite-plugin-vue2-jsx 替换 vite-plugin-vue2 ,自动处理

// vite.config.js
import { createVuePlugin } from 'vite-plugin-vue2-jsx'

export default {
  plugins: [
    createVuePlugin({
        jsx: true,
    })
  ],
}

require报错问题 

这个问题vite是使用ESModule编译的,不支持CommonJs的原因,所以我们就需要将CommonJs 转换为ESModule。

项目中存在两种情况:

  • 图片require引用
<img class="logo" :src="require('./images/logo.png')"/>

 在npm上找了半天也没找到我需要的插件,针对这个场景,索性自己写了一个插件vite-plugin-image-require

// vite.config.js
import { imageRequirePlugin } from 'vite-plugin-image-require'

export default {
  plugins: [
    imageRequirePlugin()
  ],
}

 2. 枚举的引用

通过引入 vite-plugin-require-transform 插件来处理

npm i vite-plugin-require-transform --save-dev

配置

import requireTransform from 'vite-plugin-require-transform';

export default defineConfig({
  plugins: [
    requireTransform({fileRegex:/.js$|.vue$/}),
  ],
});

转换 @import ~ 别名

resolve: {
    alias: {
      '~': path.join(__dirname, 'node_modules'),
    }
  },

webpack的 process.env 的环境变量在项目中的使用导致的页面报错,无法加载

define: {
    'process.env': process.env
},

完整配置

import { defineConfig } from 'vite'
import { imageRequirePlugin } from 'vite-plugin-image-require'
import { createVuePlugin } from 'vite-plugin-vue2-jsx'
import requireTransform from 'vite-plugin-require-transform';
import path from 'path'

export default () => defineConfig({
    define: {
        'process.env': process.env
    },
    plugins: [
        createVuePlugin({
            jsx: true,
        }),
        requireTransform({
            fileRegex:/.js$|.vue$/
        }),
        imageRequirePlugin(),
    ],
    resolve: {
        extensions: ['.js', '.vue', '.json', '.less'],
        alias: {
            vue: 'vue/dist/vue.esm.js',
            '@': path.resolve(__dirname, 'src'),
            '~': path.join(__dirname, 'node_modules'),
        }
    },
    server: {
        port: 8080, // vite默认是3000端口,保留原有的端口号
        proxy: {
            '/api': {
                target: 'http://baidu.com/',
                changeOrigin: true,
                rewrite: path => path.replace(/^/api/, '')
            }
        }
    }
})

结束

# 使用vite启动服务
npm run dev

# 使用webpack启动服务
npm run dev:w

总结

原文地址:https://juejin.cn/post/7180249453734363197
 
标签: vue2 vite 升级
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 一分钟搭建Vue2.0+Webpack2.0多页面项目 vue we
    想要自己一步步搭建的比较麻烦,不是很推荐,最少也要使用vue-cli,在其基础上开始搭建,今天我的主题是一分钟搭建,那么常规方法肯定不能满足的,而我用的方法也很简单,就是使用已经配置完成的demo模板,很简单命令如下:git clone git@github.com:guxuelon
    03-08
  • 关于vue2使用element UI中Descriptions组件的遍历问题详解
    关于vue2使用element UI中Descriptions组件的
    目录需求描述:问题描述:导致原因:处理办法:以下为其他思考解决方式(不推荐)总结需求描述:展示信息时其中部门区域是未知数量的,需要通过遍历进行展示。如下图举例,其中地址和备注是一一对应关系,需遵循该样式。问题描述:起初我在el-descriptions中
    03-08
  • Vue2和Vue3中如何设置404界面
    这篇文章主要讲解了“Vue2和Vue3中如何设置404界面”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue2和Vue3中如何设置404界面”吧!一.vue21.index.js在此文件中,一般存放的都是我们的路由信息,我们
    03-08
  • vue2怎么实现带有阻尼下拉加载功能 vue实现下拉
    这篇“vue2怎么实现带有阻尼下拉加载功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue2怎么实现带有阻尼下拉加载功能”文章吧
    03-08
  • Vue2 中的数据劫持简写示例
    Vue2 中的数据劫持简写示例
    目录正文正文我们今天要编写的项目通过需要使用 Webpack 进行编译,package.json 相关依赖如下:{"scripts": {"dev": "webpack-dev-server","build:": "webpack"},"devDependencies": {"html-webpack-plugin": "^4.5.2","
    03-08
  • 用electron 打包发布集成vue2.0项目的操作过程
    用electron 打包发布集成vue2.0项目的操作过程
    手里有个老项目是基于element admin框架下的,之前写的时候没考虑到要打包成桌面端,后期需要打包成客户端,然后就开始了一些列版本操作,看着百度了都很简单,把electron 加入到自己项目中各种不兼容,升级版本,改代码各种百度,一个国庆假期就搞了这个事情
    03-08
  • vue2.x双向数据绑定原理解析 vue数据双向绑定原理 通俗易懂
    vue2.x双向数据绑定原理解析 vue数据双向绑定原
    目录前言一、index.html文件二、vue.js文件1.proxy代理发生了什么?2.observer监听数据3.订阅者Watcher4.订阅器Dep5.编译器Compiler三、文中用到的js基础1.reg.exec2.reg.test3.RegExp.$x4.startsWith四、源码前言双向数据绑定原理主要运用了发布订阅模式来实
    03-08
  • vue2实现directive自定义指令的封装与全局注册流程
    vue2实现directive自定义指令的封装与全局注册
    目录前言一、directive自定义指令介绍二、全局注册使用流程1.准备好我们需要的自定义指令2.开始在main中导入该文件完成注册功能3.完成了注册功能开始使用总结前言我们在使用vue框架的时候,指令基本能够覆盖我们平常的工作。可难免我们根据业务需求走总有的指
    03-08
  • 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack
    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个。写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我。最近用vue2 + webpack重新构建了下,代码量挺简洁的,逻辑
    02-08
  • Vue.js系列之项目搭建(vue2.0 + vue-cli + webpack )
    Vue.js系列之项目搭建(vue2.0 + vue-cli + web
    1、安装node node.js环境(npm包管理器)cnpmnpm的淘宝镜像从node.js官网下载并安装node,安装过程很简单,一路“下一步”就可以了(傻瓜式安装)。安装完成之后,打开cmd命令行工具,输入 node -v,如果出现相应的版本号,则说明安装成功。npm包管理器,是集
    02-08
点击排行