亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

了解前端理論:rscss和rsjs

2024-05-06 16:51:21
字體:
來源:轉載
供稿:網友

在前端開發中,我們會嘗試去定一些規則和約定,來讓項目質量更高,更易于維護。而對于這些規則和約定,我們也會希望它內容簡單,容易理解。

rscss和rsjs是一套比較新,也比較小巧的前端開發規則和約定,其中rs代表Reasonable System,所以可以理解為,追求“合理”的css和js。本文除了介紹它們,還會有一點補充以及我自己的看法,也推薦你點擊鏈接閱讀原作者給出的完整內容。

從css的疑問開始

rscss希望有效地改善寫css中的這樣幾個常見問題(css哲學三問):

  • 這個class到底什么意思?
  • 這個class還有地方用到嗎?
  • 我新寫的這個class,會有沖突嗎?

組件原則

rscss首先推崇的是以組件(Components)為基礎的思考方式。在各類前端框架中,幾乎都可以看到組件,如Bootstrap和Materialize:

rscss,rsjs

一個組件是這樣的感覺:

rscss,rsjs

小到一個按鈕,大到整個web應用,可見的視覺元素都可以這樣當做一個組件。

組件的命名

rscss推薦組件至少使用兩個單詞的命名,中間用短橫線(-)連接:

.search-form { /* ... */ }.article-card { /* ... */ }

組件的元素

組件內部的更細小的部分,當做組件的元素(Elements)。

rscss,rsjs

元素的命名

為了和前面的組件區分開來,元素的命名只使用一個單詞。

顯然,只有一個單詞是很容易沖突的,因此rscss建議以關系選擇符把元素和組件關聯起來:

.search-form > .field { /* ... */ }.search-form > .action { /* ... */ }

推薦子選擇符 > 而不是包含選擇符 (空格),以更好地避免沖突:

.article-card .title { /* okay */ }.article-card > .author { /* ? better */ }

如果確實需要用到多個單詞,直接連接它們(不使用短橫線等分隔符),以體現區別:

.profile-box > .firstname { /* ... */ }

為每一個組件的元素使用class名,不要使用標簽選擇符。有名字的元素會更有語義。

多種屬性或狀態

無論是組件還是元素,都可以有多種屬性或狀態(Variants,也可以叫變體):

rscss,rsjs

屬性或狀態的命名

使用短橫線(-)開頭來命名表示屬性或狀態的class。

/* component variants */.like-button.-wide { /* ... */ }.like-button.-disabled { /* ... */ }/* element variants */.shopping-card > .title.-small { /* ... */ }

對命名方式的解釋

rscss推薦的短橫線作為前綴的class名可能會讓你有一點驚訝,可以這樣寫的嗎?答案是的確可以,而且搭配得還相當巧妙。為什么這么說呢?請看w3c對css標識符的解釋:

In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+0080 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit.

其中ISO 10646等同于Unicode??梢钥吹?,w3c特意在css標識符一般使用的英文字母、數字以及一部分Unicode字符(U+0080以上)之外,提到了短橫線(-)和下劃線(_)也是可用的。

以短橫線作為前綴的class名相當于有了一個特殊的標記,一眼就可以提醒你這是一個表示屬性或狀態的class。

組件嵌套

組件是可以嵌套的。

rscss,rsjs

對應html類似這樣:

<div class="article-link"> <div class="vote-box"> ... </div> <h3 class="title">...</h3> <p class="meta">...</p></div>

嵌套中的屬性或狀態

當一個組件位于另一個組件內部的時候,可能會想要這個組件表現得特別一點。這個時候,建議不要使用關系選擇符把它們耦合在一起:

.article-header > .vote-box > .up { /* ? avoid this */ }

建議的做法是為組件增加一個屬性或狀態class:

<div class="article-header"> <div class="vote-box -highlight"> ... </div> ...</div>

然后以這個class為基礎來定義特別的樣式:

.vote-box.-highlight > .up { /* ... */ }

這樣做的目的是讓一個組件的樣式不依賴其所處的位置。OOCSS的原則之一,Separate container and content,也是這樣的理念。

布局思想

rscss推薦除一些具有固定寬高的特定元素(如頭像,logo)外,組件本身不定義任何影響布局位置的屬性:

  • 定位(positiontop、left、right、bottom
  • 浮動(float、clear
  • 外邊距(margin
  • 尺寸(width、height

這樣做的意思是說,如果把組件看做一個整體,它應該是自適應的。

需要定義布局位置屬性的情況

如果要定義組件的影響布局位置的屬性,建議使用關系選擇符把組件和它所處的環境關聯起來:

.article-list > .article-card { width: 33.3%; float: left;}.article-card { /* ... */ }.article-card > .image { /* ... */ }.article-card > .title { /* ... */ }.article-card > .category { /* ... */ }

在上面這段代碼可以注意到,“組件本身的外觀”與“組件在某一環境中的位置”被明確地分離了。

輔助類

rscss推薦輔助類(Helpers)單獨存放一個文件,且class名以下劃線(_)開頭。輔助類也常會用到!important,對應的,應盡可能少使用輔助類。

._pull-left { float: left !important; }._pull-right { float: right !important; }

下劃線(_)作為前綴的class名,如前文已經解釋過的那樣,也是作為一個特殊的標記提醒你這是一個輔助類,請謹慎使用它。

輔助類在前端框架中也很常見。

rscss與其他css理論的比較

rscss的組件(Component),元素(Element)等概念,在BEM、SMACSS這些css理論中也有類似的存在。它們比較起來是這樣的:

RSCSS BEM SMACSS Component Block Module Element Element Sub-Component Layout ? Layout Variant Modifier Sub-Module & State

以上就是rscss的主要內容了,下面來看看rsjs。

關注傳統web應用的rsjs

rsjs關注的是非單頁應用(non-SPA web application),也就是我們通常理解的有很多頁,主要使用jQuery,而且每個頁都可以有自己的.js文件的傳統網站。

現在已經有了可遵循的JavaScript代碼本身的風格指南,因此,rsjs只對一些其他的要點提出建議,如命名空間,文件組織方式。

行為原則

rsjs推薦把由JavaScript實現的交互功能當做一次只影響一個組件(Component)的行為(Behavior)。下面是一個參考示例:

<div class="main-navbar" data-js-collapsible-nav> <button class="expand" data-js-expand>Expand</button> <a href="/">Home</a> <ul>...</ul></div>/* Behavior - behaviors/collapsible-nav.js */$(function () { var $nav = $("[data-js-collapsible-nav]"); if (!$nav.length) return; $nav .on("click", "[data-js-expand]", function () {  $nav.addClass("-expanded"); }) .on("mouseout", function () {  $nav.removeClass("-expanded"); });});

這其中包含了多項建議。

使用data屬性

建議使用html5的data自定義屬性data-js-___來標記和一個行為有關的DOM元素。

相比用ID和class來選取元素,這種data屬性的形式一方面更具有明確的意義,提醒你這是一個和交互行為有關的元素,另一方面更易于復用,在任何DOM結構里添加這樣的data屬性即可獲得對應的行為。

為每個行為單獨建立文件

建議每一個行為對應的JavaScript代碼都分離到單獨的文件里,并以文件名明示。文件名可以參照data-js-___這個屬性名里的對應名稱,這樣,根據屬性名就很容易找到對應的JavaScript代碼。

一個可能的文件目錄結構:

└── javascripts/ └── behaviors/   ├── collapsible-nav.js   ├── avatar-hover.js   ├── popup-dialog.js   └── notification.js

不使用行內JavaScript

在html中不要以<script>...</script>onclick=""等形式添加行內JavaScript代碼。通過保持行為的邏輯代碼獨立于html,可以使代碼更易于維護。

從rsjs的內容來看,在已有React、Vue等庫的今天,“行為獨立于內容”的約定仍然對傳統的以jQuery為主的Web應用有一定意義。

初始數據的獲取方式

傳統Web站點的一個常見的場景是,后端語言在頁面中預先輸出某些數據,然后JavaScript會取用它們。你可能見到過下面這樣<script>標簽的實現方式,但顯然,根據上一條建議,這是應避免的。

<script>window.UserData = { email: "john@gmail.com", id: 9283 }</script>

rsjs建議的方案是,如果這些數據只需要一個組件使用,可以利用之前提到的data屬性(保存為值),由行為的JavaScript代碼來自行取出。

<!-- ? Used by the user-info behavior --><div class="user-info" data-js-user-info='{"email":"john@gmail.com","id":9283}'>

如果是多個組件使用的數據,可以使用<head>里的meta標簽。

<head> ... <!-- option 1 --> <meta property="app:user_data" content='{"email":"john@gmail.com","id":9283}'> <!-- option 2 --> <meta property="app:user_data:email" content="john@gmail.com"> <meta property="app:user_data:id" content="9283">

命名空間

rsjs建議使用盡可能少的全局變量。共用的類,函數,放到單個Object里,比如叫App

if (!window.App) window.App = {};App.Editor = function() { // ...};

在多個行為之間可復用的幫助方法,可以單獨建立Object,并將它們分文件保存在helpers/

/* helpers/format_error.js */if (!window.Helpers) window.Helpers = {};Helpers.formatError = function (err) { return "" + err.project_id + " error: " + err.message;};

第三方庫的處理

rsjs建議如果引入第三方庫,也做成組件行為的形式。比如,Select2的功能,可以只影響帶有屬性data-js-select2的元素。

// select2.js -- affects `[data-js-select2]`$(function () { $("[data-js-select2]").select2();});

所有第三方庫的代碼可以集中到一個類似vendor.js的文件,并和站點本身的代碼各自獨立。這樣,當站點更新代碼的時候,用戶可以直接利用緩存,而并不需要再次獲取這些第三方庫代碼。

rsjs對自己的歸納

rsjs認為自身的內容更偏向于對開發者友好,也就是更易于維護,而在性能上(對用戶友好)可能沒有做到最好。以上提到的各項建議,也是有利有弊,rsjs只是在權衡了利弊的基礎上得到的更利于長期維護的結論。

rsjs不是萬金油,它不適用于單頁應用(SPA)等前端功能很復雜的情況。它關注的是的那種多個網頁,每個網頁一點JavaScript交互的傳統網站。

結語

rscss和rsjs所用的“合理”是一個很取巧的表述,不是完美,不是最好,也不是出色,它只是在說希望代碼能“合乎道理”。rscss和rsjs大概就是這樣,以簡約的風格,不長的篇幅,追求著“小而合理”。

目前rsjs還在更新中(work-in-progress),rscss則已經比較成熟。很推薦試試其中你也認為合理的建議!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影免费在线观看| 国产成人精品国内自产拍免费看| 日本一本a高清免费不卡| 精品国产一区二区三区久久狼5月| 亚洲欧美日本伦理| 亚洲xxxxx| 国产精品一区二区三区在线播放| 日韩电影大片中文字幕| 日韩电影第一页| 国产精品九九久久久久久久| 一区二区欧美亚洲| 亚洲欧美第一页| 中日韩美女免费视频网站在线观看| www.xxxx欧美| 亚洲精品视频在线播放| 欧美另类高清videos| 91丨九色丨国产在线| 亚洲曰本av电影| 精品成人久久av| 国产精品777| 97精品国产97久久久久久春色| 欧美成人精品一区二区三区| 亚洲女人天堂网| 国产精品免费网站| 欧美又大又硬又粗bbbbb| 欧美电影电视剧在线观看| 91国产一区在线| 亚洲区在线播放| 久久夜色精品国产欧美乱| www.亚洲免费视频| 欧美一级电影在线| 国产精品一区二区三区毛片淫片| 久久综合久久88| 精品一区二区三区四区在线| 国产欧美va欧美va香蕉在| 91高清免费视频| 欧美性生交xxxxxdddd| 欧美在线性爱视频| 97久久久免费福利网址| 538国产精品一区二区免费视频| 日韩欧美999| 国产午夜精品免费一区二区三区| 主播福利视频一区| 亚洲精品综合久久中文字幕| 久久国产精品久久精品| 久久久久久久久久久久久久久久久久av| 国产99久久精品一区二区| 亚洲天堂精品在线| 亚洲视频电影图片偷拍一区| 精品福利樱桃av导航| 国外成人免费在线播放| 97视频在线观看播放| 精品毛片网大全| 91精品国产99| 日产日韩在线亚洲欧美| 亚洲精品久久久久久久久| 不卡av电影在线观看| 欧美性生交大片免费| 欧美成人激情视频免费观看| 亚洲精品美女在线观看| 97视频在线观看视频免费视频| 日韩av免费观影| 亚洲午夜未满十八勿入免费观看全集| 精品国内产的精品视频在线观看| 久久久亚洲精品视频| 亚洲剧情一区二区| 97avcom| 欧美在线日韩在线| 成人在线免费观看视视频| 久久精品视频播放| 91大神福利视频在线| 尤物九九久久国产精品的特点| 欧美激情久久久久| 中文字幕亚洲在线| 欧美日韩国产限制| 亚洲无亚洲人成网站77777| 91免费精品视频| 欧美性猛交xxxx免费看久久久| 亚洲九九九在线观看| 国内成人精品视频| 国产主播欧美精品| 国产精品一区二区av影院萌芽| 亚洲国产成人精品一区二区| 欧美一级电影免费在线观看| 欧美日韩黄色大片| 日韩精品一区二区视频| 国产一区二区三区免费视频| 欧美在线视频免费| 91久久精品一区| 日韩亚洲欧美中文在线| 国产精品美乳一区二区免费| 欧美精品videofree1080p| 日韩精品中文字幕久久臀| 欧美日韩亚洲一区二区三区| 欧美电影在线观看高清| 91影视免费在线观看| 精品国内产的精品视频在线观看| 亚洲综合成人婷婷小说| 国产精品美女视频网站| 国产一区二区丝袜| 欧美亚洲国产日本| 日韩亚洲欧美中文在线| 日本三级久久久| 国产伦精品一区二区三区精品视频| 欧美高清在线视频观看不卡| 国产精品入口日韩视频大尺度| 色一情一乱一区二区| 亚洲成人国产精品| 欧美电影免费在线观看| 欧美激情视频网| 久久777国产线看观看精品| 久久精品视频中文字幕| 日本韩国欧美精品大片卡二| 国产欧美在线播放| 亚洲iv一区二区三区| 国产精品∨欧美精品v日韩精品| 操人视频在线观看欧美| 日韩欧美在线看| zzijzzij亚洲日本成熟少妇| 中文字幕日韩精品在线观看| 国产成人一区三区| 欧美猛交免费看| 精品国产91乱高清在线观看| 亚洲人成绝费网站色www| 精品视频—区二区三区免费| 国产精品青青在线观看爽香蕉| 亚洲人成网7777777国产| 91社影院在线观看| 色妞久久福利网| 成人欧美在线视频| 91精品视频免费| 亚洲天堂日韩电影| 97精品一区二区视频在线观看| 亚洲成人久久久| 精品视频—区二区三区免费| 一级做a爰片久久毛片美女图片| 中文字幕日韩欧美在线| 岛国视频午夜一区免费在线观看| 欧美极品美女电影一区| 91豆花精品一区| 亚洲全黄一级网站| 国产a∨精品一区二区三区不卡| 欧美成人精品三级在线观看| 国产三级精品网站| 亚洲少妇中文在线| 在线视频欧美日韩| 国产成人久久精品| 欧美插天视频在线播放| 中文字幕成人在线| 国产精品亚洲第一区| 日韩欧美视频一区二区三区| 亚洲免费伊人电影在线观看av| 久久久久久久久国产精品| 日韩精品久久久久久久玫瑰园| 欧美视频在线免费看| 成人av色在线观看| 久久精品国产综合| 欧美激情一区二区三区久久久| 日韩一区二区三区xxxx| 久久视频国产精品免费视频在线| 日韩在线观看你懂的| 成人久久精品视频| 91av在线网站| 欧美激情影音先锋|