首页 > 其他分享 >实战笔记:Vue2项目Webpack 3升级到Webpack 4的实操指南

实战笔记:Vue2项目Webpack 3升级到Webpack 4的实操指南

时间:2024-09-27 10:51:54浏览次数:10  
标签:extract webpack js 升级 Webpack 实操 Vue2 loader true

在Web开发领域,保持技术的更新是非常重要的。随着前端构建工具的快速发展,Webpack已经更新到5.x版本,如果你正在使用Vue2项目,并且还在使用Webpack 3,那么是时候考虑升级一下Webpack了。我最近将我的Vue2项目从Webpack 3升级到了Webpack 4。以下是我升级过程中积累的经验和步骤,希望能帮助那些准备进行类似升级的开发者。

写在前面

为什么不直接升级到webpack5.x?

这个问题问得很好,我最开始也是直接一键升级到最新版,一启动,直接报各种版本不匹配(哭),由于项目比较大引入的依赖太多,实在是难以推进,所以退而求其次,先升级到webpack4.x,后面再想办法往上升!!!

升级前的准备

在进行任何重大的项目改动之前,备份总是第一位的。请首先确保你的项目已经被推送到Git仓库,这样即使升级失败,也能轻松回退到之前的版本。

升级开始

我原本的webpack版本是^3.6.0,本次升级为:^4.46.0

我本次升级涉及到的文件目录如下:

1、更新package.json中Webpack和相关依赖 

以下是我本次升级新增以及更新的依赖版本:

依赖原版本升级后版本类型
babel-polyfill     --^6.26.0新增
babel-plugin-transform-es2015-modules-commonjs--^6.26.2新增
html-webpack-plugin^2.30.1^4.3.0升级
mini-css-extract-plugin--0.9.0新增
vue-loader^13.3.0^15.7.0升级
webpack^3.6.0^4.46.0升级
webpack-cli--3.3.12新增
webpack-dev-server^2.11.5^3.11.1升级

2、安装依赖

npm install 

如果由于项目中其他依赖冲突产生的报错及安装失败,可以加上--legacy-peer-deps

 

npm install --legacy-peer-deps

3、 逐步修改Webpack配置

.babelrc文件:
// 修改前
{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-vue-jsx", "transform-runtime"]
}


// 修改后
{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-vue-jsx", "transform-runtime","transform-es2015-modules-commonjs"]
}
build/utils.js文件:
// 删除或注释以下代码
const ExtractTextPlugin = require('extract-text-webpack-plugin')

// 改为
const MiniCssExtractPlugin = require('mini-css-extract-plugin')

// 删除或注释以下代码
  if (options.extract) {
      return ExtractTextPlugin.extract({
        use: loaders,
        fallback: 'vue-style-loader',
        // https://www.cnblogs.com/luosiding/p/8268837.html
        publicPath: '../../'
      })
    } else {
      return ['vue-style-loader'].concat(loaders)
    }

// 改为
return [options.extract ? MiniCssExtractPlugin.loader : 'vue-style-loader'].concat(loaders)
build/webpack.base.conf.js文件:
// 删除或注释以下代码
const vueLoaderConfig = require('./vue-loader.conf')
// 改为
const { VueLoaderPlugin } = require('vue-loader')


// module.exports中:
entry: {
    app: './src/main.js'
  },
// 改为:
 entry: {
    app: ['babel-polyfill', './src/main.js']
  },


// 新增:
mode:process.env.NODE_ENV,
 plugins: [
    new VueLoaderPlugin()
  ],


// 删掉options
  module: {
    rules: [
      //...(config.dev.useEslint ? [createLintingRule()] : []),
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig //删除该条
      },
 build/webpack.dev.conf.js文件:

如果项目中使用了jquery才改:

 plugins: [
...,
 new webpack.ProvidePlugin({
      $: 'jquery'
    })
]
  build/webpack.prod.conf.js文件:
// 删掉或注释以下代码
const ExtractTextPlugin = require('extract-text-webpack-plugin')
// 改为
const MiniCssExtractPlugin = require('mini-css-extract-plugin')


// 删掉或注释以下代码
 new UglifyJsPlugin({
      uglifyOptions: {
        compress: {
          warnings: false
        }
      },
      sourceMap: config.build.productionSourceMap,
      parallel: true
    }),
 new ExtractTextPlugin({
      filename: utils.assetsPath('css/[name].[contenthash].css'),
      // Setting the following option to `false` will not extract CSS from codesplit chunks.
      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
      allChunks: true,
    }),

// 改为:
 new MiniCssExtractPlugin({
      filename: utils.assetsPath('css/[name].[contenthash].css'),
      ignoreOrder: true
    }),


// 删掉或注释以下代码:
 chunksSortMode: 'dependency'
// 改为:
chunksSortMode: 'none'


// 删掉或注释以下代码:
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      minChunks (module) {
        // any required modules inside node_modules are extracted to vendor
        return (
          module.resource &&
          /\.js$/.test(module.resource) &&
          module.resource.indexOf(
            path.join(__dirname, '../node_modules')
          ) === 0
        )
      }
    }),
    // extract webpack runtime and module manifest to its own file in order to
    // prevent vendor hash from being updated whenever app bundle is updated
    new webpack.optimize.CommonsChunkPlugin({
      name: 'manifest',
      minChunks: Infinity
    }),
    // This instance extracts shared chunks from code splitted chunks and bundles them
    // in a separate chunk, similar to the vendor chunk
    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
    new webpack.optimize.CommonsChunkPlugin({
      name: 'app',
      async: 'vendor-async',
      children: true,
      minChunks: 3
    }),

// 改为:
 optimization: {
    minimizer: [
      new UglifyJsPlugin({
        parallel: true, // 开启多进程压缩。
        uglifyOptions: {
          output: { comments: false },
          compress: {
            warnings: false,
            drop_debugger: true, // 是否清除debugger
            drop_console: true // 是否清除所有console
            // pure_funcs: ['console.log','console.info','console.warn','console.debug']     
            //drop_console 设置false,需要特殊清除的
          }
        },
        sourceMap: config.build.productionSourceMap
      })
    ],
    splitChunks: {
      chunks: 'async',
      minSize: 30000, // 大于30KB才单独分离成chunk
      maxAsyncRequests: 5,
      maxInitialRequests: 3,
      name: true,
      cacheGroups: {
        default: {
          priority: -20,
          reuseExistingChunk: true
        },
        // 生成 vendors.js,
        vendors: {
          name: 'vendors',
          test: /[\\/]node_modules[\\/]/,
          priority: 10,
          chunks: 'all'
          // enforce: true
        },
        common: {
          name: 'common',
          chunks: 'all',
          minChunks: 2,
          minSize: 0,
          maxInitialRequests: 5 // The default limit is too small to showcase the effect
        }
      }
    },
    // 生成 manifest.js
    runtimeChunk: {
      name: 'manifest'
    }
  }

总结 

如果改完可以正常启动,那么恭喜你!升级成功了!!如果不幸失败了,那么。。。很抱歉没有给你提供有效的帮助(哭),你也可以留言或私信,我看看有没有遇到类似报错。希望我的经验能帮助你在升级Vue2项目到Webpack 4的过程中少走弯路!

标签:extract,webpack,js,升级,Webpack,实操,Vue2,loader,true
From: https://blog.csdn.net/Jiaberrr/article/details/142586400

相关文章

  • 前端使用webpack本地实现编译时出现错误[cached] 1 asset ERROR in main Module not
    一:概述Webpack是一个现代JavaScript应用程序的静态模块打包工具。它主要用于将JavaScript代码、CSS、图片等资源模块化管理,并最终打包成一个或多个文件,方便在浏览器中使用。以下是对Webpack的详细介绍:主要特点模块化:Webpack支持ES6模块、CommonJS和AMD模块,能够将各种......
  • Linux-基础实操篇-时间日期类
    date指令-显示当前日期基本语法date(功能描述:显示当前时间)date+%Y(功能描述:显示当前年份)date+%m(功能描述:显示当前月份)date+%d(功能描述:显示当前是哪一天)date"+%Y-%m-%d%H:%M:%S"(功能描述:显示年月日时分秒)应用实例案例1:显示当前时间信息date案例......
  • VUE2 使用 el-upload 实现单文件上传、删除、预览(上传后隐藏上传图片按钮)
    实现后效果展示:上传前:上传后:注意点:on-change事件不要与on-success事件同时使用Demo:<template><div><el-uploadlist-type="picture-card"accept="image/*":file-list="fileList":action="uploadIma......
  • 实操三步把知识库接到智能硬件上
    前言大模型作为一个语言模型,实际上没有真正的记忆功能。所谓的对话记忆只是开发者将对话历史向GPT发送消息时将最近的对话历史通过提示工程组发送给ChatGPT。换句话说,如果对话历史超过了大模型的最大上下文,GPT会忘记之前的部分,这是大语言模型共有的局限性。另外对专业领域知识的训......
  • 都2024了!AI绘画赚钱的机会多如牛毛!普通人可轻松上手实操!
    AI绘画的赚钱机会真的是太多了,多如牛毛!很多做自媒体的朋友觉得AI绘画可能最赚钱的还是卖教程,卖课程,这种想法是很浅薄的。教人赚钱确实可以赚不少钱,但是教人成功赚到钱的概率是很低的,一个好的项目如果有5-10%的学员可以做出成绩,那么这个副业赚钱导师就算是很牛逼了,付费买......
  • vue2-打包分片
    //看这里:把chunk-vendors.js进行分包,提升资源加载速度,很有必要  optimization:{   /**    *runtimeChunk可选值有:true或'multiple'或'single'    *true或'multiple'会有每个入口对应的chunk。不过一般情况下    *考虑到要模块初始化,设......
  • 关于在vue2中自定义右键弹窗
            所需变量//右键点击的弹框对象rightDialogbox:null,//鼠标点击后获取的文本chooseText:'',//弹窗的偏移left:'',top:'',//右键点击的弹框显隐rightDialogShow:false,一、阻止原生事件......
  • webpack 多个css文件合并成一个
    在Webpack中,将多个CSS文件合并成一个文件通常涉及到使用MiniCssExtractPlugin插件。以下是如何配置Webpack以实现这一目标的步骤:安装必要的插件:首先,你需要安装mini-css-extract-plugin,它用于将CSS提取到单独的文件中。npminstall--save-devmini-css-extract-plugin......
  • Vue2+3基础
    。第一个Vue程序使用script进行Vue全局设置: 指定Vue实例挂载的位置,Vue和js一样,都需要在script里写第一步创建vue实例1.为什么要newvue(),直接调用Vue不行吗?不行,因为如果直接调用Vue()会报如下错误: 2.关于vue构造函数:optionsoptions翻译为多个选项Vue框架要求这......
  • 【智能流体力学 1/3理论课程2/3实操课程】深度学习技术在流体力学中的应用与实操培训
    智能流体力学及其仿真技术应用实战前沿背景在当今科学技术快速发展的背景下,流体力学和计算流体力学(CFD)正经历着深刻的变革。传统的流体仿真技术已无法满足日益复杂和高精度的工程需求,而深度学习和人工智能技术的飞速进步,为流体力学的研究和应用提供了新的解决方案。以下是......