使用purifycss-webpack来实现Tree Shaking

本文主要讲解使用purifycss-webpack来实现css的Tree Shaking,Tree Shaking意思是摇树,即为将项目中没有用到的css代码或js代码过滤掉,不将其打包到文件中,本章知识结构:

  • 项目准备
  • 使用purifycss
  • 功能测试

项目准备

1、使用css-loader和style-loader
不了解的请先查看文章:https://blog.csdn.net/u010982507/article/details/81277151
2、使用extract-text-webpack-plugin
不了解的请先查看文章:https://blog.csdn.net/u010982507/article/details/81337529
3、使用postcss-cssnext
不了解的请先查看文章:https://blog.csdn.net/u010982507/article/details/81412335

使用purifycss

1、安装purify-css

npm install purify-css --save-dev

2、安装purifycss-webpack

npm install purifycss-webpack --save-dev

3、安装glob-all

// glob-all用于处理多路径文件,使用purifycss的时候要用到glob.sync方法。
npm install glob-all --save-dev

4、配置webpack.config.js

  • 引入purifycss-webpack和glob-all
var PurifyCss = require('purifycss-webpack');
var glob = require('glob-all');
  • 在plugins中配置
new PurifyCss({
    paths: glob.sync([ // 传入多文件路径
        path.resolve(__dirname, './*.html'), // 处理根目录下的html文件
        path.resolve(__dirname, './src/*.js') // 处理src目录下的js文件
    ])
})
  • 整个webpack.config.js的配置
var path = require("path");
var PostCss_CssNext = require('postcss-cssnext');
var ExtractTextWebpackPlugin = require('extract-text-webpack-plugin');
var PurifyCss = require('purifycss-webpack'); // 引入PurifyCss
var glob = require('glob-all');// 引入glob-all
module.exports = {
    entry: {
        index: "./src/index.js"
    },
    output: {
        path: path.resolve(__dirname, "dist"),
        publicPath: "dist/",
        filename: '[name].bundle.js',
        chunkFilename: "[name].bundle.js"
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ExtractTextWebpackPlugin.extract({ // 使用ExtractTextWebpackPlugin插件提取css
                    fallback: {// 这里表示不提取的时候,使用什么样的配置来处理css
                        loader: 'style-loader',
                        options: {
                            singleton: true // 表示将页面上的所有css都放到一个style标签内
                        }
                    },
                    use: [ // 提取的时候,继续用下面的方式处理
                        {
                            loader: 'css-loader',
                            options: {
                                minimize: true  // 开启压缩
                            }
                        },
                        {
                            loader: 'postcss-loader',
                            options: {
                                ident: 'postcss',  // 表示下面的插件是对postcss使用的
                                plugins: [
                                    PostCss_CssNext(), // 允许使用未来的css(包含AutoPrefixer功能)
                                ]
                            }
                        }
                    ]
                })
            }
        ]
    },
    plugins: [
        new ExtractTextWebpackPlugin({ // 将js中引入的css文件提取到[name].min.css文件中
            filename: '[name].min.css' // 配置提取出来的css名称
        }),
        new PurifyCss({
            paths: glob.sync([ // 传入多文件路径
                path.resolve(__dirname, './*.html'), // 处理根目录下的html文件
                path.resolve(__dirname, './src/*.js') // 处理src目录下的js文件
            ])
        })
    ]
}

功能测试

测试项目,不了解的请查看https://blog.csdn.net/u010982507/article/details/81412335
1、测试html中的tree shaking

  • 在index.html中创建几个div
<div class="box">

</div>
<div class="big-box">

</div>
  • 在base.css中添加样式
.box {
    transition: transform 1s;
    width: calc(100% - 100px);
    height: calc(100% / 2.2);
    background: black;
}

.big-box {
    width: 200px;
    height: 200px;
    background: blue;
}

.middle-box {
    width: 150px;
    height: 150px;
    background: white;
}

.small-box {
    width: 100px;
    height: 100px;
    background: orange;
}
  • 执行打包命令webpack
    因为在index.html中没有使用small-box和middle-box两个class,所以打包后的index.min.css中会过滤掉这两个class,不会打包进去。
    2、测试js中的tree shaking
  • 在index.js中创建新的div放到className为box的div下
import './css/base.css'
var box = document.getElementsByClassName('box')[0];
var middleBox = document.createElement('div');
middleBox.className = 'middle-box';
box.appendChild(middleBox);
  • 执行打包命令webpack
    查看index.min.css文件,发现打包文件已经包含middle-box,但是small-box没有用到,所以还是没有打包进去。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,882评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,208评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,746评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,666评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,477评论 6 407
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,960评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,047评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,200评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,726评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,617评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,807评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,327评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,049评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,425评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,674评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,432评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,769评论 2 372

推荐阅读更多精彩内容