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

动态 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 构建:

可以看到占体积最大的是 vendor.js 这个文件

这个项目所占的文件基本是所用的包的代码,如 vue ,vuex,vue-router,element-ui等文件的 js 代码

dll 插件

我在之前搜索压缩代码的博客时,经常也会看到 dll 插件能够压缩体积,但是经过实践证明,这个结论是错误的;

他的作用只是加快 run build 和 run dev 的速度,但是,相较于使用 cdn 加速,是一点优势都没有,下面来看

添加 dll 之后的文件大小:

添加优化 js 代码后的文件大小:

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

可以得出结论 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'

需要对应

前车之鉴,还望各位周知

打包后可以有效减小包体积:

Gzip加速

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

总结

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

聊聊 webpack 打包如何压缩包文件大小的更多相关文章

  1. webpack打包性能优化

    1. 使用 gzip 压缩打包后的 js 文件 这个方法优化浏览器下载时的文件大小(打包后的文件大小没有改变) webpack.config.prod.js 中 var CompressionWebp ...

  2. webpack打包和gulp打包工具详细教程

    30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...

  3. dependencies、devDependencies、webpack打包 的区别与联系

    为什么要在dependencies.devDependencies中声明依赖? 答:保证任何人在(或者你自己在其他设备上)对这个项目进行修改(开发)时,通过npm install就能获取同样的开发环境 ...

  4. 前端项目模块化的实践2:使用 Webpack 打包基础设施代码

    以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...

  5. 浅析webpack打包输出内容

    当我们执行npm run bundle的时候输出了很多信息,那么这些信息都是什么意思呢 Hash: 221e7fd2e8bf82149df7 Version: webpack 4.30.0 Time: ...

  6. webpack打包学习

    从上图我们可以看出,webpack 可以将多种静态资源 js.css.sass文件等转换成一个静态文件,以此可以减少页面的请求,从而提高浏览器响应速度 1.安装开发依赖包 npm install we ...

  7. 使用webpack打包ThinkPHP的资源文件

    使用webpack打包ThinkPHP的资源文件 利用自己的空余时间一直在维护http://www.wx2share.com这个小网站,全是一个人在弄,由于只租得起虚拟空间,所以后台采用了简单方便的T ...

  8. 【原】使用webpack打包的后,公共请求路径的配置问题

    在我们公司,和后台接接口时,公共的请求路径我们是单独抽出来的,放在一个独立的public.js中,在public.js中存入那个公共变量 公共变量是这样 在其他地方使用ajax时,我们就这样使用 这种 ...

  9. Webpack打包进阶

    说在前面 由于使用了React直出,页面各项性能指标使人悦目.本篇将深入探讨目前PC部落所采用webpack打包优化策略,以及探讨PC部落并未使用的 webpack Code Splitting 代码 ...

随机推荐

  1. (C/C++学习)19.单目标遗传算法的C程序实现

    说明:在学习生活中,经常会遇到各种各样的最优问题,其中最常见的就是求某个多维(多个自变量)函数在各个自变量各取何值时的最大值或最小值:例如求函数 f(x) = (x-5)2+(y-6)2+(z-7)2 ...

  2. 剑指offer---圆圈中最后剩下的数

    题目:圆圈中最后剩下的数 要求:0,1,2...n-1 共n个数排成一个圆圈,从数字0开始,每次删除第m个元素,求这个圆圈里面剩下的最后一个元素 如 n=5, m=3 的情况:0, 1, 2, 3, ...

  3. 初识 MyBatis

    框架技术 使用框架构建项目,当确定使用哪个技术框架后,就已经有了一个 “半成品”,然后在这个半成品上填上内容,完成任务需求. 框架技术的优点: (1)不用再考虑公共问题,框架已经帮我们做好了. (2) ...

  4. buf.readInt16BE()

    buf.readInt16BE(offset[, noAssert]) buf.readInt16LE(offset[, noAssert]) offset {Number} 0 noAssert { ...

  5. average column data from multiple files

    example in file a, data is [1 , 2, 3; 4,5,6] file b, data is  [4,5, 6; 7,8,9] average=0.5 (a+b) matl ...

  6. PAT 1133 Splitting A Linked List

    Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...

  7. BNUOJ 33898 Cannon

    Cannon Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HDU. Original ID: 449 ...

  8. 个人常用git命令

    最近开始使用git,将自己常用git命令做一个简单归纳,便于记忆. 初始化及配置 git init:初始化资料库 git config --global user.name 'xxx':配置用户名 g ...

  9. 互斥的数(codevs 1553)

    题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知 ...

  10. linux安装java mysql tomcat 环境

    安装jdk: 1. 查看系统版本 uname -a 2.查看操作系统 cat  /proc/version 3.上传安装文件到指定目录   tar -zxvf jdkxxx. 4.修改配置文件  vi ...