聊聊 webpack 打包如何压缩包文件大小

摘要:
很多人一定经历过打包项目的过程,发现一些文件非常大,这导致页面加载缓慢,这极大地影响了用户体验。所以在我完成了一些包装之后,我讨论了如何有效地减小包装大小并加快页面动态polyfill的第一屏幕配置。我相信许多项目都会使用polyfill,因此整个polyfill将占用大量空间。此时,我们需要使用动态polyfill来解决这个问题:引入˂scriptsrc=“https://

想必很多人都经历过做完一个项目后,再打包发现某些文件非常大,导致页面加载时很慢,这就很影响用户体验了,所以在我经历了一些打包后,讲讲如何有效地缩小包体积,加快页面的首屏渲染

动态 polyfill

相信很多项目都会用到polyfill 那么一整个polyfill 会占据很多的空间,这个时候需要使用动态polyfill来解决这个问题了:
index.html 文件中引入:
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
你可以打开 https://cdn.polyfill.io/v2/polyfill.min.js 在最新的浏览器中,会发现他并没有什么polyfill,而如果你开启移动端的模式,并且重新刷新页面的话,可以发现他又多了一些方法;
这个就是动态polyfill 他会根据浏览器标头来返回不同的polyfill
这里放下他的文档:
https://cdn.polyfill.io/v2/docs/

webpack 插件

使用过 vue-cli 创建的项目,应该都能看到,这些插件,在build/webpack.prod.conf.js文件中可以观察到这些插件,使用 react 项目的可以照着配,使用一下相同的插件;
使用哪些请自行酌情判断,我来简介一些主要插件的作用:

  • extract-text-webpack-plugin 用于将 CSS 从主应用程序中分离
  • optimize-css-assets-webpack-plugin 压缩提取出的css,解决extract-text-webpack-plugin CSS重复问题
  • CommonsChunkPlugin 将公共模块拆出来,最终合成的文件能够在最开始的时候加载一次,便存到缓存中供后续使用
  • uglifyjs-webpack-plugin 压缩js代码 需要说明的是可以在上面加上去除 console.log 的选项,也是可以有效减少包体积
  • ModuleConcatenationPlugin 作用域提升,对于压缩代码有一些效果,但不是很大

在这里附上所有插件的说明:
https://webpack.docschina.org/plugins/

先上我的项目里打包后的文件体积,该项目使用 vue-cli 构建:
聊聊 webpack 打包如何压缩包文件大小第1张

可以看到占体积最大的是 vendor.js 这个文件
这个项目所占的文件基本是所用的包的代码,如 vue ,vuex,vue-router,element-ui等文件的 js 代码

dll 插件

我在之前搜索压缩代码的博客时,经常也会看到 dll 插件能够压缩体积,但是经过实践证明,这个结论是错误的;
他的作用只是加快 run build 和 run dev 的速度,但是,相较于使用 cdn 加速,是一点优势都没有,下面来看

添加 dll 之后的文件大小:
聊聊 webpack 打包如何压缩包文件大小第2张

添加优化 js 代码后的文件大小:
聊聊 webpack 打包如何压缩包文件大小第3张

通过图片看到文件是压缩了,但是仍然还没有我正常情况下的文件小,也许是我优化的问题,但是再优化,最多也就是和正常情况差不多,仍然没有压缩体积的作用;

可以得出结论 DllPlugin 基本上是只用于开发环境的;

使用 cdn 加速

目前来说这是最好的一个方法了;
可以先使用 analys 分析一下, vendor 里最大占用的插件是什么,根据结果选择;
比如 我的项目中 element-UI 和 Vue 的 js 文件是占据第一和第二的大小的,所以需要将这2个文件使用 cdn 加速来替代;
需要注意的是使用 cdn 的文件不要太多,尽量不超过3个文件
可以使用免费的bootcdn 加速 http://www.bootcdn.cn/
方法很简单,在 index.html 里面添加 cdn 地址:

<body>
    <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
    <script src="https://cdn.bootcss.com/element-ui/2.3.7/index.js"></script>
    <div id="app"></div>
</body>

需要注意要将文件放在前面一点
build/webpack.base.conf.js 文件的module.exports里添加:

externals: {
    'vue': 'Vue',
    'element-ui': 'ELEMENT'
}, 

在 main.js和任何引用过Vue 文件的地方:删除 import Vue from 'vue',如果有一个没有删,那么打包时还会把文件引用的;
并且删除 import ElementUI from 'element-ui' 和 Vue.use(ElementUI)
如果添加了eslint 那么可能会报错 可以使用 const Vue = window.Vue来去除报错,
如果仍需要在 main.js 里使用 element 的话可以通过window.ELEMENT来引用;

这个地方我说错了,关于 Vue和 element 的 import 不用修改
但是要保证 externalsmain.js 中引入的是一样的

比如:

externals: {
    'element-ui': 'ELEMENT'
}, 

import ELEMENT from 'element-ui'

需要对应
前车之鉴,还望各位周知

打包后可以有效减小包体积:
聊聊 webpack 打包如何压缩包文件大小第4张

Gzip加速

这个方法的压缩代码能力是非常恐怖的,压缩率可达70%,不过需要了解的是需要服务器开启 gzip 加速才管用,我没使用这个方法,不排除他会对服务器会造成一定的压力;

总结

如果需要polyfill的话,可以使用动态polyfill来替代,如果服务器支持 Gzip 加速且不担心服务器压力的话,那么可以使用 Gzip 来加速,否则使用 cdn 加速主要文件的方法来压缩代码,当然首先你也需要添加 webpack 插件来优化 js 代码;

免责声明:文章转载自《聊聊 webpack 打包如何压缩包文件大小》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转贴]客户端不装adobe reader,打开pdf文件的插件树莓派开启crontab日志下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

appium-python-元素定位

appium继承了selenium的所有元素定位方式(web端),并有自己的元素定位方式 # iddriver.find_element_by_id("cn.TuHu.android:id/productslist_text") # classdriver.find_element_by_class_name("android.widget.TextVi...

docker环境中安装node、pm2,映射项目文件守护程序

1.docker安装完成后,获取对应版本,可自定义node版本,默认为最新版本。 git pull node:<version> 2.编写Dockerfile,在文件中添加安装pm2命令。建议新建一个单独docker的文件,文件中存放Dockerfile,否则在build镜像的时候会将整个目录下的文件都发送至docker。 FROM node...

前端框架Vue自学之Vue router(六)

终极目标:掌握和使用Vue(全家桶:Core+Vue-router+Vuex) 本博客目的:记录Vue学习的进度和心得(Vue router) 内容:学习和使用Vue router。 正文: Vue router 一、认识路由 1、路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动。 2、路由器提供了两种机制:路由和转送。路由是决定...

vue实现筛选功能,文字选中变色

1 <template> 2 <Poptip trigger="hover"title="Title"content="content"> 3 <i-button>Hover</i-button> 4 </Poptip> 5 <Poptip tri...

mybatis-plus

https://www.jianshu.com/p/12ec123d20e8 https://www.jianshu.com/p/5c9e6acf9a70 官方视频: https://mp.baomidou.com/guide/#%E6%A1%86%E6%9E%B6%E7%BB%93%E6%9E%84 mybatis-plus 时间字段比较 https:...

uirecorder的安装和使用

uirecorder安装: 安装node8.x版本,并安装执行下面两条命令安装uirecordernode下载地址:https://nodejs.org/en/download/npm install -g cnpm --registry=https://registry.npm.taobao.orgcnpm install uirecorder moch...