《Webpack5 核心原理与应用实践》学习笔记-> webpack代码压缩

简介: 《Webpack5 核心原理与应用实践》学习笔记-> webpack代码压缩


代码压缩是在不改变代码功能的情况下,尽可能的减少代码体积的过程,在 web 场景下可以有效减少网络传输流量,降低网络时延,提升页面启动速度的一种应用优化方案。


代码压缩原理



代码压缩旨意用最小的代码量实现原有的功能,代码量指的就是代码的字符数,其实它并没有多么神奇,举一个最简单的一个就是注释。


注释对于代码运行没有任何用处,我定义一个变量,写了一个注释,结果注释的字符数量比代码字符的数量都多:


// 这是一个啥啥啥的标识,用来干啥啥啥的
const flag = false;

这里注释有21个字符,代码有19个字符,如果我删掉注释,这就是对代码进行压缩了,说的好听一点就是减少的字符超过50%


当然这不够,进一步压缩,const???我使用let好像也OK吧,flag这么长有啥用,我一个计算机需要它这么长吗,直接变成f=前后还有空格?干掉,false直接用数字0代替,分号还是要的,压缩完毕,19变成8,算上之前的注释,减少的字符高达80%


let f=0;

上面这些只是代码压缩的冰山一角,代码压缩的代码是给机器执行的,不再是给人看的,所以不会在乎可读性,甚至可能会丢失一部分性能,当然这里的性能一般是忽略不计的,来达到节省代码字符的目的。


使用 TerserWebpackPlugin 压缩 JS


首先webpack已经内置了terser,使用这个玩意也很简单,第一种就是将mode属性值设置为productionwebpack在生产环境下,默认optimization.minimize值为true,第二种就是将刚说到的这个属性值手动设置为true,如下:


module.exports = {
    mode: "production",
    optimization: {
        minimize: true
    }
}

不过webpack还提供了一个属性optimization.minimizer,能让你手动使用其他代码压缩插件,我们这里就使用TerserWebpackPlugin


  1. 安装npm i -D terser-webpack-plugin
  2. 配置:


const TerserWebpackPlugin = require('terser-webpack-plugin')
module.exports = {
    optimization: {
        minimize: true,
        minimizer: [
            new TerserWebpackPlugin()
        ]
    }
}

optimization.minimizer属性值必须是一个数组,数组项可以为[TerserPlugin][function (compiler)],或者'...' 来访问默认值,参考:optimization.inimizer


TerserWebpackPlugin初始化时可以传一些配置项来帮助你实现细粒度更高的代码压缩配置,下面的配置表是搬运,参见TerserWebpackPlugin


选项名 类型 默认值 说明
test String|RegExp|Array<String|RegExp> /\.m?js(\?.*)?$/i 用来匹配需要压缩的文件。
include 同上 undefined 匹配参与压缩的文件。
exclude 同上 undefined 匹配不需要压缩的文件。
parallel Boolean|Number true 匹配不需要压缩的文件。
parallel Boolean|Number true Number: 使用多进程并发运行以提高构建速度。 并发运行的默认数量: os.cpus().length - 1Boolean: 启用/禁用多进程并发运行功能。
minify Function TerserPlugin.terserMinify 允许你自定义压缩函数。 默认情况下,插件使用terser库。 对于使用和测试未发布的版本或 fork 的代码很帮助。
terserOptions Object terser默认 terser配置项
extractComments Boolean|String|RegExp|Function<(node, comment) -> Boolean|Object>|Object true 是否将注释剥离到单独的文件中


使用 CssMinimizerWebpackPlugin 压缩 CSS


css压缩的规则也差不多是删除注释,属性简写,如色彩值为#ffffff简写就是#fff,长度为0可不带单位,例如0%0px0em等都简写为0,属性合并,例如margin: 10px 10px合并为margin: 10px等等等很多,就不一一列举了。


webpack不认识css文件,所以没有内置的对css文件压缩的工具,这里使用的css-minimizer-webpack-plugin


  1. 安装:npm i -D css-minimizer-webpack-plugin
  2. 配置:


const path = require('path');
const CssMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
    mode: "development",
    entry: './main.js',
    output: {
        path: path.resolve(__dirname, './dist'),
        filename: "[name].js"
    },
    module: {
        rules: [
            {
                test: /.css$/,
                use: [ MiniCssExtractPlugin.loader, 'css-loader']
            }
        ]
    },
    optimization: {
        minimize: true,
        minimizer: [
            '...', // Webpack5 之后,约定使用 `'...'` 字面量保留默认 `minimizer` 配置
            new CssMinimizerWebpackPlugin(),
        ]
    },
    plugins: [
        // 需要使用 mini-css-extract-plugin 生成单独的css文件才能启用压缩
        new MiniCssExtractPlugin()
    ]
}

  1. 一定是要有单独的css文件才能压缩,所以需要是用mini-css-extract-plugin来配合。
  2. minimizer如果不配置'...'那么会覆盖默认的配置,导致js无法被压缩。


使用 HtmlMinifierTerser 压缩 HTML


现在web开发场景下被ReactVueMVVM框架支配,已经不再怎么使用html了,使用html也只是一个节点挂载的作用(<div id="app"></div>)。


那么html的压缩点在什么地方呢?例如<div [这里是空格,很多个] id="app"></div>,然后就成这样了<div id="app"></div>,还有<br></br>变成<br>,还有其他自闭合标签等等等。


这里使用到的插件是html-minifier-terser


  1. 安装依赖:npm i -D html-minifier-terser
  2. 配置:


const HtmlWebpackPlugin = require("html-webpack-plugin");
const HtmlMinimizerPlugin = require("html-minimizer-webpack-plugin");
module.exports = {
    optimization: {
        minimize: true,
        minimizer: [
            '...',
            new HtmlMinimizerPlugin()
        ]
    },
    plugins: [
        new MiniCssExtractPlugin(),
        new HtmlWebpackPlugin({
            template: "./index.html"
        })
    ]
}

我新建了一个index.html,内容如下:


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Webpack App</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
</head>
<body>
<!-- 这是注释 -->
<div     class="abc"></div>
<input />
<br></br>
</body>
</html>

其实这里对html的压缩效果并没有那么显著,因为很多默认配置都是关闭状态,咱这一点点东西其实看不出来什么,只知道是被压缩了,不过也够用了。

总结


代码压缩主要是用于线上环境,减少代码体积,保持原有的功能不发生改变,原理并不复杂,社区有很多现成的工具,这里的插件都是带webpack的,也是被官方支持的,还有很多其他的压缩工具,效率各异,我们使用官方的就直接接入就好了,方便又简洁,瑞思拜。


目录
相关文章
|
1月前
|
JavaScript 前端开发 UED
如何配置 Webpack 进行代码分离?
通过以上方法,可以有效地配置Webpack进行代码分离,根据项目的具体需求和场景选择合适的方式,能够显著提高应用的性能和用户体验。在实际应用中,还可以结合其他优化技术,进一步优化Webpack的打包结果和应用的加载速度。
46 5
|
1月前
|
缓存 JavaScript 前端开发
配置 Webpack 进行代码分离的常见方法有哪些?
通过以上常见方法,可以根据项目的具体需求和场景,灵活地配置Webpack进行代码分离,从而提高应用的性能和加载速度,优化用户体验。
33 3
|
1月前
|
监控 前端开发 JavaScript
Webpack 中 HMR 插件的工作原理
【10月更文挑战第23天】可以进一步深入探讨 HMR 工作原理的具体细节、不同场景下的应用案例,以及与其他相关技术的结合应用等方面的内容。通过全面、系统地了解 HMR 插件的工作原理,能够更好地利用这一功能,为项目的成功开发提供有力保障。同时,要不断关注技术的发展动态,以便及时掌握最新的 HMR 技术和最佳实践。
|
1月前
|
缓存 前端开发 JavaScript
Webpack 动态加载的原理
【10月更文挑战第23天】Webpack 动态加载通过巧妙的机制和策略,实现了模块的按需加载和高效运行,提升了应用程序的性能和用户体验。同时,它也为前端开发提供了更大的灵活性和可扩展性,适应了不断变化的业务需求和技术发展。
|
1月前
|
缓存 前端开发 JavaScript
Webpack 4 和 Webpack 5 区别?
【10月更文挑战第23天】随着时间的推移,Webpack 可能会继续发展和演进,未来的版本可能会带来更多的新特性和改进。保持对技术发展的关注和学习,将有助于我们更好地应对不断变化的前端开发环境。
|
1月前
|
缓存 前端开发 JavaScript
webpack 原理
【10月更文挑战第23天】Webpack 原理是一个复杂但又非常重要的体系。它通过模块解析、依赖管理、加载器和插件的协作,实现了对各种模块的高效打包和处理,为现代前端项目的开发和部署提供了强大的支持。同时,通过代码分割、按需加载、热模块替换等功能,提升了应用程序的性能和用户体验。随着前端技术的不断发展,Webpack 也在不断演进和完善,以适应不断变化的需求和挑战。
|
2月前
|
缓存 前端开发 JavaScript
Webpack 打包的基本原理
【10月更文挑战第5天】
|
3月前
|
前端开发 JavaScript UED
除了 Webpack,还有哪些工具可以进行代码分割?
除了 Webpack,还有哪些工具可以进行代码分割?
|
3月前
|
JavaScript 前端开发
手写一个简易bundler打包工具带你了解Webpack原理
该文章通过手写一个简易的打包工具bundler,帮助读者理解Webpack的工作原理,包括模块解析、依赖关系构建、转换源代码以及生成最终输出文件的整个流程。
|
3月前
|
UED
如何通过 Webpack 实现代码分割?
如何通过 Webpack 实现代码分割?
111 0