CSS(Sass)模塊化


在Vue大行其道的今天,我們也受益匪淺,再次感謝@尤大。那么在用Vue開發的過程中,我們大概率會用到Sass來提高我們前端的開發效率,為前端工程化做了很大貢獻,Sass本身具有很多令人興奮的功能,例如:variable、function、mixin、nested、module等,本文主要來研究module——CSS模塊化

我們在開發中最常用的模塊化指令就是@import,后來新版本的 Sass 中摒棄了 @import 並引入了一個新的指令 @use 來幫我們完成CSS的模塊化,那我們就一個一個來研究~

 

@import

基本用法

Sass 拓展了 @import 的功能,允許其導入 SCSS 或 Sass 文件。被導入的文件將合並編譯到同一個 CSS 文件中,另外,被導入的文件中所包含的變量或者混合指令 (mixin) 都可以在導入的文件中使用。

通常,@import 尋找 Sass 文件並將其導入,但在以下情況下,@import 僅作為普通的 CSS 語句,不會導入任何 Sass 文件。

  • 文件拓展名是 .css
  • 文件名以 http:// 開頭;
  • 文件名是 url()
  • @import 包含 media queries。

如果不在上述情況內,文件的拓展名是 .scss 或 .sass,則導入成功。沒有指定拓展名,Sass 將會試着尋找文件名相同,拓展名為 .scss 或 .sass 的文件並將其導入。

@import "foo.scss";

  

@import "foo";

  

都會導入文件 foo.scss,但是

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

  

編譯為

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

  

Sass 允許同時導入多個文件,例如同時導入 rounded-corners 與 text-shadow 兩個文件:

@import "rounded-corners", "text-shadow";

  

導入文件也可以使用 #{ } 插值語句,但不是通過變量動態導入 Sass 文件,只能作用於 CSS 的 url() 導入方式:

$family: unquote("Droid+Sans");
@import url("http://fonts.googleapis.com/css?family=\#{$family}");

  

編譯為

@import url("http://fonts.googleapis.com/css?family=Droid+Sans");

  

它的缺點

  • 很容和原生CSS中的@import混淆;
  • 性能略差(待考究);
  • 沒有命名空間,多個模塊相同名稱的變量或方法會被覆蓋;
  • 無法直接看出變量或方法的宿主模塊;
 
為了彌補已知問題,@import被更明確的@use和@forward規則所取代

 

@use

和@import用法類似

@use"foo.scss";

  

當然,他們之間有明顯差別

  • 該文件只導入一次,不管在項目中@use它多少次。
  • 以下划線(_)或連字符(-)開頭的變量、mixin 和函數(Sass稱為"成員變量")被認為是私有的,不會被導入。
  • 導入的文件(這里即buttons.scss)中的成員變量只在局部可用,而不會傳遞到未來的導入結果中。
  • 類似地,@extends將只應用於上游鏈——即只擴展被導入的文件中的選擇器,而不是執行導入命令的文件。
  • 所有導入的成員變量默認擁有命名空間

 

待續......

 

 

 

 

 

需要注意的是,如果我們使用的是node-sass,在webpack中使用sass-loader並不能編譯 @use ,只有dart-sass可以使用 @use

 

 

 

Reference

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM