webpack 中压缩代码

2023-11-03

阅读《深入浅出的webpack》——压缩代码

一、为什么要压缩代码?

浏览器通过服务器访问网页时获取的JavaScript、CSS资源都是文本形式的,文件越大,网页加载的时间越长。对这些资源进行压缩:

1) 可以提升网页加载速度和减少网络传输流量

2) 还有混淆源码的作用。由于压缩后的代码可读性非常差,所以就算别人下载了网页的代码,也很难进行代码的分析和改造。

方式:除了可以通过GZIP算法对文件进行压缩,还可以对文本本身进行压缩。

二、如何在webpack中压缩代码?

压缩代码:压缩JS、压缩ES6、压缩CSS

1.压缩JavaScript :

1)需要通过插件的形式在webpack中接入UglifyJS。

目前有两个成熟的插件:

UglifyJsPlugin: 通过封装UglifyJS实现压缩

ParallelUglifyPlugin: 多进程并进行处理压缩

2)如何配置UglifyJS以达到最优的压缩效果?

常用配置选项:

sourceMap: 是否为压缩后的代码生成对应的Source Map,默认为不生成,开启后耗时会大大增加。一般不会将压缩后的代码的

Source Map 发送给网站用户的浏览器,而是在内部开发人员调试线上代码时使用。

beautify: 是否输出可读性较强的代码,即会保留空格和制表符,默认输出,为了达到更好的压缩效果,可以设置为false.

comments: 是否保留代码中的注释,默认为保留,为了达到更好的压缩效果,可以设置为false。

compress.warnings: 是否在UglifyJS删除没有用到的代码时输出警告信息,默认为输出,可以设置为false以关闭这些作用不大的警告。

drop_console.log: 是否删除代码中的所有console.log语句,默认为不删除。开启后不仅可以提升代码压缩的效果,也可以兼容不支持

console语句的IE浏览器

collapse_vars: 是否内嵌虽然已定义了但是只用到一次的变量,例如var x = 5;y=x;转换成y=5,默认不转换。为了达到更好的压缩效果,可

以设置为false。

reduce_vars: 是否提取出现了多次但是没有定义成变量去引用的静态值,例如将 x = 'hello';y = 'hello'转换成vars a = 'hello'; x = a; y = b,默

认为不转换。为了达到更好的压缩效果,可以设置为false。

上代码,在不影响代码正确执行的前提下,最优化的压缩配置,如下:

const UglifyJsPlugin = require("uglifyjs-webpack-plugin");

module.exports ={

  plugin: [

    //压缩输出的Javascript代码

    new UglifyJsPlugin({

      compress:{

        // 在UglifyJS删除没有用到的代码时不输出警告

        warnings: false,

        // 删除所有`console`语句,可以兼容IE浏览器

        drop_console: true,

        // 内嵌已定义但是只用到一次的变量

        collapse_vars: true,

        // 提取出现了多次但是没有定义成变量去引用的静态值

        reduce_vars: true,

      },

      output: {

        // 最紧凑的输出

        beautify: false,

        // 删除所有注释

        comments: false,

      }

    })

  ]

}

2. 压缩ES6 :

1)运行ES6的代码相对于转换后的ES5代码的有点:

a. 对于一样的逻辑,用ES6实现的代码量比ES5更少

b. JavaScript引擎对于ES6中的语法做了性能优化,例如针对const声明的变量有更快的读取速度。

注:所以在运行环境允许的情况下,我们要尽可能地使用原生的ES6代码去运行,而不是使用转换后的ES5代码。

2)压缩ES6代码,需要使用专门针对ES6的UglifyES

注:UglifyES与UglifyJS来自一个项目的不同分支,它们的配置项基本相同,只是接入Webpack时有所区别。在为Webpack接入UglifyES时,

不能使用内置的UglifyJsPlugin,而是需要单独安装和使用最新版本的uglifyjs-webpack-plugin。】

安装方法:

npm i -D uglifyjs-webpack-plugin@beta

Webpack相关配置的代码如下:

const UglifyJsPlugin = require("uglifyjs-webpack-plugin");

module.exports ={

  // 压缩ES6

     plugins: [

       new UglifyJsPlugin({

         //多嵌套了一层

         uglifyOptions:{

          compress:{

            // 在UglifyJS删除没有用到的代码时不输出警告

            warnings: false,

            // 删除所有`console`语句,可以兼容IE浏览器

            drop_console: true,

            // 内嵌已定义但是只用到一次的变量

            collapse_vars: true,

            // 提取出现了多次但是没有定义成变量去引用的静态值

            reduce_vars: true,

          },

          output: {

            // 最紧凑的输出

            beautify: false,

            // 删除所有注释

            comments: false,

          }

         }

       })

     ]

}

注:同时,为了不让babel-loader输出ES5语法的代码,需要去掉 . babelrc 配置文件中的babel-preset-env,但还是要保留其他babel插件如,babel-preset-react,因为正是babel-prese-env负责将ES6代码转换为ES5代码。】

3、 压缩CSS

【目前比较成熟、可靠的CSS压缩工具是cssnano,基于PostCSS。】

cssnano接入webpack中也非常简单,因为css-loader已经将cssnano内置了,要开启cssnano去压缩代码,

只需开启css-loader的minimize选项

webpack相关配置如下:

const path = require('path')

const { WepPlugin } = reuqire('web-webpack-plugin')     // 生成对应的HTML文件

const ExtractTextPlugin = require('extract-text-webpack-plugin');  // 提取Chunk中的CSS代码到单独的文件中

const HtmlWebpackPlugin = require("html-webpack-plugin");  // 找到(提取)HTML,并输出HTML

module.exports ={

    module: {

      rules: [

        {

          //增加对css文件的支持

          test: /\.css/,

          // 提取Chunk中的CSS代码到单独的文件中

          use:ExtractTextPlugin.extract({

            // 通过minimize选项压缩CSS代码

            use: ['css-loader?minimize']

          }),

        }

      ]

    },

    plugins: [

      // 用WebPlugin生成对应的HTML文件

      new HtmlWebpackPlugin({

       // HTML模板文件所在的文件路径

        template: './template.html', 

         // 输出的HTML的文件名称

        filename: 'index.html'

      }),

      new ExtractTextPlugin({

        // 为输出的CSS文件名称加上Hash值

        filename: `[name]_[contenthash:8].css`,

      }),

    ]

}

 

三、总结:

const path = require('path')

// const { WepPlugin } = reuqire('web-webpack-plugin')

const ExtractTextPlugin = require('extract-text-webpack-plugin');

const HtmlWebpackPlugin = require("html-webpack-plugin");

const UglifyJsPlugin = require("uglifyjs-webpack-plugin");

module.exports ={

  // 压缩CSS

  module: {

    rules: [

      {

        test: /\.css/,//增加对css文件的支持

        // 提取Chunk中的CSS代码到单独的文件中

        use:ExtractTextPlugin.extract({

          // 通过minimize选项压缩CSS代码

          use: ['css-loader?minimize']

        }),

      }

    ]

  },

  plugin: [

    // 压缩CSS

    new HtmlWebpackPlugin({    // 用WebPlugin生成对应的HTML文件

      template: './template.html', // HTML模板文件所在的文件路径

      filename: 'index.html' // 输出的HTML的文件名称

    }),

    new ExtractTextPlugin({

      // 为输出的CSS文件名称加上Hash值

      filename: `[name]_[contenthash:8].css`,

    }),

    // 压缩JS

    //压缩输出的Javascript代码

    new UglifyJsPlugin({

      compress:{

        // 在UglifyJS删除没有用到的代码时不输出警告

        warnings: false,

        // 删除所有`console`语句,可以兼容IE浏览器

        drop_console: true,

        // 内嵌已定义但是只用到一次的变量

        collapse_vars: true,

        // 提取出现了多次但是没有定义成变量去引用的静态值

        reduce_vars: true,

      },

      output: {

        // 最紧凑的输出

        beautify: false,

        // 删除所有注释

        comments: false,

      }

    }),

    // 压缩ES6

    new UglifyJsPlugin({

      //多嵌套了一层

      uglifyOptions:{

       compress:{

         // 在UglifyJS删除没有用到的代码时不输出警告

         warnings: false,

         // 删除所有`console`语句,可以兼容IE浏览器

         drop_console: true,

         // 内嵌已定义但是只用到一次的变量

         collapse_vars: true,

         // 提取出现了多次但是没有定义成变量去引用的静态值

         reduce_vars: true,

       },

       output: {

         // 最紧凑的输出

         beautify: false,

         // 删除所有注释

         comments: false,

       }

      }

    })

  ]

}

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack 中压缩代码 的相关文章

随机推荐

  • Latex使用笔记

    Latex使用笔记 笔者最近开始使用latex编辑文档 此处记录一下latex的使用过程中一些值得记录的点 Latex安装 latex安装网上教程很多 笔者参考TeX Live2018 latex安装教程安装成功 未安装图形化界面 late
  • python 时间转换 指定字符串时间转时间戳

    指定年月日时分秒的表达方式 time strftime Y m d H M S 字符串转时间戳 tss1 2019 08 27 timeArray time strptime tss1 Y m d 转为时间戳 timeStamp int t
  • 通用文字识别 本地OCR接口 json数据 任意语言 不限次调用 exe服务工具免搭建部署启动即用

    解决没有网络得环境下图片转文字 本地OCR 也可以云端自己搭建服务 稳定 不限调用次数 附送两个百度飞桨得ONNX识别模型 一个简单 一个复杂 在这里插入图片描述 样本识别效果 使用方法 启动本地OCR接口服务 图片文件 gt base64
  • 【一文搞定Svelte】超详细的Svelte保姆级上手教程!

    目录 Svelte框架是什么 Svelte使用 一 项目搭建 1 SvelteKit搭建 2 Vite搭建 二 svelte组件 1 组件构成 2 组件引用 三 语法 1 包裹js表达式 2 on 事件绑定 3 响应 4 逻辑块 5 组件属
  • js - 关于部分浏览器内置函数console详解(用开发调试的利器)

    原文地址 http blog csdn net icewizardry article details 17265195 Firebug是网页开发的利器 能够极大地提升工作效率 但是 它不太容易上手 我曾经翻译过一篇 Firebug入门指南
  • 云服务器ubuntu修改密码,云服务器ubuntu修改密码

    云服务器ubuntu修改密码 内容精选 换一换 当云服务器密码即将过期 密码泄露或首次登录时 首次登录云服务器建议您修改初始密码 您可以参考本节操作在操作系统内部修改云服务器密码 优先推荐您参考在控制台重置云服务器密码 在控制台重置实例的登
  • nvm安装注意事项

    目录 1 下载地址 2 设置淘宝镜像 3 附录 1 下载地址 Releases coreybutler nvm windows GitHub 尽量下载最新版本的nvm 以免出现升级高版本node时 npm无法使用的情况 2 设置淘宝镜像 在
  • linux僵尸进程

    什么是僵尸进程 Zombie Process 僵尸进程是指一个已经终止 但是其父进程尚未对其进行善后处理获取终止进程的有关信息的进程 这个进程被称为 僵尸进程 zombie 怎样产生僵尸进程 一个进程在调用exit命令结束自己的生命的时候
  • XSS漏洞的与标签的那些个事~

    XSS漏洞的与标签的那些个事 0x00 div 0x01 textarea 0x02 input 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0
  • 使用随机森林进行特征选择

    绘制随机森林每棵树的决策边界 首先导入必要的库函数 from sklearn ensemble import RandomForestClassifier from sklearn datasets import make moons fr
  • 简易职工管理系统

    简易职工管理系统 问题描述 设计思路 代码部分 总结 样例 问题描述 1 问题描述 对单位的职工进行管理 包括插入 删除 查找 排序等功能 2 要求 职工对象包括姓名 性别 出生年月 工作年月 学历 职务 住址 电话等信息 1 新增一名职工
  • java 反转链表、合并链表

    第一个问题 反转链表 1 题目描述 输入一个链表 反转链表后 输出新链表的表头 2 解题思路 定义三个指针 第一个指针指向当前正在处理的节点 第二个指针指向当前处理节点的下一个节点 该指针是为了保证正常的遍历完顺序链表的所有节点 第三个指针
  • SQLServer创建用户登录

    创建用户登录注意事项 密码是区分大小写的 只有创建SQL Server登录时 才支持对密码预先进行哈希运算 如果指定MUST CHANGE 则CHECK EXPIRATION和 CHECK POLICY必须设置为 ON 否则 该语句将失败
  • 硬件问题总结

    STM32最小系统 F103 1 STM32最小系统 1 1 供电 3 3V 通常使用ASM1117进行5V转3 3V 注意 给单片机供电时要加0 1uf滤波电容 电容要尽可能靠近单片机 1 2外部晶振电路 一般使用外部8M晶振来作为STM
  • C++访问类中私有成员变量的方法

    原则上 C 类中私有变量不允许在类之外的其他任何地方访问 一般来说功能完善的类都会提供get set方法来操作类属性值 还有就是就是通过友元访问 但是 但如果没有get set方法都没有提供 也没有定义友元 比如使用的是第三方提供的 o 或
  • 华为OD机试(B卷)

    华为OD机试 B卷 有幸接到了华为OD的机试邀请 三道算法题 比较幸运的是 最后一题 也相对来说不算太难 没有抽到动态规划 还是花了大约90分钟 三道题都通过了 最终拿到了满分 第一题第二题都相对来说比较基础 由于平时也没有刷题的习惯 用自
  • Using MySQL Enterprise Backup Tools

    本文主要介绍MySQL Enterprise Backup的安装以及使用 1 安装 从官方网站下载MySQL Enterprise Backup安装包 推荐下载rpm软件包 root mydb01 rpm qpl meb 4 1 1 el7
  • Uncaught (in promise) DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL

    解决方案 url前面一定要加http
  • Python版的BS期权定价模型和希腊值分析

    我比较懒 主要是打理自己的github的更新 是关于量化投资 机器学习策略相关的项目 https github com Neural Finance 这次更新一个我在学习期权定价过程中 Black Scholes Model 和相关的希腊值
  • webpack 中压缩代码

    阅读 深入浅出的webpack 压缩代码 一 为什么要压缩代码 浏览器通过服务器访问网页时获取的JavaScript CSS资源都是文本形式的 文件越大 网页加载的时间越长 对这些资源进行压缩 1 可以提升网页加载速度和减少网络传输流量 2