❤vue2项目webpack打包的优化策略

❤ vue2项目webpack打包的优化策略

(优化前)

现在我们的打包时间为:
在这里插入图片描述>打包体积大小为:
在这里插入图片描述

1、去除开发环境和生产环境提示以及日志

开发环境和生产环境的打印处理

生产环境去除console.log打印的两种方式

通过环境变量控制console.log的打印,具体操作如下:

第一种

1、根目录 .env.xxx文件中写入NODE_ENV参数
在这里插入图片描述

2、在main.js里面加上下列语句:

if (process.env.NODE_ENV === 'production') {
  console.log = () => {}
  console.warn = () => {}
}

以上完成了配置

第二种

在babel.config.js 文件中进行修改

1、需下载这个包transform-remove-console
```js
npm install babel-plugin-transform-remove-console --save-dev

2、在babel.config.js可如下写


// babel.config.js
// 生产环境移除console
const remPlugins = []
if (process.env.NODE_ENV === 'production') {
    remPlugins.push('transform-remove-console')
}
 
module.exports = {
  "plugins":[
  ...remPlugins 
  ]
};

根据当前的开发模式或打包模式来使用不同的入口文件

module.exports = {
  chainWebpack: config => {
    // 打包模式
    config.when(process.env.NODE_ENV === 'production', config => {
      config
        .entry('app')
        .clear()
        .add('./src/main-prod.js')
    })
    // 开发模式
    config.when(process.env.NODE_ENV === 'development', config => {
      config
        .entry('app')
        .clear()
        .add('./src/main-dev.js')
    })
  }
}

2、 build后不可查看源码

不设置的情况下,打包上线,可在 f12 -> sources -> webpack:// 下查看到项目源码

在这里插入图片描述
在vue.config.js中配置

const isProduction = process.env.NODE_ENV === 'production'
module.exports = {
	productionSourceMap: false,
	configureWebpack: {
		devtool: isProduction ? false : "source-map",
	}
}

3、解决每次发版都要强刷清除浏览器缓存

原理
将打包后的js和css文件,加上打包时的时间戳

1 index.html
在 public 目录下的index.html文件里添加如下代码

<meta http-equiv="pragram" content="no-cache">
<meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="expires" content="0">

vue.config.js

let timeStamp = new Date().getTime();
module.exports = {
    publicPath: "./",
    filenameHashing: false,
    // 打包配置
    configureWebpack: {
        output: { // 输出重构 打包编译后的js文件名称,添加时间戳.
            filename: `js/js[name].${timeStamp}.js`,
            chunkFilename: `js/chunk.[id].${timeStamp}.js`,
        }
    },
    css: {
        extract: { // 打包后css文件名称添加时间戳
            filename: `css/[name].${timeStamp}.css`,
            chunkFilename: `css/chunk.[id].${timeStamp}.css`,
        }
    }
};

4、配置Vue2项目打包优化命令行(Tree-shaking)

Tree-shaking 是一种通过静态分析代码来检测未使用部分的技术

(1)添加–report命令:“build”: “vue-cli-service build --report”,打包后 dist 目录会生成 report.html 文件,用来分析各文件的大小
在这里插入图片描述

打开以后如图所示
在这里插入图片描述

5、配置V2打包优化对比工具webpack-bundle-analyzer ((Tree-shaking))

webpack有一种可视化的打包分析工具:webpack-bundle-analyzer ,在vue.config.js中引入,代码如下:npm run build的时候会出现打包分析图

npm install webpack-bundle-analyzer -D
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
configureWebpack: {
        plugins: [
            new BundleAnalyzerPlugin()
        ]
    }        
}

6、externals 提取公共依赖包

在我打包之前项目体积如图
在这里插入图片描述
vue.config.js 中配置

configureWebpack: {
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    },
    externals: {
      vue: 'Vue',
      'vue-router': 'VueRouter',
      axios: 'axios',
      echarts: 'echarts'
    },
    // 打包插件
    // plugins: [newBundleAnalyzerPlugin],
  },

在 index.html 中使用 CDN 引入依赖


vue
<script type="text/javascript" src="https://lib.baomitu.com/vue/2.6.10/vue.min.js"></script>

vue-router
 <script type="text/javascript" src="https://lib.baomitu.com/vue-router/3.0.2/vue-router.min.js"></script>

axios   
 <script type="text/javascript" src="https://lib.baomitu.com/axios/0.18.1/axios.min.js"></script>

echarts
<script type="text/javascript" src="https://lib.baomitu.com/echarts/4.7.0/echarts.min.js"></script>

配置后如图
在这里插入图片描述

7、babel-plugin-component(未使用)

通过该插件,最终只引入指定组件和样式,来实现减少组件库体积大小

// 安装
npm install babel-plugin-component -D

babel.config.js中引入

plugins: [
    'component',
    {
      'libraryName': 'element-ui',
      'styleLibraryName': 'theme-chalk',
    }
  ],

8、使用 moment-locales-webpack-plugin插件,剔除掉无用的语言包

安装
npm install moment-locales-webpack-plugin -D

vue.config.js 中引入

constMomentLocalesPlugin = require( 'moment-locales-webpack-plugin');
module.exports = {
configureWebpack: {
	plugins: [
	newMomentLocalesPlugin({ localesToKeep: [ 'zh-cn']})
	]
}
}

9、HappyPack 多线程打包(提升打包速度)

由于运行在 Node.js 之上的 webpack 是单线程模型的,我们需要 webpack 能同一时间处理多个任务,发挥多核 CPU 电脑的威力

HappyPack就能实现多线程打包,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程,来提升打包速度

vue2

安装
npm install happypack -D

//vue.config.js中进行配置

//顶部引入
const HappyPack = require('happypack');
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
const os = require('os');

chainWebpack(config){
		config.plugin('happypack')
			.use(HappyPack)
			.tap(options=>{
				options[0]={
					id:'babel',
					loaders:['babel-loader?cacheDirectory=true'],
					threadPool: happyThreadPool
				}
				return options
			})
		const hRule = config.module.rule('js')
		hRule.test(/\.js$/)
			.include.add(resolve('src'))
			.end()
		hRule.uses.clear()
		hRule.use('happypack/loader?id=babel')
			.loader('happypack/loader?id=babel')
			.end()
}
安装
npm install happypack -D

vue.config.js 中引入

constHappyPack = require( 'happypack');
constos = require( 'os');
consthappyThreadPool = HappyPack.ThreadPool({ size: os.cpus.length });

10、Gzip压缩

安装
npm install compression-webpack-plugin -D

vue.config.js 中引入

// 引入
const CompressionPlugin = require( 'compression-webpack-plugin');
 

//使用
  configureWebpack: { 
    // 打包插件
    plugins:[
      new CompressionPlugin({
      test: /\.(js|css)(\?.*)?$/i, //需要压缩的文件正则
      threshold: 1024, //文件大小大于这个值时启用压缩
      deleteOriginalAssets: false//压缩后保留原文件
      })
    ],
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一张图读懂天然气气源

一张图读懂天然气气源

《pvz植物大战僵尸杂交版》V2.0.88整合包火爆全网,支持安卓、ios、电脑等!

今天来给大家安利一款让人欲罢不能的游戏——《植物大战僵尸杂交版》2.0.88版。这可不是普通的植物大战僵尸&#xff0c;它可是席卷了B站&#xff0c;火爆全网的存在&#xff01; 先说说这个版本&#xff0c;它可是网络上现存最全的植物大战僵尸杂交版整合包。里面不仅有修改工…

tkinter文本对齐方式

tkinter文本对齐方式 文本对齐方式效果代码 文本对齐方式 左对齐&#xff08;left&#xff09;&#xff1a;默认对齐方式&#xff0c;文本从左边界开始。右对齐&#xff08;right&#xff09;&#xff1a;文本从右边界开始。居中对齐&#xff08;center&#xff09;&#xff1…

NVIDIA MPS详解

NVIDIA 文章目录 NVIDIANVIDIA MPS介绍一、MPS作用二、MPS实例MPS与Hyper-Q区别Pascal架构和Volta架构不同架构上的MPS实现MPS基准测试MPS的使用MPS组成MPS执行过程开启与关闭MPS Volta MPS资源配置公平性MPS程序示例编写开启MPS脚本编写执行程序编写关闭MPS脚本运行MPS脚本运行…

linux部署运维3——centos7.9离线安装部署配置涛思taos2.6时序数据库TDengine以及java项目链接问题处理(二)

上一篇讲了centos7.9如何安装涛思taos2.6时序数据库的操作步骤和方案&#xff0c;本篇主要讲解taos数据库的初始化&#xff0c;相关配置说明&#xff0c;数据库和表的创建问题以及java项目连接问题。 centos7.9如何离线安装taos2.6&#xff0c;请点击下方链接详细查看&#xf…

新疆在线测宽仪配套软件实现的9大功能!

在线测宽仪可应用于各种热轧、冷轧板带材的宽度尺寸检测&#xff0c;材质不限&#xff0c;木质、钢制、铁质、金属、纸质、塑料、橡胶等都可以进行无损非接触式的检测&#xff0c;在各式各样的产线应用中&#xff0c;有些厂家&#xff0c;需要更加详尽完备的分析信息&#xff0…

离散化——Acwing.802区间和

离散化 定义 离散化可以简单理解为将连续的数值或数据转换为离散的、有限个不同的值或类别。离散化就是将一个可能具有无限多个取值或在一个较大范围内连续取值的变量&#xff0c;通过某种规则或方法&#xff0c;划分成若干个离散的区间或类别&#xff0c;并将原始数据映射到…

【Go】用 Go 原生以及 Gorm 读取 SQLCipher 加密数据库

本文档主要描述通过 https://github.com/mutecomm/go-sqlcipher 生成和读取 SQLCipher 加密数据库以及其中踩的一些坑 用 go 去生成读取 SQLCipher 数据库用 gorm 去读取 SQLCipher 数据库在生成后分别用 DBeaver、db browser 和 sqlcipher 读取 SQLCipher 数据库&#xff0c;…

基于jeecgboot-vue3的Flowable流程-流程处理(二)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 对应VForm3&#xff0c;原先的后端解析也要做调整 1、获取历史任务的表单信息 // 获取历史任务节点表单数据值List<HistoricVariableInstance> listHistoricVariableInstance his…

Python第二语言(十二、SQL入门和实战)

目录 1. Python中使用MySQL 1.1 pymysql第三方库使用MySQL 1.2 连接MySQL 1.3 操作数据库&#xff0c;创建表 1.4 执行查询数据库语句 2. python中MySQL的插入语句 2.1 commit提交 2.2 自动提交 3. pymysql案例 3.1 数据内容 3.2 DDL定义 3.3 实现步骤 3.4 文件操…

最小生成树kruskal算法详解

kruskal算法的思想简单来说就是&#xff1a;每次选择图中最小边权的边&#xff0c;如果边两端的顶点不在相同的连通块中&#xff0c;就把这条边加入到最小生成树中。 具体实现如下&#xff1a; 首先是边的定义&#xff0c;需要判断边的两个端点是否在不同的连通块中&#xff…

Vue前端ffmpeg压缩视频再上传(全网唯一公开真正实现)

1.Vue项目中安装插件ffmpeg 1.1 插件版本依赖配置 两个插件的版本 "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1"package.json 和 package-lock.json 都加入如下ffmpeg的版本配置&#xff1a; 1.2 把ffmpeg安装到项目依…

深入探究MySQL游标(Cursor)

前言 MySQL游标&#xff08;Cursor&#xff09;是MySQL中用于处理查询结果的一种机制。游标允许我们在查询结果集中逐行处理数据&#xff0c;而不是一次性获取所有数据。这对于处理大量数据非常有用&#xff0c;因为它可以减少内存消耗并提高性能。在MySQL中&#xff0c;游标主…

【源码】【Spring+SpringMVC+MyBatis】电子商城网上购物平台的设计与开发

学生成绩管理系统 系统功能开发环境开发技术前端技术后端技术 系统展示登录界面注册界面系统首页商品详情页下单界面付款界面购物车界面 源码获取↓↓↓↓&#xff1a; 源码可在后台私信联系博主或文末添加博主微信获取帮助 系统功能 登录、注册模块&#xff1a;如果用户第一次…

udp协议下的socket函数

目录 1.网络协议 2.网络字节序 3.socket编译接口 4.sockaddr结构体 5.模拟实现 1.socket函数 2.bind函数&#xff08;绑定&#xff09; 1.讲解 1.如何快速的将 整数ip<->字符串 2.ip地址的注意事项 3.端口号的注意事项 3.recvfrom函数 4.sendto函数 5.代码呈…

C++ Primer 第五版 第16章 模板与泛型编程

模板是C中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者说公式。当使用一个vector这样的泛型类型&#xff0c;或者find这样的泛型函数时&#xff0c;我们提供足够的信息&#xff0c;将蓝图转换为特定的类或函数。这种转换发生在编译时。 一、定义模板 1. 函数模板…

Airtest 使用指南

Airtest 介绍 准备工作 AirtestIDE 安装与启动: https://airtest.doc.io.netease.com/IDEdocs/getting_started/AirtestIDE_install/ 电脑端的准备工作完成后,对于手机端只需要打开允许USB调试,当首次运行时会提示安装PocoService,同意即可。 界面介绍

【CT】LeetCode手撕—53. 最大子数组和

目录 题目1-思路2- 实现⭐53. 最大子数组和——题解思路 3- ACM 实现 题目 原题连接&#xff1a;53. 最大子数组和 1-思路 动规五部曲 1. 定义 dp 数组 dp[i] 含义为&#xff1a;下标为 i 的数组的最大子数组和 2. 递推公式 因为所求的是最大子数组的和&#xff0c;即当前 n…

群辉其它远程访问方案(Cpolar篇)

目录 1、下载NAS套件安装包 2、手动安装 3、配置 4、访问 &#xff08;1&#xff09;网页 &#xff08;2&#xff09;手机管家 &#xff08;3&#xff09;助手 &#xff08;4&#xff09;DS File 群辉的远程访问&#xff0c;最标准的做法就是使用群辉自己的DDNS&#x…

飞腾派初体验(2)

水个字数&#xff0c;混个推广分&#xff0c;另外几个点还是想吐槽一下 - 1&#xff0c;上篇文章居然没有给开发板一个硬照&#xff0c;补上 - 飞腾派 自拍 2. 现在做镜像用Win32DiskImager的多吗&#xff1f;我记得当年都是dd命令搞定&#xff0c;玩树莓派的应该记得这个命令…