前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >三款快速删除未使用CSS代码的工具

三款快速删除未使用CSS代码的工具

作者头像
奋飛
发布于 2023-08-13 02:25:07
发布于 2023-08-13 02:25:07
1.2K04
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:4
代码可运行

针对历史项目或项目中有引入CSS框架(如Bootstrap),可能会存在大量的 CSS 样式未被使用。这可能产生一些不良的影响,如:

  • 性能问题: 未使用的CSS会增加页面的加载时间,因为浏览器需要下载并解析这些不必要的样式表。这会导致页面加载速度变慢,影响用户体验,尤其是在低网络速度或较弱的设备上。
  • 影响加载速度: 未使用的CSS会增加样式表的文件大小,从而占用更多的带宽和存储空间。这对于移动设备用户或网络流量有限的用户来说可能是一个问题。
  • 可维护性下降: 当项目中存在大量无用的冗余样式时,代码库的整体可读性和可维护性都会下降。开发人员可能会在不确定哪些样式正在使用的情况下进行更改,这可能导致样式冲突和不一致。

如何解决呢?推荐三款工具,可根据项目情况进行选型:

PurgeCSS

PurgeCSS 通过分析你的内容和 CSS 文件,首先它将 CSS 文件中使用的选择器与内容文件中的选择器进行匹配,然后它会从 CSS 中删除未使用的选择器,从而生成更小的 CSS 文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack
const path = require('path')
const glob = require('glob')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const PurgecssPlugin = require('purgecss-webpack-plugin')

const PATHS = {
  src: path.join(__dirname, 'src')
}

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.join(__dirname, 'dist')
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.css$/,
          chunks: 'all',
          enforce: true
        }
      }
    }
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader"
        ]
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
    }),
    new PurgecssPlugin({
      paths: glob.sync(`${PATHS.src}/**/*`,  { nodir: true }),
    }),
  ]
}

UnCSS

UnCSS 的工作方式如下:

  • 由 jsdom 加载 HTML 文件并执行 JavaScript 代码。
  • PostCSS 解析所有样式表
  • 通过 document.querySelector 筛选出 HTML 文件中未找到的选择器。
  • 将其余的样式规则转换回 CSS 代码。

由于其能够模拟 HTML 和 JavaScript 的执行,UnCSS 可以有效地从 web 应用程序中删除未使用的选择器。

但是,其模拟行为可能会在性能和实用性方面带来成本消耗。例如,要从 Pug 模板文件中删除未使用的 CSS,你需要将 Pug 转换为 HTML 并在 jsdom 中模拟页面。完成此步骤后,UnCSS 可以在每个选择器上运行 document.querySelector 并执行步骤 4。

目前,在删除未使用的 CSS 方面,UnCSS 在某些情况下可能是最准确的工具。如果你不使用服务器端渲染(server-side rendering),并且网站上只有简单的 HTML 和 javascript的话,则它应该可以正常工作,并且在 CSS 文件大小方面要优于 PurgeCSS。

PurgeCSS 针对 JavaScript 文件提供了一个提取器(extractor),目标是提供更准确的结果,这将在生成的 CSS 文件大小方面优于 UnCSS。由于 PurgeCSS 是模块化的,开发人员可以为特定框架(Vue、React、Aurelia)和文件类型(pug、ejs)创建提取器。这样,无需模拟(HTML 和 JavaScript 的执行)即可获得最准确的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// postcss
postcss([require('uncss').postcssPlugin]);

PurifyCSS

PurifyCSS 可以支持任何文件类型,而不仅仅是 HTML 或 JavaScript。

PurifyCSS 的工作原理是查看文件中的所有单词,并将它们与 CSS 中的选择器进行比较。每个单词都被视为选择器,这意味着可能会错误地找到许多选择器。例如,有可能碰巧在一个段落中存在一个单词与 CSS 中的选择器相同。

PurgeCSS 通过支持自定义提取取器(extractor)来解决此问题。提取器是一个函数,它的作用是根据文件内容提取文件中使用所有的 CSS 选择器。它可以完美地删除未使用的 CSS。

提取器可用作解析器,该解析器返回 AST(抽象语法树)并在其中查找所有 CSS 选择器。这也是 purge-from-html 的工作方式。

你可以指定每种文件类型要使用的提取器,以获得最准确的结果。但是自定义提取器是可选的,你可以只使用默认的提取器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack相关配置
const path = require('path');
const glob = require('glob');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const PurifyCSSPlugin = require('purifycss-webpack');

module.exports = {
  entry: {...},
  output: {...},
  module: {
    rules: [
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract({
          fallbackLoader: 'style-loader',
          loader: 'css-loader'
        })
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin('[name].[contenthash].css'),
    // Make sure this is after ExtractTextPlugin!
    new PurifyCSSPlugin({
      // Give paths to parse for rules. These should be absolute!
      paths: glob.sync(path.join(__dirname, 'app/*.html')),
    })
  ]
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
走近webpack(4)--css相关拓展
  我们前面已经学了很多webpack基本的处理情况,一句话总结就是,一个优秀的webpack项目,主要的核心用法就是整合loader和plugin去处理你想要的任何需求。   下面,咱们一起来学学如何用webpack来处理less,sass等预编译器。先看看如何用webpack处理less。   国际惯例,第一步是安装: npm install less less-loader --save-dev   第二步,配置loader项: { test: /\.less$/, use: [{
zaking
2018/05/02
1.1K0
(14/24) css进阶:(入门)去除冗余的css
在平时的项目开发中,我们会引入一些框架,比如:Bootstrap,但是在项目中通常我们只使用它的一小部分,还有部分是冗余的。更有甚有时候需求更改,带来DOM结构的更改,这时候我们可能无暇关注CSS样式,会造成很多冗余的CSS。我们得想办法消除冗余的CSS,如果靠人工去剔除,吃力又容易出错,因此,此节我们来学习一下用webpack如何消除未使用的CSS。
wfaceboss
2019/04/08
1.2K0
(14/24) css进阶:(入门)去除冗余的css
【第13期】webpack入门学习手记(五)
前几天朋友聚餐突然想到,再过不到半年时间,第一批20后即将出生。这种感觉就像是,现在的90后看60后~ 一不小心我们这些90后在20后的眼中就变成了上个世纪的人。o(╯□╰)o
siberiawolf
2020/03/24
1.4K0
【第13期】webpack入门学习手记(五)
18款Webpack插件,总会有你想要的!
这篇文章整理了18个Webpack插件,分享给Web开发的小伙伴。Plugin是一个扩展器,它丰富了webpack本身,针对的是loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些分段,执行广泛的任务。
王小婷
2020/10/26
1.4K0
手把手带你使用webpack4构建一个Vue开发编译环境,并实现代码分割,css代码分离
本篇文章不会细致讲webpack生产编译方面的优化操作,主要点是为了区分开发与生产环境的区别,代码分割分离的操作,所以不建议各位使用本篇文章内配置内容去进行生产编译,生产编译其它优化细节请各位自行另加配置,当然本篇文章配置也不是不能用作生产配置,只是给各位一个建议~
吴佳
2022/09/26
8790
webpack优化
webpack.config 按照production和dev分开配置, wepback.base.config.js
刘嘿哈
2022/10/25
2300
webpack生产、开发公共配置拆分
代码已上传至github github代码地址:https://github.com/Miofly/mio.git
用户10106350
2022/10/28
5870
webpack4配置入门和进阶
webpack作为一个模块打包器,主要用于前端工程中的依赖梳理和模块打包,将我们开发的具有高可读性和可维护性的代码文件打包成浏览器可以识别并正常运行的压缩代码,主要包括样式文件处理成css,各种新式的JavaScript转换成浏览器认识的写法等,也是前端工程师进阶的不二法门,本文借鉴了部分vue-cli对webpack的配置思路,还有一些网上比较好的解决方案,在此对这些作者一并表示感谢。 webpack.config.js配置项简介 Entry:入口文件配置,Webpack 执行构建的第一步将从 Entry
卡少
2018/05/16
3.5K0
九:CSS-Tree-Shaking
是滴,随着 webpack 的兴起,css 也可以进行 Tree Shaking: 以去除项目代码中用不到的 CSS 样式,仅保留被使用的样式代码。
心谭博客
2020/04/20
1.2K0
webpack 4 的 30 个步骤打造优化到极致的 react 开发环境
将 react 和 webpack4 进行结合,集 webpack 的优势于一身,从 0 开始构建一个强大的 react 开发环境。
夜尽天明
2019/06/18
2.4K0
爆肝总结万字长文笔记webpack5打包资源优化
webpack是如何打包资源优化,你有了解吗?或者一个经常被问的面试题,首屏加载如何优化,其实无非就是从http请求、文件资源、图片加载、路由懒加载、预请求,缓存这些方向来优化,通常在使用脚手架中,成熟的脚手架已经给你做了最大的优化,比如压缩资源,代码的tree shaking等。
Maic
2022/07/28
1.9K0
爆肝总结万字长文笔记webpack5打包资源优化
一文彻底读懂webpack常用配置
const TerserPlugin = require('terser-webpack-plugin');
gogo2027
2022/10/18
4510
webpack 4 配置备忘
webpack.dev.js const merge = require('webpack-merge'); const webpack = require("webpack"); const path = require('path'); const common = require('./webpack.common.js'); module.exports = merge(common, { output: { // 出口文件 path: __dirname + '/dist
蓓蕾心晴
2021/12/16
2860
构建 webpack5 知识体系【近万字总结】
我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。
若川
2022/11/11
1.6K0
构建 webpack5 知识体系【近万字总结】
重学webpack4之构建速度提升和体积优化
5.执行npm run build,发现那些被拆分的包,没有打进业务代码中,符合预期
疯狂的技术宅
2020/12/15
1.2K0
重学webpack4之构建速度提升和体积优化
webpack-CSS-TreeShaking
官方文档地址:https://github.com/webpack-contrib/purifycss-webpack
程序员NEO
2023/09/28
2080
webpack-CSS-TreeShaking
CSS TreeShking 原理揭秘: 手写 PurgeCss
TreeShking 是通过静态分析的方式找出源码中不会被使用的代码进行删除,达到减小编译打包产物的代码体积的目的。
神说要有光zxg
2021/12/13
5390
CSS  TreeShking 原理揭秘: 手写 PurgeCss
webpack4大结局:加入腾讯IM配置策略,实现前端工程化环境极致优化
在此对webpack的性能优化进行几点声明: 在部分极度复杂的环境下,需要双package.json文件,即实行三次打包 在代码分割时,低于18K的文件没必要单独打包成一个chunk,http请求次数过多反而影响性能 prerender和PWA互斥,这个问题暂时没有解决 babel缓存编译缓存的是索引,即hash值,非常吃内存,每次开发完记得清理内存 babel-polyfill按需加载在某些非常复杂的场景下比较适合 prefetch,preload对首屏优化提升是明显 代码分割不管什么技术栈,一
Peter谭金杰
2019/08/02
2.1K0
React 折腾记 - (5) 记录用React开发项目过程遇到的问题(Webpack4/React16/antd等)
技术栈: react@16.6.0/ react-router-dom@v4 / webpack^4.23.1(babel7+)
CRPER
2018/12/05
1.6K0
React 折腾记 - (5) 记录用React开发项目过程遇到的问题(Webpack4/React16/antd等)
入门webpack的最佳实践(基于webpack4.X 5.X)-- 打包结果优化
来到这家公司之后,一直在使用webpack,也写了不少笔记,但是都比较零散,现在决定整理一下webpack相关的知识点,由浅入深,方便自己后续查漏补缺,后续会一直更新。
Jou
2022/09/04
7790
入门webpack的最佳实践(基于webpack4.X 5.X)-- 打包结果优化
推荐阅读
相关推荐
走近webpack(4)--css相关拓展
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档