Terser是一个JS的解析(Parser)、Mangleer(绞肉机)、Compresor(压缩机)的工具

绞肉机
如:一个函数 function functionsWithLongNames(){ } 名称很长,那么打包的文件占用的空间就相对大一些,如果经过工具来对代码进行转化,把函数的名称变成 function a(){} 或者function b(){} 这些较短名称的函数,那么他打包之后的文件占用的体积相对会比较少一些
以前称之为这个过程为丑化,现在变成了绞肉机

压缩机
知道TreeShaking的都知道有些dead code elimination(死代码删除)
如:if(false){console.log('123')}

Terser对JS文件进行解析,对代码进行丑化,压缩的工具集

早期我们是通过uglify-js来压缩、丑化JS代码,但是现在这个库已经不维护了,也不支持ES6以上的语法的

Terser是从uglify-es fork过来的,并且保留它原来的大部分API,以及适配uglify-es和uglify-js@3等;

因为Terser是一个独立的工具,所以我们可以单独安装、使用
  安装:npm i terser (默认安装了cli的工具)

  使用:npx terser [输入文件] -o [输出文件] [options]

Terser在webpack中配置

真实开发,我们不需要手动的通过terser来处理我们的代码,我们可以直接通过webpack来处理

  在webpack中有一个minimizer属性,在production模式下,默认就是使用TerserPlugin来处理我们的代码的

  如果我们对默认的配置不满意,也可以自己来创建TerserPlugin的示例,并且覆盖相关的配置

wepback5不需要下载terser-webpack-plugin直接引入

const TerserPlugin = require('terser-webpack-plugin');
  optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
// 使用多进程并行运行来提高构建速度。默认并发运行次数:。os.cpus().length - 1
parallel: true,
// 是否应将注释提取到单独的文件中
extractComments: false,
terserOptions: {
compress: {
arguments: true,
},
mangle: true,
toplevel: true,
keep_classnames: true,
keep_fnames: true,
},
}),
],
},

CSS的压缩

CSS压缩通常是去除无用的空格等(因为很难去修改选择器、属性的名称、值等)

css的压缩我们可以使用另外一个插件:css-minimizer-webpack-plugin

安装:

npm i css-minimizer-webpack-plugin -D

npm i postcss -D 不安装postcss会报错

使用:

const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin");

plugins:[
new CleanWebpackPlugin({}),
new MiniCssExtractPlugin({
filename: "css/[name].[contenthash:8].css",
}),
new CssMinimizerWebpackPlugin(),
],

Scope Hoisting

什么是ScopeHoisting(作用域提升)呢?

  scope Hoisting从webpack3开始增加的一个新功能
  功能实时对作用域进行提升,并且让webpack打包后的代码更小、运行更快

默认情况下webpack打包会有很多的函数作用域,包括一些(比如最外层的)IIFE

  无论是从最开始的代码运行,还是加载一个模块,都需要执行一系列的函数

  Scope Hoisting可以将函数合并到一个模块中来运行

使用Scope Hoisting非常的简单,默认这个插件就会启用

  在production模式下,默认这个模块就会启用

  在development模式下,我们需要自己来打开该模式

development模式下配置:

const webpack = require("webpack");

  plugins: [
new webpack.optimize.ModuleConcatenationPlugin(),
],

转化前:

(() => {
"use strict";
var e = {
"./src/math.js": /*!*********************!*\
!*** ./src/math.js ***!
\*********************/ (e, r, _) => {
function sum(e, r) {
return e + r;
}
function mul(e, r) {
return e * r;
}
_.r(r), _.d(r, { mul: () => mul, sum: () => sum });
},
},
r = {};
function __webpack_require__(_) {
var t = r[_];
if (void 0 !== t) return t.exports;
var u = (r[_] = { exports: {} });
return e[_](u, u.exports, __webpack_require__), u.exports;
}
(__webpack_require__.d = (e, r) => {
for (var _ in r)
__webpack_require__.o(r, _) &&
!__webpack_require__.o(e, _) &&
Object.defineProperty(e, _, { enumerable: !0, get: r[_] });
}),
(__webpack_require__.o = (e, r) =>
Object.prototype.hasOwnProperty.call(e, r)),
(__webpack_require__.r = (e) => {
"undefined" != typeof Symbol &&
Symbol.toStringTag &&
Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }),
Object.defineProperty(e, "__esModule", { value: !0 });
});
var _ = {};
(() => {
/*!*********************!*\
!*** ./src/main.js ***!
\*********************/
__webpack_require__.r(_);
var e = __webpack_require__(/*! ./math */ "./src/math.js");
console.log((0, e.sum)(20, 30));
})();
})();

转化后:

(() => {
"use strict";
var e = {
r: (e) => {
"undefined" != typeof Symbol &&
Symbol.toStringTag &&
Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }),
Object.defineProperty(e, "__esModule", { value: !0 });
},
};
/*!*********************************!*\
!*** ./src/main.js + 1 modules ***!
\*********************************/
e.r({}),
console.log(
(function sum(e, o) {
return e + o;
})(20, 30)
);
})();

注意事项:这个插件内部原理其实是依赖于esmodule的静态分析的
esmodule对模块进行解析时,会进行静态分析,在静态分析的时候,这个插件可以分析出来哪些代码可以做作用域提升

如果一个模块被多个模块所引入了不可能每个模块都复制一份代码,这个时候不做作用域提升了

推荐在开发过程中,推荐使用esmodule

如果你在项目中使用了第三方模块,那么第三方模块中可能使用esmodule或者commonjs,那么当我们使用import语句导入模块的时候它指向的是main字段指向的入口文件(package.json中的main属性指向的文件)
  我们可以进行配置:
  resolve.mainFields 4.1.3 优化 resolve.mainFields 配置 - 简书 (jianshu.com)

HTTP压缩

文件太小不会压缩,如果压缩了,返回到客户端还要解压反而影响效率

npm  i compression-webpack-plugin -D

minRatio: 0.8, //压缩比,对比源文件,只有压缩比能达到0.8的时候才压缩,没有达到0.8的时候就没必要压缩了

inline-chunk-webpack-plugin

当我们吧runtimeChunk设置为true的时候,运行时的文件会单独打包成一个文件,但是其中的代码量非常少,所以我们没有必要让他单独生成一个文件,直接让他嵌入到html中就可以了

npm i react-dev-utils -D

引入

const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
使用

plugin:[
new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime.*\.js/])
]

图片压缩

22_webpack_优化的更多相关文章

  1. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  2. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  3. 试试SQLSERVER2014的内存优化表

    试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...

  4. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  5. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  6. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  7. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  8. 【前端性能】高性能滚动 scroll 及页面渲染优化

    最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...

  9. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  10. 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题

    最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerP ...

随机推荐

  1. 线程基础知识17 Quene

    1 ConcurrentLinkedQueue 1.1 简介 它是一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素进行排序. 新的元素插入到队列的尾部,队列获取操作从队列 ...

  2. 实现简单的`Blazor`低代码

    本篇博客只实现基本的低代码,比如新增组件,动态修改组件参数 创建项目 首先创建一个空的Blazor Server,并且命名LowCode.Web 实现我们还需要引用一个Blazor组件库,由于作者用M ...

  3. 详解神经网络基础部件BN层

    摘要:在深度神经网络训练的过程中,由于网络中参数变化而引起网络中间层数据分布发生变化的这一过程被称为内部协变量偏移(Internal Covariate Shift),而 BN 可以解决这个问题. 本 ...

  4. ctfshow_web入门 文件包含 学习

    文件包含 额,这是一个做题带学习的一个笔记 算是半做题,半学习的笔记吧,所以能写的方法和注解都会写.难免先得啰嗦 由于截图都是白色背景,所以使用夜间模式(右上角哦~)观看比较易于区分图片与浏览器背景 ...

  5. [ARC107D] Number of Multisets

    \(\text{Solution}\) 学习到了一些 \(dp\) 的 \(trick\) 设 \(f_{i,j}\) 表示用了 \(i\) 的元素,当前和为 \(j\) 的方案数 \(dp\) 有两 ...

  6. LeetCode ● 216.组合总和III ● 17.电话号码的字母组合

    LeetCode 216.组合总和III 分析1.0 回溯问题 组合总和sum == n 时以及path中元素个数 == k 时,res.add(new path) 返回后递归删除掉当前值 class ...

  7. 3D模型在线查看工具

    3D场景工具推荐:NSDT场景编辑器. glTF Viewer 2.0是一个可以在线查看GLTF格式3D模型的,可以对模型进行显示设置.灯光设置来查看模型效果,除此之外还可以对模型进行性能分析和模型验 ...

  8. FTCL:Fine-grained Temporal Contrastive Learning for Weakly-supervised Temporal Action Localization概述

    1.针对的问题 现有的方法主要遵循于通过优化视频级分类目标来实现定位的方式,这些方法大多忽略了视频之间丰富的时序对比关系,因此在分类学习和分类-定位自适应的过程中面临着极大的模糊性.(1)在弱监督设置 ...

  9. thinkphp5框架使用总结

    因为采用了mvc模式,所以理解上为了简便,把控制中心作为一个浏览对象去处理,其他不要去考虑只把它们当做附属物 一.路径访问方式 http://网址/index.php/模块/控制器/操作.html 其 ...

  10. Python基础语法复习笔记(一):字符串

    python基础复习笔记 个人主页:JoJo的数据分析历险记 个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生 如果文章对你有帮助,欢迎关注.点赞.收藏.订阅专栏 本专栏主要 ...