性能优化: 资源合并与压缩 -- 压缩

之前有整理过一部分知识点, 一直没有发布, 因为都是有关 CSS 方面的零散内容; 现在想想无论做什么都需要慢慢积累, 所以还是决定将之前整理的相关内容验证之后慢慢分享给你们, 现在看到感觉还挺有意思 。

好了废话不多说, 直接上代码以及图例(为了让大家方便阅读, 都有自己验证过程的一些图片作为分享) 。

  1. 资源合并与压缩 -- 压缩: 概述
 1. 资源的合并与压缩涉及到的优化点:
    1. 减少 http 请求数量 。
    2. 减小请求资源的大小 。

 2. google 首页案例
    1. html 压缩
    2. css 压缩
    3. JS 的压缩与混乱
    4. 文件合并
    5. 开启 gzip

图片示例


M-1.png
  1. html 压缩:
 1. html 的简单介绍:
    1. html 本身是一种 超文本标记语言 。
    2. html 网页本身是一种 文本文件 。
    3. HTML 压缩就是压缩那些在文本文件中有意义, 但是在 html 中不显示的字符, 包括 空格/制表符/换行符 等, 还有一些其它有意义的字符, 如 html 注释 也可以被压缩 。
    
 2. 对于大型互联网来说, 每一个请求的减少, 都是一个非常大的优化 。
    1. 简述事实:
      1. 谷歌流量, 占整个互联网的 40% 。
      2. 2016 年全球网络流量会达到 1.3ZB (1ZB = 10的 9 次方 个 TB)
      3. 谷歌的流量就是 1.3ZB 40%
      4. 如果谷歌每 1M 请求减少 1 个字节, 每年可以减少流量近 500TB (假如 1GB 的流量是 1毛, 那也节省近 1亿 元)。
      
 3. html 如何进行压缩:
    1. 使用在线网站进行压缩 。
       1. 基本不会使用这种方法, 一般使用构建工具, 如 webpack / fs3 。
    2. nodeJS 提供了 html-minifile 工具 。
       2. 配置参数进行压缩 。
    3. 后端模板引擎渲染压缩 。

 4. webpack 对 html 文件的压缩与优化处理
    1. 使用 plugins 插件设置, 利用 html-webpack-plugins 方式进行设置
       1. 安装 html-webpack-plugins 插件在项目中
       2. 在 webpack.config.js 中进行设置, 如代码所示
              plugins:[
                new HtmlWebpackPlugin({ //生成 html 文件。
                  template:"./src/index.html",// 告诉模板的位置; 需要打包的 HTML 模板路径和文件名称
                  filename:"index.html"
                  // 是对 html 文件进行压缩, removeAttributeQuotes 是去掉属性的双引号;
                  minify:{
                    removeAttributeQuotes: true,  // 删除双引号,会智能识别, 不该删掉的双引号不会删掉 。
                    collapseWhitespace: true,     // 清除空格; 将所有代码文件生成一行
                    removeComments:true           // 删除注释
                    preserveLineBreaks:true       // html 文件正常显示 。
                  },
                  hash:true  // 打包时添加 hash; 为了开发中js有缓存效果, 加入hash, 可以有效避免js缓存 。
                })
              ]

代码示例


M-2.png
  1. css 代码压缩:
css 代码压缩:
    1. 无效代码删除
    2. css 语义合并

 1. css 压缩最直观的是去除了 回车/空格

 2. css 压缩主要做了两件事情:
    1. 无效代码的删除: 对一些代码来说, 无效的代码可能是 注释/无效字符 。
    2. css 语义合并: 我们写的代码可能有些 语义重复, 需要进行语义合并 。

 3. css 压缩的具体方法:
    1. 使用在线网站进行压缩 。
    2. 使用 html-minifile 对 html 中的 css 进行压缩 。
    3. 使用 clean-css 对 css 进行压缩 。

 4. 使用 webpack 实现 css 打包、压缩、分离、去重、优化处理
    1. 使用插件:
       1. mini-css-extract-plugin: 主要用于提取 css
       2. optimize-css-assets-webpack-plugin: 主要用于 压缩、去重
       3. extract-text-webpack-plugin: 提取 css 代码
    2. 插件引入:
       1. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
       2. const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'
    3. 配置loader:
module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    {
                        loader: 'postcss-loader',
                        options: {
                            plugins: [
                                require('postcss-import')(),
                                require('autoprefixer')({
                                    browsers: ['last 30 versions', "> 2%", "Firefox >= 10", "ie 6-11"]
                                })
                            ]
                        }
                    }
                ]
            }
     ]
}
new MiniCssExtractPlugin({
    filename: 'assets/css/[name].[hash:5].css', // filename 与output中的filename 命名方式一样
    // chunkFilename: "assets/css/[name].[hash:5].css", // 这里是将多个css合并成单一css文件, 所以 chunkFilename 不用处理
}),
    4. 优化样式文件, 去重、压缩 等处理
       1. 主要使用 optimize-css-assets-webpack-plugin 插件和 cssnano 优化器
plugins:[
        new OptimizeCSSAssetsPlugin({
        assetNameRegExp: /\.css$/g,
        cssProcessor: require('cssnano'), // 处理器:默认就是cssnano
        // cssProcessorOptions: cssnanoOptions, // cssProcessorOptions和cssProcessorPluginOptions 都是指定 cssProcessor 所需的参数,经本人实验cssProcessorOptions 没起作用,所以只需要指定 cssProcessorPluginOptions 即可
        cssProcessorPluginOptions: {
            preset: ['default', {
                discardComments: { // 对注释的处理
                    removeAll: true,
                },
                normalizeUnicode: false // 建议设置为false,否则在使用 unicode-range 的时候会产生乱码
            }]
        },
        canPrint: true // 是否打印处理过程中的日志
    })
]

  1. JS 压缩与混乱
JS 压缩与混乱
    1. 无效字符的删除
    2. 剔除注释
    3. 代码语义的缩减与优化
    4. 代码保护

 1. 如何进行 JS 的压缩与混乱
    1. 使用在线网站进行压缩 。
    2. 使用 html-minifile 对 html 中的  JS 进行压缩 。
    3. 使用 uglifyjs2 对 JS 进行压缩 。

 2. webpack 实现
    1. uglifyjs-webpack-plugin
    2. 代码示例
const UglifyJsPlugin  = require('uglifyjs-webpack-plugin')

module.exports = {
   plugins: [
        new UglifyJsPlugin(),
    ]
}

  1. 代码压缩收益的对比
 1. css与JS 代码压缩的收益是比 html 代码压缩的收益大很多; 

 2. 因为 css与JS 的代码量是远远大于 html 的代码量的; 

 3. 还有 JS 压缩会对我们的产品起到一个保护的作用 。

如果对你有所帮助,希望大家喜欢点个关注;整理知识点不易, 每次都是在工作繁忙之余夜深人静之时整理, 每次整理时都在思考如何让大家更容易理解, 更容易找到、看到自己想看到的内容; 无论知识点是大是小, 我都会验证后再分享, 以防自己发表的文章给大家造成误导。如有问题还望不吝赐教,本人会及时更改 (本文原创, 如需转载,请注明出处) 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容