awesome-interview/book2/css-preprocessor.html

21 lines
40 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-book2/css-preprocessor">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Docusaurus v2.0.0-beta.18">
<link rel="search" type="application/opensearchdescription+xml" title="HZFE - 剑指前端 Offer" href="/awesome-interview/opensearch.xml">
<link rel="preconnect" href="https://hm.baidu.com">
<script>var _hmt=_hmt||[];!function(){var e=document.createElement("script");e.src="https://hm.baidu.com/hm.js?c7cd0fd77ac518cc6ef46461cdc9524b";var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(e,c)}()</script>
<script src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" async data-ad-client="ca-pub-9889934432771967"></script>
<script src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9889934432771967" async crossorigin="anonymous"></script><title data-rh="true">谈谈 CSS 预处理器 | HZFE - 剑指前端 Offer</title><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://febook.hzfe.org/awesome-interview/book2/css-preprocessor"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="谈谈 CSS 预处理器 | HZFE - 剑指前端 Offer"><meta data-rh="true" name="description" content="相关问题"><meta data-rh="true" property="og:description" content="相关问题"><link data-rh="true" rel="icon" href="/awesome-interview/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://febook.hzfe.org/awesome-interview/book2/css-preprocessor"><link data-rh="true" rel="alternate" href="https://febook.hzfe.org/awesome-interview/book2/css-preprocessor" hreflang="en"><link data-rh="true" rel="alternate" href="https://febook.hzfe.org/awesome-interview/book2/css-preprocessor" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://PED5MQGL7T-dsn.algolia.net" crossorigin="anonymous"><link rel="stylesheet" href="/awesome-interview/assets/css/styles.62902d4b.css">
<link rel="preload" href="/awesome-interview/assets/js/runtime~main.16895322.js" as="script">
<link rel="preload" href="/awesome-interview/assets/js/main.a6349f88.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region"><a href="#" class="skipToContent_ZgBM">Skip to main content</a></div><nav class="navbar navbar--fixed-top navbarHideable_ObN2"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Navigation bar toggle" class="navbar__toggle clean-btn" type="button" tabindex="0"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/awesome-interview/"><div class="navbar__logo"><img src="/awesome-interview/img/badge.svg" alt="HZFE" class="themedImage_W2Cr themedImage--light_TfLj"><img src="/awesome-interview/img/badge.svg" alt="HZFE" class="themedImage_W2Cr themedImage--dark_oUvU"></div><b class="navbar__title">剑指前端 Offer</b></a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/hzfe/awesome-interview" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_I5OW"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="searchBox_qEbK"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div class="main-wrapper"><div class="docPage_P2Lg"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_RiI4" type="button"></button><aside class="theme-doc-sidebar-container docSidebarContainer_rKC_"><div class="sidebar_RiAD sidebarWithHideableNavbar_d0QC"><a tabindex="-1" class="sidebarLogo_YUvz" href="/awesome-interview/"><img src="/awesome-interview/img/badge.svg" alt="HZFE" class="themedImage_W2Cr themedImage--light_TfLj"><img src="/awesome-interview/img/badge.svg" alt="HZFE" class="themedImage_W2Cr themedImage--dark_oUvU"><b>剑指前端 Offer</b></a><nav class="menu thin-scrollbar menu_izAj"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/awesome-interview/about">关于我们</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/awesome-interview/">前言</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/awesome-interview/book1/browser-cross-origin">模拟题一</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="/awesome-interview/book2/browser-render-mechanism">模拟题二</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/browser-render-mechanism">浏览器:浏览器渲染机制</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/browser-garbage">浏览器:垃圾回收机制</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/engineer-babel">工程化Babel 的原理</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/frame-react-fiber">框架React Fiber 的作用和原理</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/frame-react-hoc-hooks">框架HOC vs Render Props vs Hooks</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/js-inherite">基础ES5、ES6 如何实现继承</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/js-new">基础New 操作符的原理</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/awesome-interview/book2/css-preprocessor">样式:谈谈 CSS 预处理器</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/network-http-cache">网络HTTP 缓存机制</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/coding-throttle-debounce">编码:实现节流防抖函数</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/algorithm-reverse-linked-list">算法:反转链表</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/awesome-interview/book2/topic-multi-pics-site-optimize">综合:多图站点性能优化</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/awesome-interview/book3/browser-event-loop">模拟题三</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/awesome-interview/book4/browser-router">模拟题四</a></div></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_FykI"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_DTRl"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></aside><main class="docMainContainer_TCnq"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_DM6M"><div class="docItemContainer_vinB"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Xlws" aria-label="breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a class="breadcrumbs__link" href="/awesome-interview/">🏠</a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><span class="breadcrumbs__link" itemprop="item name">模拟题二</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="item name">样式:谈谈 CSS 预处理器</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_jdIR theme-doc-toc-mobile tocMobile_TmEX"><button type="button" class="clean-btn tocCollapsibleButton_Fzxq">On this page</button></div><div class="theme-doc-markdown markdown"><h1>谈谈 CSS 预处理器</h1><h2 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="相关问题">相关问题<a class="hash-link" href="#相关问题" title="Direct link to heading"></a></h2><ul><li>CSS 主要有哪些预处理器</li><li>为什么需要用预处理器</li><li>各预处理器优缺点</li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="回答关键点">回答关键点<a class="hash-link" href="#回答关键点" title="Direct link to heading"></a></h2><p><code>Sass</code> <code>Less</code> <code>Stylus</code> <code>PostCSS</code> <code>工程化</code> <code>提升效率</code></p><p>CSS 本身不属于可编程语言,当前端项目逐渐庞大之后 CSS 的维护也愈加困难。CSS 预处理器所做的本质上是为 CSS 增加一些可编程的特性,通过<strong>变量</strong><strong>嵌套</strong><strong>简单的程序逻辑</strong><strong>计算</strong><strong>函数</strong>等特性,通过<strong>工程化</strong>的手段让 CSS 更易维护,提升开发效率。</p><p>目前主流的 CSS 预处理器主要有 Sass、Less、Stylus、PostCSS。</p><h2 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="知识点深入">知识点深入<a class="hash-link" href="#知识点深入" title="Direct link to heading"></a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="1-postcss1">1. PostCSS<sup>[1]</sup><a class="hash-link" href="#1-postcss1" title="Direct link to heading"></a></h3><p>PostCSS 是目前最为流行的 CSS 预/后处理器。PostCSS 本体功能比较单一,它提供一种用 JavaScript 来处理 CSS 的方式。PostCSS 会把 CSS 解析成 ASTAbstract Syntax Tree 抽象语法树),之后由其他插件进行不同的处理。</p><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="功能">功能<a class="hash-link" href="#功能" title="Direct link to heading"></a></h4><p>PostCSS 本体功能比较单一,大多数的 CSS 处理功能都由插件提供,下面是一些常用的插件:</p><ul><li><a href="https://github.com/postcss/autoprefixer" target="_blank" rel="noopener noreferrer">Autoprefixer</a> 为 CSS 中的属性添加浏览器特定的前缀。</li><li><a href="https://github.com/csstools/postcss-preset-env" target="_blank" rel="noopener noreferrer">postcss-preset-env</a> 根据 <code>browserslist</code> 指定的目标浏览器将一些 CSS 的新特性转换为目标浏览器所支持的语法。</li><li><a href="https://github.com/cssnano/cssnano" target="_blank" rel="noopener noreferrer">cssnano</a> 提供 CSS 压缩功能。</li><li><a href="https://github.com/postcss/postcss-nested" target="_blank" rel="noopener noreferrer">postcss-nested</a> 提供 CSS 嵌套功能。</li><li><a href="https://github.com/evrone/postcss-px-to-viewport" target="_blank" rel="noopener noreferrer">postcss-px-to-viewport</a> 提供 px 转 vw 功能。</li><li><a href="https://github.com/postcss/postcss-custom-properties" target="_blank" rel="noopener noreferrer">postcss-custom-properties</a> 支持 CSS 的自定义属性。</li></ul><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="优点">优点<a class="hash-link" href="#优点" title="Direct link to heading"></a></h4><ul><li>插件系统完善,扩展性强。</li><li>配合插件功能齐全。</li><li>生态优秀。</li></ul><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="缺点">缺点<a class="hash-link" href="#缺点" title="Direct link to heading"></a></h4><ul><li>配置相对复杂。</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="2-sass2">2. Sass<sup>[2]</sup><a class="hash-link" href="#2-sass2" title="Direct link to heading"></a></h3><p>Sass 在完全兼容 CSS 语法的前提下,给 CSS 提供了变量、嵌套、混合、操作符、自定义函数等可编程能力。</p><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="功能-1">功能<a class="hash-link" href="#功能-1" title="Direct link to heading"></a></h4><p>Sass 常用的有几种功能:</p><ul><li>变量:变量中可以存储颜色、字体或任何 CSS 值。</li><li>嵌套:可嵌套 CSS 选择器,提供清晰的层次结构。</li><li>混合:可以定义&amp;重用代码块。</li><li>扩展/集成:可以在一个选择器内继承另一个选择器。</li><li>操作符:可以在 CSS 中使用操作符进行计算。</li><li>条件/循环语句:可以循环/条件生成 CSS。</li><li>自定义函数:可以自定义复杂操作的函数。</li></ul><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="优点-1">优点<a class="hash-link" href="#优点-1" title="Direct link to heading"></a></h4><ul><li>使用广泛。</li><li>功能支持完善。</li><li>可编程能力强。</li></ul><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="缺点-1">缺点<a class="hash-link" href="#缺点-1" title="Direct link to heading"></a></h4><ul><li>CSS 的复杂度不可控。</li><li>node-sass 国内安装不易(非 Sass 本身的缺点dart-sass 可代替)。</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="3-less3">3. Less<sup>[3]</sup><a class="hash-link" href="#3-less3" title="Direct link to heading"></a></h3><p>Less 和 Sass 类似,完全兼容 CSS 语法,并给 CSS 提供了变量、嵌套、混合、运算等可编程能力。Less 通过 JavaScript 实现,可在浏览器端直接使用。</p><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="功能-2">功能<a class="hash-link" href="#功能-2" title="Direct link to heading"></a></h4><p>Less 常用的有几种功能:</p><ul><li>变量:变量中可以存储颜色、字体或任何 CSS 值。</li><li>嵌套:可嵌套 CSS 选择器,提供清晰的层次结构。</li><li>混合:可以定义&amp;重用的代码块。</li><li>扩展/集成:可以在一个选择器内继承另一个选择器。</li><li>运算:可以在 CSS 中进行计算。</li><li>条件/循环语句:可以循环/条件生成 CSS。</li></ul><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="优点-2">优点<a class="hash-link" href="#优点-2" title="Direct link to heading"></a></h4><ul><li>使用广泛。</li><li>可以在浏览器中运行,容易实现主题定制功能。</li></ul><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="缺点-2">缺点<a class="hash-link" href="#缺点-2" title="Direct link to heading"></a></h4><ul><li>不支持自定义函数(可通过 mixins 实现简单逻辑)。</li><li>编程能力相对较弱。</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="4-stylus4">4. Stylus<sup>[4]</sup><a class="hash-link" href="#4-stylus4" title="Direct link to heading"></a></h3><p>Stylus 基础功能和 Sass / Less 十分类似。Stylus 的特点是冒号、分号、逗号和括号都是可选项,所以可以写出非常简洁的 CSS示例如下</p><div class="codeBlockContainer_I0IT language-stylus theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-stylus codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token selector" style="color:#00009f">body</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property-declaration property" style="color:#36acaa">background-color</span><span class="token property-declaration punctuation" style="color:#393A34">:</span><span class="token property-declaration"> </span><span class="token property-declaration hexcode">#000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector" style="color:#00009f">body::after</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property-declaration property" style="color:#36acaa">content</span><span class="token property-declaration punctuation" style="color:#393A34">:</span><span class="token property-declaration"> </span><span class="token property-declaration string" style="color:#e3116c">&#x27;HZFEStudio&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property-declaration property" style="color:#36acaa">color</span><span class="token property-declaration punctuation" style="color:#393A34">:</span><span class="token property-declaration"> </span><span class="token property-declaration hexcode">#fff</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property-declaration property" style="color:#36acaa">font-size</span><span class="token property-declaration punctuation" style="color:#393A34">:</span><span class="token property-declaration"> </span><span class="token property-declaration number" style="color:#36acaa">20</span><span class="token property-declaration unit">px</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="扩展阅读">扩展阅读<a class="hash-link" href="#扩展阅读" title="Direct link to heading"></a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="1-css-modules5">1. CSS Modules<sup>[5]</sup><a class="hash-link" href="#1-css-modules5" title="Direct link to heading"></a></h3><p>CSS Modules 和前文介绍的预处理器不同,不是可编程化的 CSS而仅是给 CSS 文件加入了作用域和模块依赖,主要是为了解决 CSS 全局污染的痛点以及为了解决全局污染而嵌套过深的问题。使用示例如下:</p><div class="codeBlockContainer_I0IT language-css theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-css codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* style.css */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.hzfeTitle</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">color</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#666</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">font-size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><div class="codeBlockContainer_I0IT language-javascript theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-javascript codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">style</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;./style.css&quot;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">body</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">innerHTML</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">h1</span><span class="token template-string html language-html tag" style="color:#00009f"> </span><span class="token template-string html language-html tag attr-name" style="color:#00a4db">class</span><span class="token template-string html language-html tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token template-string html language-html tag attr-value punctuation" style="color:#393A34">&quot;</span><span class="token template-string html language-html tag attr-value interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string html language-html tag attr-value interpolation" style="color:#e3116c">style</span><span class="token template-string html language-html tag attr-value interpolation punctuation" style="color:#393A34">.</span><span class="token template-string html language-html tag attr-value interpolation property-access" style="color:#e3116c">hzfeTitle</span><span class="token template-string html language-html tag attr-value interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string html language-html tag attr-value punctuation" style="color:#393A34">&quot;</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html">HZFEStudio</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">h1</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="2-css-in-js">2. CSS-in-JS<a class="hash-link" href="#2-css-in-js" title="Direct link to heading"></a></h3><p>如名字所见CSS-in-JS 是一种在 JavaScript 里写 CSS 的方式。利用 JS 的优势可实现非常灵活的可扩展的样式。CSS-in-JS 有很多实现,目前比较流行的是 <a href="https://www.styled-components.com/" target="_blank" rel="noopener noreferrer">Styled-components</a></p><p>通过 Styled-components 写 CSS 的示例如下:</p><div class="codeBlockContainer_I0IT language-javascript theme-code-block"><div class="codeBlockContent_wNvx" style="color:#393A34;background-color:#f6f8fa"><pre tabindex="0" class="prism-code language-javascript codeBlock_jd64 thin-scrollbar"><code class="codeBlockLines_mRuA"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;react&quot;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">styled</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;styled-components&quot;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">hzfe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token maybe-class-name">Title</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> styled</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">h1</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string css language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string css language-css"> </span><span class="token template-string css language-css property" style="color:#36acaa">font-size</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> </span><span class="token template-string css language-css number" style="color:#36acaa">1.5</span><span class="token template-string css language-css unit">em</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string css language-css"> </span><span class="token template-string css language-css property" style="color:#36acaa">text-align</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> center</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string css language-css"> </span><span class="token template-string css language-css property" style="color:#36acaa">color</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> </span><span class="token template-string css language-css hexcode color">#666</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string css language-css"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token maybe-class-name">Title</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token maybe-class-name">HZFEStudio</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token maybe-class-name">Title</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" title="Copy" class="copyButton_eDfN clean-btn"><span class="copyButtonIcons_W9eQ" aria-hidden="true"><svg class="copyButtonIcon_XEyF" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_i9w9" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="3-tailwind-和-utility-first-css">3. Tailwind 和 Utility-first CSS<a class="hash-link" href="#3-tailwind-和-utility-first-css" title="Direct link to heading"></a></h3><p>近几年随着 Tailwind 的流行功能类优先Utility-first CSS的理念也再次流行起来。这里简单介绍一下 Tailwind CSS。</p><h4 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="31-tailwind6">3.1 Tailwind<sup>[6]</sup><a class="hash-link" href="#31-tailwind6" title="Direct link to heading"></a></h4><p>Tailwind CSS 是一个功能类优先的 CSS 框架通过组合不同的类名实现页面设计。Tailwind 主要优势如下:</p><ol><li>不用考虑 class 的命名。</li><li>CSS 文件大小增长可控,通过 <code>purge</code> 可生成非常小的 CSS 文件。</li><li>统一设计系统下的样式与布局。</li><li>IDE 集成优秀。</li></ol><h2 class="anchor anchorWithHideOnScrollNavbar_R0VQ" id="参考资料">参考资料<a class="hash-link" href="#参考资料" title="Direct link to heading"></a></h2><ol><li><a href="https://postcss.org/" target="_blank" rel="noopener noreferrer">PostCSS - A tool for transforming CSS with JavaScript</a></li><li><a href="https://sass-lang.com/" target="_blank" rel="noopener noreferrer">Sass - CSS with superpowers</a></li><li><a href="https://lesscss.org/" target="_blank" rel="noopener noreferrer">Less - It&#x27;s CSS, with just a little more</a></li><li><a href="https://stylus-lang.com/" target="_blank" rel="noopener noreferrer">Stylus - Foresight has never been so crucial</a></li><li><a href="https://github.com/css-modules/css-modules" target="_blank" rel="noopener noreferrer">CSS Modules</a></li><li><a href="https://tailwindcss.com/" target="_blank" rel="noopener noreferrer">Tailwind CSS</a></li></ol></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><div class="pagination-nav__item"><a class="pagination-nav__link" href="/awesome-interview/book2/js-new"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">基础New 操作符的原理</div></a></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/awesome-interview/book2/network-http-cache"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">网络HTTP 缓存机制</div></a></div></nav></div></div><div class="col col--3"><div class="tableOfContents_cNA8 thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#相关问题" class="table-of-contents__link toc-highlight">相关问题</a></li><li><a href="#回答关键点" class="table-of-contents__link toc-highlight">回答关键点</a></li><li><a href="#知识点深入" class="table-of-contents__link toc-highlight">知识点深入</a><ul><li><a href="#1-postcss1" class="table-of-contents__link toc-highlight">1. PostCSS<sup>1</sup></a><ul><li><a href="#功能" class="table-of-contents__link toc-highlight">功能</a></li><li><a href="#优点" class="table-of-contents__link toc-highlight">优点</a></li><li><a href="#缺点" class="table-of-contents__link toc-highlight">缺点</a></li></ul></li><li><a href="#2-sass2" class="table-of-contents__link toc-highlight">2. Sass<sup>2</sup></a><ul><li><a href="#功能-1" class="table-of-contents__link toc-highlight">功能</a></li><li><a href="#优点-1" class="table-of-contents__link toc-highlight">优点</a></li><li><a href="#缺点-1" class="table-of-contents__link toc-highlight">缺点</a></li></ul></li><li><a href="#3-less3" class="table-of-contents__link toc-highlight">3. Less<sup>3</sup></a><ul><li><a href="#功能-2" class="table-of-contents__link toc-highlight">功能</a></li><li><a href="#优点-2" class="table-of-contents__link toc-highlight">优点</a></li><li><a href="#缺点-2" class="table-of-contents__link toc-highlight">缺点</a></li></ul></li><li><a href="#4-stylus4" class="table-of-contents__link toc-highlight">4. Stylus<sup>4</sup></a></li></ul></li><li><a href="#扩展阅读" class="table-of-contents__link toc-highlight">扩展阅读</a><ul><li><a href="#1-css-modules5" class="table-of-contents__link toc-highlight">1. CSS Modules<sup>5</sup></a></li><li><a href="#2-css-in-js" class="table-of-contents__link toc-highlight">2. CSS-in-JS</a></li><li><a href="#3-tailwind-和-utility-first-css" class="table-of-contents__link toc-highlight">3. Tailwind 和 Utility-first CSS</a><ul><li><a href="#31-tailwind6" class="table-of-contents__link toc-highlight">3.1 Tailwind<sup>6</sup></a></li></ul></li></ul></li><li><a href="#参考资料" class="table-of-contents__link toc-highlight">参考资料</a></li></ul></div></div></div><div class="row"><div class="col"><div class="react-utterences"><div>Loading script...</div></div></div><div class="col col--3"></div></div></div></main></div></div></div>
<script src="/awesome-interview/assets/js/runtime~main.16895322.js"></script>
<script src="/awesome-interview/assets/js/main.a6349f88.js"></script>
</body>
</html>