HTTP优化
gzip压缩
资源的压缩与合并
HTTP协定上的gzip编码是一种用来改良web应用程序性能的技术,web服务器和客户端(浏览器)必须独特反对gzip。
浏览器申请url,并在request header中设置属性accept-encoding:gzip。表明浏览器反对gzip。
该不该用 Gzip
压缩 Gzip,服务端要花工夫;解压 Gzip,浏览器要花工夫。两头节俭进去的传输工夫,真的那么可观吗?倡议较大文件进行gizp
webpack4中启动gzip压缩
npm i -D compression-webpack-pluginplugins: [ new CompressionPlugin({ filename: "[path].gz[query]", algorithm: "gzip", test: /\.js$|\.html$|\.css/, threshold: 10240, // 只解决比这个值大的资源。按字节计算 minRatio: 0.8 // 只有压缩率比这个值小的资源才会被解决 deleteOriginalAssets: false, //是否删除原资源 }),];
具体配置 CompressionWebpackPlugin
CDN减速
当初大部分云服务商都是提供cdn服务
简略的来说: 原服务器上数据复制到其余服务器上,用户拜访时,那台服务器近拜访到的就是那台服务器上的数据。
CDN减速长处是成本低,速度快。能够用CDN best的CDN进行减速,收费,可部署公有,私有CDN零碎。能够实现宕机检测,主动切换ip,分线路,分组解析。也就是CDN减速的次要作用就是保障网站的失常拜访,及放慢网站访问速度和响应速度,避免网站因黑客攻击,DNS解析劫持故障等导致的网站服务器的宕机情况的呈现。
图片(图标)方面
应用字体图标
举荐: Iconfont-阿里巴巴矢量图标库
雪碧图
将多个图标集成在一起
雪碧图制作起来麻烦,我还是举荐Iconfont的字体图标啦
图片应用Base64编码缩小页面申请数(倡议小图片)
Base64编码图片能够在浏览器本人显示进去
采纳Base64的编码方式将图片间接嵌入到网页中,而不是从内部载入,如<img src="data:image/gif;base64,/9j/2SDFG... >
,这样下载HTML文档的工夫就会增长了。在CSS背景图中也是能够这么做的
应用webpack解决图片成 base64
npm install --save-dev url-loader// webpack.config.jsmodule.exports = { module: { rules: [{ test: /\.(png|svg|jpg|gif|jpeg|ico|woff|woff2|eot|ttf|otf)$/, use: [{ loader: "url-loader", // 依据图片大小,把图片优化成base64 options: { limit: 10000, //小于10000字节的图片都进行base64操作 } } ] }] }};
webpack配置 JPG、PNG、GIF和SVG图像的压缩
// webpack.config.jsmodule.exports = { module: { rules: [ { loader: "image-webpack-loader", // 先进行图片优化 options: { mozjpeg: { progressive: true, quality: 65, }, optipng: { enabled: false, }, pngquant: { quality: "65-90", speed: 4, }, gifsicle: { interlaced: false, }, webp: { quality: 75, }, }, }, ], },};
html,css优化
<script>标签和<style>标签(看正文)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> /** * 放头部: 页面先解析<style>后失去css后解析html */ <style>...<style> /** * 放头部: 页面的解析在遇到js的时候须要运行完js之后能力持续 * 毛病:js一旦加载或者运算很久,会导致用户白屏 */ <script> for (let i=0; i < 1000000000000000; i++) { console.log("年轻人不讲码德! 你就缓缓等吧") } </script></head><body> <div id="container"></div> /** * 放尾部: 页面的解析结束开始加载js * 长处:用户无需期待js加载就能够看到界面 */ <script> var container = document.getElementById("container") console.log('container', container) // '<div id="container"></div>' </script></body> /** * 放尾部: 页面先解析html后失去解析css * 毛病:导致html节点进去没款式后才有 */ <style>...<style></html>
回流和重绘
须要浏览器渲染机制,该文章就不开展讲了
回流(重排)
回流又名重排,指几何属性需扭转的渲染。触发浏览器回流并从新生成渲染树。
重绘
重绘指更改外观属性而不影响几何属性的渲染。渲染树的节点产生扭转,然而不影响该节点的几何属性。
- 几何属性:包含布局、尺寸等可用数学几何掂量的属性
布局:display、float、position、list、table、flex、columns、grid尺寸:margin、padding、border、width、height
- 外观属性:包含界面、文字等可用状态向量形容的属性
界面:appearance、outline、background、mask、box-shadow、box-reflect、filter、opacity、clip文字:text、font、word
js优化
缩小 DOM 操作
- 缩小DOM 更改等操作
// badlet box = document.getElementById('box')box.innerHTML = '1'box.innerHTML += '2'box.innerHTML += '3'...// goodlet content = ''content = '1'content += '2'content += '3'box.innerHTML = content // 一次性插入
- DocumentFragment
不是实在 DOM 树,它的变动不会引起 DOM 树的从新渲染
let box = document.getElementById('box')let content = document.createDocumentFragment()let Fdiv = document.createElement('div')Fdiv.innerHTML = '1'Fdiv.innerHTML += '2'Fdiv.innerHTML += '3'content.appendChild(Fdiv)// 只产生一次dom操作box.appendChild(content)
图片懒加载
<li><img src="img/loading.gif" data-src="img/1.jpg"></li>
最开始每一个图片应用loading.gif,首屏加载的时候能够节俭多张图片申请
原理:滚动条设置到图片的时候加载data-src内的失常图片
具体实现能够看我之前发的文章实现图片懒加载
防抖和节流
防抖: 在肯定工夫内,只能触发一次
/** * @param {Function} func 要执行的回调函数 * @param {Number} wait 延时的工夫 * @param {Boolean} immediate 是否立刻执行 * @return null */let timer, flag;function throttle(func, wait = 500, immediate = true) { if (immediate) { if (!flag) { flag = true; // 如果是立刻执行,则在wait毫秒内开始时执行 typeof func === 'function' && func(); timer = setTimeout(() => { flag = false; }, wait); } } else { if (!flag) { flag = true // 如果是非立刻执行,则在wait毫秒内的完结处执行 timer = setTimeout(() => { flag = false typeof func === 'function' && func(); }, wait); } }};export default throttle
节流: 肯定工夫内,只有最初一次操作,再过wait毫秒后才执行函数
let timeout = null;/** * @param {Function} func 要执行的回调函数 * @param {Number} wait 延时的工夫 * @param {Boolean} immediate 是否立刻执行 * @return null */function debounce(func, wait = 500, immediate = false) { // 革除定时器 if (timeout !== null) clearTimeout(timeout); // 立刻执行,此类情况个别用不到 if (immediate) { var callNow = !timeout; timeout = setTimeout(function() { timeout = null; }, wait); if (callNow) typeof func === 'function' && func(); } else { // 设置定时器,当最初一次操作后,timeout不会再被革除,所以在延时wait毫秒后执行func回调办法 timeout = setTimeout(function() { typeof func === 'function' && func(); }, wait); }}export default debounce
webpack4优化(打包过大等优化)
webpack 设置cdn优化
vuecli生成的我的项目进行配置
运行yarn build 发现vendors.js之中蕴含vue,vuex, vue-router
当初咱们能够通过webpack的externals进行vue,vuex抽离掉应用cdn
# vue.config.jsmodule.exports = { configureWebpack:{ externals: { 'vue': 'Vue', 'vuex': 'Vuex' } }}# store/index.jsimport Vuex from "vuex";// Vue.use(Vuex); 正文掉
// index.html<body> <noscript> <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> </noscript> <div id="app"></div> <!-- built files will be auto injected --> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/vuex/3.1.3/vuex.min.js"></script> </body>
splitChunks(打包宰割)
运行yarn build 发现vendors.js之中还有vue-router须要拆散
能够利用webpack中的splitChunks宰割进去
splitChunks的配置挺简单的,须要大家本人学习,我只是提供一个计划
# vue.config.jsmodule.exports = { configureWebpack: { optimization: { splitChunks: { cacheGroups: { vendors: { test: /node_modules/, chunks: "initial", minChunks: 1, priority: -10, }, router: { name: 'chunk-router', test: /[\\/]node_modules[\\/]vue-router[\\/]/, chunks: "all", minChunks: 1, priority: -5, } }, }, }, },};
相干博文
玩转CSS的艺术之美