国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
談談PostCSS

前言

現(xiàn)在的前端,javascript的發(fā)展有目共睹,框架林立。同時,html也是齊頭并進,推出了HTML5標準,并且得到了普及。這樣的發(fā)展卻唯獨少了一個角色?

CSS,就是這個看似不起眼的家伙,卻在開發(fā)中發(fā)揮著和js一樣重要的作用。css,是一種樣式腳本,好像和編程語言有著一定的距離,我們可以將之理解為一種描述方法。這似乎導致css被輕視了。不過,css近幾年來正在經(jīng)歷著一次巨變——CSS Module。我記得js的井噴期應該可以說是node帶來的,它帶來了Module的概念,使得JS可以被工程化開發(fā)項目。那么,今天的css,也將越來越美好。如果你喜歡我的文章,歡迎評論,歡迎Star~。歡迎關注我的github博客

正文

既然作為一篇推廣PostCSS的文章,我們就應該先來了解一下這是什么,和我們之前講的CSS Module有啥關系?此處讓我為你們娓娓道來。

我想和你們說再見

目前,在工程化開發(fā)中,使用最多的應該就是Less、Sass和Stylus。首先,還是介紹一下它們吧。它們有個統(tǒng)一的名字——css預處理器。何為CSS預處理器?應該就是一種可以將你根據(jù)它的規(guī)則寫出來的格式轉成css的東西(還是講的通俗一點)。它們的出現(xiàn)可以說是恰逢其時,解決了css的一些缺憾:

  • 語法不夠強大,不能夠嵌套書寫,不利于模塊化開發(fā)
  • 沒有變量和邏輯上的復用機制,導致在css的屬性值中只能使用字面量形式,以及不斷重復書寫重復的樣式,導致難以維護。

面對以上問題,css預處理器給出了非常可行的解決方案:

  1. 變量:就像其他編程語言一樣,免于多處修改。

    • Sass:使用「$」對變量進行聲明,變量名和變量值使用冒號進行分割
    • Less:使用「@」對變量進行聲明
    • Stylus:中聲明變量沒有任何限定,結尾的分號可有可無,但變量名和變量值之間必須要有『等號』。但需要注意的是,如果用“@”符號來聲明變量,Stylus會進行編譯,但不會賦值給變量。就是說,Stylus 不要使用『@』聲明變量。Stylus 調(diào)用變量的方法和Less、Sass完全相同。
  2. 作用域:有了變量,就必須得有作用域進行管理。就想js一樣,它會從局部作用域開始往上查找變量。

    • Sass:它的方式是三者中最差的,不存在全局變量的概念
    • Less:它的方式和js比較相似,逐級往上查找變量
    • Stylus:它的方式和Less比較相似,但是它和Sass一樣更傾向于指令式查找
  3. 嵌套:對于css來說,有嵌套的寫法無疑是完美的,更像是父子層級之間明確關系

    • 三者在這處的處理都是一樣的,使用「&」表示父元素

有了這些方案,會使得我們可以在保證DPY、可維護性、靈活性的前提下,編寫css樣式。

回到話題中,之所以會出現(xiàn)向預處理器這樣子的解決方案,歸根結底還是css標準發(fā)展的滯后性導致的。同時,我們也應該考慮一下,真的只要預處理器就夠了嗎?往往在項目過大時,由于缺乏模塊的概念,全局變量的問題會持續(xù)困擾著你。每次定義選擇器時,總是要顧及到其他文件中是否也使用了同樣的命名。畢竟項目是團隊的,而不是個人的。哪是否有方式可以解決這些問題呢?

前人的方法

對于css命名沖突的問題,由來已久,可以說我們前端開發(fā)人員,天天在苦思冥想,如何去優(yōu)雅的解決這些問題。css并未像js一樣出現(xiàn)了AMD、CMD和ES6 Module的模塊化方案。

那么,回到問題,如何去解決呢?我們的前人也有提出過不同的方案:

  1. Object-Oriented CSS
  2. BEM
  3. SMACSS

方案可以說是層出不窮,不乏有團隊內(nèi)部的解決方案。但是大多數(shù)都是一個共同點——為選擇器增加前綴。

這可是一個體力活,你可能需要手動的去編寫長長的選擇器,或許你可以使用預編譯的css語言。但是,它們似乎并為解決本質(zhì)的問題——為何會造成這種缺憾。我們不妨來看看,使用BEM規(guī)范寫出來的例子:

<!-- 正確的。元素都位于 'search-form' 模塊內(nèi) --><!-- 'search-form' 模塊 --><form class="search-form">    <!-- 在 'search-form' 模塊內(nèi)的 'input' 元素 -->    <input class="search-form__input" />    <!-- 在 'search-form' 模塊內(nèi)的 'button' 元素 -->    <button class="search-form__button"></button></form><!-- 不正確的。元素位于 'search-form' 模塊的上下文之外 --><!-- 'search-form' 模塊 --><form class=""search-block></form><!-- 在 'search-form' 模塊內(nèi)的 'input' 元素 --><input class="search-form__input"/><!-- 在 'search-form' 模塊內(nèi)的 'button' 元素 --><button class="search-form__button"></button>

每次這樣子寫,估計是個程序員,都得加班吧,哈哈!

一種希望

現(xiàn)在的網(wǎng)頁開發(fā),講究的是組件化的思想,因此,急需要可行的css Module方式來完成網(wǎng)頁組件的開發(fā)。自從2015年開始,國外就流行了CSS-in-JS(典型的代表,react的styled-components),還有一種就是CSS Module。

本篇談及后者,需要對前者進行了解的話,自行Google即可

對于css,大家都知道,它是一門描述類語言,并不存在動態(tài)性。那么,要如何去形成module呢。我們可以先來看一個react使用postcss的例子:

//example.css.article {    font-size: 14px;}.title {    font-size: 20px;}

之后,將這些命名打亂:

.zxcvb{    font-size: 14px;}.zxcva{    font-size: 20px;}

將之命名對應的內(nèi)容,放入到JSON文件中去:

{    "article": "zxcvb",    "title": "zxcva"}

之后,在js文件中運用:

import style from 'style.json';class Example extends Component{    render() {        return (            <div classname={style.article}>                <div classname={style.title}></div>            </div>        )    }}

這樣子,就描繪出了一副css module的原型。當然,我們不可能每次都需要手動去寫這些東西。我們需要自動化的插件幫助我們完成這一個過程。之后,我們應該先來了解一下postCSS。

我需要認識你

PostCSS是什么?或許,你會認為它是預處理器、或者后處理器等等。其實,它什么都不是。它可以理解為一種插件系統(tǒng)。使用它GitHub主頁上的介紹:

PostCSS is a tool for transforming CSS with JS plugins. These plugins can support variables and mixins, transpile future CSS syntax, inline images, and more.

你可以在使用預處理器的情況下使用它,也可以在原生的css中使用它。它都是支持的,并且它具備著一個龐大的生態(tài)系統(tǒng),例如你可能常用的Autoprefixer,就是PostCSS的一個非常受歡迎的插件,被Google, Shopify, Twitter, Bootstrap和CodePen等公司廣泛使用。

當然,我們也可以在CodePen中使用它:

這里推薦大家看一下PostCSS的深入系列

接下來,我們來看一下PostCSS的配置:

這里我們使用webpack+postcss+postcss-loader+cssnext+postcss-import的組合。

首先,我們可以通過yarn來安裝這些包:

yarn add --dev webpack extract-text-webpack-plugin css-loader file-loader postcss postcss-loader postcss-cssnext postcss-import

然后,我們配置一下webpack.config.js:

const webpack = require('webpack');const path = require('path');const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {  context: path.resolve(__dirname, 'src'),  entry: {    app: './app.js';  },  module: {    loaders: [      {        test: /\.css$/,        use: ExtractTextPlugin.extract({          use: [            {              loader: 'css-loader',              options: { importLoaders: 1 },            },            'postcss-loader',          ],        }),      },    ],  },  output: {    path: path.resolve(__dirname, 'dist/assets'),  },  plugins: [    new ExtractTextPlugin('[name].bundle.css'),  ],};

然后在根目錄下配置postcss.config.js

module.exports = {  plugins: {    'postcss-import': {},    'postcss-cssnext': {      browsers: ['last 2 versions', '> 5%'],    },  },};

之后,就可以在開發(fā)中使用cssnext的特性了

/* Shared */@import "shared/colors.css";@import "shared/typography.css";/* Components */@import "components/Article.css";
/* shared/colors.css */:root {  --color-black: rgb(0,0,0);  --color-blue: #32c7ff;}/* shared/typography.css */:root {  --font-text: "FF DIN", sans-serif;  --font-weight: 300;  --line-height: 1.5;}/* components/Article.css */.article {  font-size: 14px;  & a {    color: var(--color-blue);  }  & p {    color: var(--color-black);    font-family: var(--font-text);    font-weight: var(--font-weight);    line-height: var(--line-height);  }  @media (width > 600px) {    max-width: 30em;  }}

最后使用webpack進行編譯就可以了。

總結

PostCSS,國內(nèi)還沒有太流行起來,不過相信不久的將來也會逐漸的熱門,并且國內(nèi)的資源較少,不過最近新出了一本大漠老師們一起翻譯的書——《深入PostCSS Web設計》。有興趣的人也可以去看一下,學習一些前言的東西。本篇也只是大概的寫了一下PostCSS的東西,鑒于國內(nèi)資源較少,所以參考了一下國外的博文教材,下面會有鏈接。

如果你對我寫的有疑問,可以評論,如我寫的有錯誤,歡迎指正。你喜歡我的博客,請給我關注Star~呦。大家一起總結一起進步。歡迎關注我的github博客

參考鏈接

PostCSS-modules: make CSS great again!

PostCSS Deep Dive: What You Need to Know

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
webpack進階之插件篇
webpack4.0各個擊破(2)—— CSS篇
Webpack教程四:Loader
webpack2 項目
【第611期】CSS Modules 詳解及React 中實踐
十分鐘——帶你了解webpack的主要配置
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服