欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

使用 Mixin 性能更好_html/css_WEB-ITnose

程序员文章站 2022-05-22 13:24:35
...
原文链接: Mixins Better for Performance

本文已获得原作翻译授权,转载译文时请附上原文链接以及译文链接,未经允许不得随意转载译文

译文链接:使用 Mixin 性能更好

翻译:于坤

谈到预处理器,最常见的问题就是用 @extend 还是 mixin?我一直强烈支持一个观点,尽量不要用 @extend,原因有很多:

1,它会改变你的 css 顺序,有潜在风险

2,它会产生尴尬的分组,将无关的选择器放到一起

3,它很贪婪,@extend 会继承每一个实例,而不仅仅是你真正需要的那个

4,它会让你的代码很快失控( 图1, 图2)

现在,因为 @extend 不符合设计模式,奇葩用法逐渐减少,令人欣慰,但我觉得还是不够。

昨天跟一个客户讲课时,提到 @extend。我回答,永远不要用 @extend!客户说,但是 @extend 性能更好啊,生成更少的代码。

确实 @extend(正确使用的话)会产生更少的代码,但是我的回答依然是, 不,mixin 对性能更好

就算没有测试,我也能很自信的这样回答,因为我的理由很充分:

因为 gzip 偏爱重复的内容,所以1000个重复的声明,比1000个不同的声明有更好的压缩率。

大家在说性能的时候,通常都是在说文件大小,但我们开启了 gzip 压缩以后(你也开启了吧?),就应该考虑网络传输中的文件大小。

我的想法是,我们用 gzip 压缩 css 以后,含有更多重复字符串的文件,比基本上没有重复内容的要小很多,无论原来的 css 文件大小怎样。我断定,大一点的,但是重复内容更多的文件,压缩后更小。

回到酒店我测试了一下我的理论。

实验

我的步骤是这样的

1,创建两个css文件2,每个文件都有1000个不同的 class,用 sass 生成

@for $i from 1 through 1000 {  .#{unique-id()}-#{$i} {    ...  }}

3,我给每一个 class 一个独立的声明,用类名加随机字符串,生成无意义的名称和选择器。

@for $i from 1 through 1000 {  .#{unique-id()}-#{$i} {    content: "ibf#{&}jaslbw";  }}

4,然后选择三个常见的 css 声明,给这1000个 class 共用:

color: red;font-weight: bold;line-height: 2;

5,一个用 mixin 共享这三句样式声明

@mixin foo {  color: red;  font-weight: bold;  line-height: 2;}   .#{unique-id()}-#{$i} {  @include foo;  content: "ibf#{&}jaslbw";}

6,另外一个用 @extend 共享

%foo {  color: red;  font-weight: bold;  line-height: 2;}   .#{unique-id()}-#{$i} {  @extend %foo;  content: "ibf#{&}jaslbw";}

测试代码都在 github(https://github.com/csswizardry/extend-vs-mixin)

这样生成了两个文件,每个都有1000个独立的 class,1000个独立的声明,还有分别用两种方法共享三条 css 规则。文件谁大谁小应该不出所料:

– mixin.css 108K

– extend.css 72K

– 两个文件的差距有 36K

使用 mixin 产生的文件是使用 @extend 的150%

这跟我的期望一样,mixin确实比 @extend 产生的文件更大。但是!我们不用担心文件系统中的文件大小,而应该关心 gzip 压缩后的文件大小。我用gzip压缩后:

– mixin.css 12K

– extend.css 18K

– 两个文件相差 6K

使用 mixin 比 @extend 减少了33.333%的文件大小。

差距惊人!一开始 mixin 是 @extend 的1.5倍,现在却比 @extend 小 0.3倍。我的理论是对的!

让测试更真实

我认为上面的测试很公平,类名用独特的字符串阻止压缩,这样更能提现共享规则的压缩效果。也就是说,这个测试太理想,不真实。所以我决定做更有说服力的测试,从真实的项目中拿出编译后的 css 文件,复制两份,然后分别 @import 刚才生成的两个测试文件。这时我的测试文件和1794行真正的、实际项目里正在用的 css 放在一起。生成的测试文件如下:

– mixin.css 16K

– extend.css 22K

– 两个文件差距是 6K

使用 mixin 比使用 @extend 小27%。

绝对数字微不足道(才6K)但是相对值却是节省27%的宽带,做的调整仅仅是用 mixin 生成重复的声明,代替用 @extend 生成重复的选择器。

使用 mixin 性能更好

我的测试显示,mixin 最终比使用 @extend 网络性能更好,未压缩时更大的文件,gzip 的工作原理也让它们变得更节省宽带。这表明 @extend 并没有性能优势,加上它对 css 的坏处,请不要再用它了。

原文链接: Mixins Better for Performance

本文已获得原作翻译授权,转载译文时请附上原文链接以及译文链接,未经允许不得随意转载译文

译文链接:使用 Mixin 性能更好

翻译:于坤