28 个版本
1.0.0-alpha.32 | 2022年9月2日 |
---|---|
1.0.0-alpha.30 | 2022年7月31日 |
1.0.0-alpha.21 | 2022年3月31日 |
1.0.0-alpha.8 | 2021年12月30日 |
181 在 构建实用工具 中排名
180 每月下载量
用于 3 crates
2MB
59K SLoC
@parcel/css
一个用 Rust 编写的极快 CSS 解析器、转换器和压缩器。与 Parcel 一起使用,作为独立库或 CLI,或通过插件与其他工具一起使用。


特性
- 极快 – 解析和压缩大文件只需毫秒,通常比其他工具的输出更小。请参阅下面的 基准测试。
- 类型化属性值 – 许多其他 CSS 解析器将属性值视为无类型的标记序列。这意味着任何想要对这些值执行操作的转换器都必须自行解释它们,从而导致重复工作和不一致性。`@parcel/css` 使用 CSS 规范的语法解析所有值,并为每个属性提供特定的值类型。
- 浏览器级解析器 – `@parcel/css` 是基于 Mozilla 创建并由 Firefox 和 Servo 使用的 cssparser 和 selectors crate 构建的。这些提供了在 CSS 规则和属性上实现支持的强大通用 CSS 解析基础。
- 压缩 – `@parcel/css` 的主要目的是压缩 CSS 以减小其大小。这包括许多优化,包括
- 尽可能将长属性合并为简写属性。
- 在安全的情况下,合并具有相同选择器或声明的相邻规则。
- 在可能的情况下,将 CSS 变换合并为一个单个矩阵或反之亦然。
- 根据提供的浏览器目标移除不需要的供应商前缀。
- 尽可能减少 `calc()` 表达式。
- 尽可能将颜色转换为更短的十六进制表示。
- 压缩渐变。
- 压缩 CSS 网格模板。
- 标准化属性值顺序。
- 移除浏览器可推断的默认属性子值。
- 许多微优化,例如转换为更短的单位、移除不必要的引号等。
- 供应商前缀 –
@parcel/css
接受浏览器目标列表,并自动添加(和移除)供应商前缀。 - 语法降级 –
@parcel/css
解析现代CSS语法,并根据浏览器目标生成更兼容的输出。- CSS嵌套(草案规范)
- 自定义媒体查询(草案规范)
- 逻辑属性
color-mix()
函数- 颜色级别4
lab()
、lch()
、oklab()
和oklch()
颜色color()
函数支持预定义的颜色空间,如display-p3
和xyz
- 在
rgb
和hsl
函数中的空格分隔的组件 - 带alpha的十六进制语法
hwb()
颜色语法- 不透明度的百分数语法
#rgba
和#rrggbbaa
十六进制颜色
- 选择器
:not
带有多个参数:lang
带有多个参数:dir
:is
- 双重位置渐变停止(例如
red 40% 80%
) clamp()
、round()
、rem()
和mod()
数学函数- 对齐简写(例如
place-items
) - 双值
overflow
简写 - 媒体查询范围语法(例如
@media (width <= 100px)
或@media (100px < width < 500px)
) - 多值
display
属性(例如inline flex
) system-ui
字体族回退
- CSS模块 –
@parcel/css
支持编译CSS模块的一部分功能。- 局部作用域的类和id选择器
- 局部作用域的自定义标识符,例如
@keyframes
名称、网格线/区域、@counter-style
名称等。 - 选择支持局部作用域的CSS变量和其他虚线标识符。
:local()
和:global()
选择器composes
属性
文档
@parcel/css
可以从 Parcel 使用,作为一个独立的 JavaScript 或 Rust 库,使用独立的 CLI,或者作为任何其他工具的插件。
从 Node
查看完整的 API 文档的 TypeScript 定义。
以下是一个简单示例,编译输入 CSS 以支持 Safari 13.2,并最小化输出。
const css = require('@parcel/css');
let {code, map} = css.transform({
filename: 'style.css',
code: Buffer.from('.foo { color: red }'),
minify: true,
sourceMap: true,
targets: {
// Semver versions are represented using a single 24-bit number, with one component per byte.
// e.g. to represent 13.2.0, the following could be used.
safari: (13 << 16) | (2 << 8)
}
});
您还可以将 browserslist
运行的结果转换为可以传递给 @parcel/css
的目标。
const browserslist = require('browserslist');
const css = require('@parcel/css');
let targets = css.browserslistToTargets(browserslist('>= 0.25%'));
还可以通过使用 bundle
API 来进行打包。该 API 处理 @import
规则并将它们内联。此 API 需要文件系统访问权限,因此它不接受 API 中的 code
。
let {code, map} = css.bundle({
filename: 'style.css',
minify: true
});
从 Rust
查看 docs.rs 上的 Rust API 文档。
使用 Parcel
Parcel 将 @parcel/css
作为默认的 CSS 转换器。您还应该在 package.json
中添加一个 browserslist
属性,该属性定义了您的 CSS 将为哪些浏览器编译。
虽然 Parcel CSS 处理了最常见的 PostCSS 插件,如 autoprefixer
、postcss-preset-env
和 CSS 模块,但您可能仍然需要 PostCSS 来处理更定制的插件,如 TailwindCSS。如果是这样,您的 PostCSS 配置将自动获取。您可以从 PostCSS 配置中删除上述插件,它们将由 Parcel CSS 处理。
您还可以在项目的根目录中的 package.json
中配置 Parcel CSS。目前支持三种选项:drafts
,可以用来启用 CSS 嵌套和自定义媒体查询,pseudoClasses
,允许用可以由 JavaScript 应用(例如 polyfills)的正常类替换一些伪类,如 :focus-visible
,以及 cssModules
,它全局启用 CSS 模块,而不仅仅是文件以 .module.css
结尾,或者接受一个选项对象。
{
"@parcel/transformer-css": {
"cssModules": true,
"drafts": {
"nesting": true,
"customMedia": true
},
"pseudoClasses": {
"focusVisible": "focus-ring"
}
}
}
查看 Parcel 文档 了解更多详情。
从 Deno 或浏览器
@parcel/css-wasm
包可以在 Deno 或浏览器中使用。它使用 Parcel CSS 的 WebAssembly 版本。使用 TextEncoder
和 TextDecoder
将代码从字符串转换为类型数组并将其转换回字符串。
import init, {transform} from 'https://unpkg.com/@parcel/css-wasm';
await init();
let {code, map} = transform({
filename: 'style.css',
code: new TextEncoder().encode('.foo { color: red }'),
minify: true,
});
console.log(new TextDecoder().decode(code));
使用 webpack
css-minimizer-webpack-plugin 内置了对 @parcel/css
的支持。在您的项目中安装 @parcel/css
,并根据文档配置插件 此处。
从 CLI
Parcel CSS 包含一个独立的 CLI 工具,可以用来编译、压缩和打包 CSS 文件。当您只需要编译 CSS 而不需要更高级的构建工具功能(如代码拆分和多语言支持)时,可以使用它。
要使用 CLI,请使用与 npm 兼容的包管理器安装 @parcel/css-cli
包。
npm install @parcel/css-cli
然后,您可以通过 npx
、yarn
或在 package.json 中设置脚本来运行 parcel-css
命令。
{
"scripts": {
"build": "parcel-css --minify --nesting --bundle --targets '>= 0.25%' --sourcemap input.css -o output.css"
}
}
要查看所有可用选项,请使用 --help
参数。
npx parcel-css --help
错误恢复
默认情况下,Parcel CSS 是严格的,解析无效规则或声明时会报错。然而,有时您可能会遇到无法轻松修改的第三方库,这些库无意中包含无效语法或 IE 特定修复。在这种情况下,您可以通过启用 errorRecovery
选项(或 --error-recovery
CLI 标志)来跳过无效的规则和声明,在输出中省略它们,并生成警告而不是错误。如果可能的话,还应提交问题或 PR 来修复库中的问题。
基准测试


$ node bench.js bootstrap-4.css
cssnano: 544.809ms
159636 bytes
esbuild: 17.199ms
160332 bytes
parcel-css: 4.16ms
143091 bytes
$ node bench.js animate.css
cssnano: 283.105ms
71723 bytes
esbuild: 11.858ms
72183 bytes
parcel-css: 1.973ms
23666 bytes
$ node bench.js tailwind.css
cssnano: 2.198s
1925626 bytes
esbuild: 107.668ms
1961642 bytes
parcel-css: 43.368ms
1824130 bytes
要比较更多工具和输入的更多基准测试,请参阅 此处。请注意,一些显示的工具执行了不安全的优化,这可能会更改原始 CSS 的行为以有利于更小的文件大小。Parcel CSS 不会这样做 - 输出的 CSS 应始终与输入行为一致。在比较工具之间的文件大小时,请记住这一点。
依赖关系
~6–14MB
~176K SLoC