首頁(yè)

高性能Javascript讀書(shū)總結(jié)

前端達(dá)人

1. 加載和執(zhí)行

盡量將所有的<script>標(biāo)簽放在</body>標(biāo)簽之前,確保腳本執(zhí)行前頁(yè)面已經(jīng)完成了渲染,避免腳本的下載阻塞其他資源(例如圖片)的下載。

合并腳本,減少頁(yè)面中的<script>標(biāo)簽

使用<script>標(biāo)簽的defer和async屬性(兩者的區(qū)別見(jiàn)這里)

通過(guò)Javascript動(dòng)態(tài)創(chuàng)建<script>標(biāo)簽插入文檔來(lái)下載,其不會(huì)影響頁(yè)面其他進(jìn)程

2.數(shù)據(jù)存取

由于作用域鏈的機(jī)制,訪問(wèn)局部變量比訪問(wèn)跨作用域變量更快,因此在函數(shù)中若要多次訪問(wèn)跨作用域變量,則可以用局部變量保存。

避免使用with語(yǔ)句,其會(huì)延長(zhǎng)作用域鏈

嵌套的對(duì)象成員會(huì)導(dǎo)致引擎搜索所有對(duì)象成員,避免使用嵌套,例如window.location.href

對(duì)象的屬性和方法在原型鏈的位置越深,訪問(wèn)的速度也越慢

3.Dom編程

進(jìn)行大段HTML更新時(shí),推薦使用innerHTML,而不是DOM方法

HTML集合是一個(gè)與文檔中元素綁定的類(lèi)數(shù)組對(duì)象,其長(zhǎng)度隨著文檔中元素的增減而動(dòng)態(tài)變化,因此避免在每次循環(huán)中直接讀取HTML集合的length,容易導(dǎo)致死循環(huán)

使用節(jié)點(diǎn)的children屬性,而不是childNodes屬性,前者訪問(wèn)速度更快,且不包含空白文本和注釋節(jié)點(diǎn)。

瀏覽器的渲染過(guò)程包括構(gòu)建DOM樹(shù)和渲染樹(shù),當(dāng)DOM元素的幾何屬性變化時(shí),需要重新構(gòu)造渲染樹(shù),這一過(guò)程稱(chēng)為“重排”,完成重排后,瀏覽器會(huì)重新繪制受影響的部分到屏幕中,這一過(guò)程稱(chēng)為“重繪”。因此應(yīng)該盡量合并多次對(duì)DOM的修改,或者先將元素脫離文檔流(display:none、文檔片段),應(yīng)用修改后,再插入文檔中。

每次瀏覽器的重排時(shí)都會(huì)產(chǎn)生消耗,大多數(shù)瀏覽器會(huì)通過(guò)隊(duì)列化修改并批量執(zhí)行來(lái)優(yōu)化重排過(guò)程,可當(dāng)訪問(wèn)元素offsetTop、scrollTop、clientTop、getComputedStyle等一系列布局屬性時(shí),會(huì)強(qiáng)制瀏覽器立即進(jìn)行重排返回正確的值。因此不要在dom布局信息改變時(shí),訪問(wèn)這些布局屬性。

當(dāng)修改同個(gè)元素多個(gè)Css屬性時(shí),可以使用CssText屬性進(jìn)行一次性修改樣式,減少瀏覽器重排和重繪的次數(shù)

當(dāng)元素發(fā)生動(dòng)畫(huà)時(shí),可以使用絕對(duì)定位使其脫離文檔流,動(dòng)畫(huà)結(jié)束后,再恢復(fù)定位。避免動(dòng)畫(huà)過(guò)程中瀏覽器反復(fù)重排文檔流中的元素。

多使用事件委托,減少監(jiān)聽(tīng)事件

4.算法和流程控制

for循環(huán)和while循環(huán)性能差不多,除了for-in循環(huán)最慢(其要遍歷原型鏈)

循環(huán)中要減少對(duì)象成員及數(shù)組項(xiàng)的查詢(xún)次數(shù),可以通過(guò)倒序循環(huán)提高性能

循環(huán)次數(shù)大于1000時(shí),可運(yùn)用Duff Devices減少迭代次數(shù)

switch比if-else快,但如果具有很多離散值時(shí),可使用數(shù)組或?qū)ο髞?lái)構(gòu)建查找表

遞歸可能會(huì)造成調(diào)用棧溢出,可將其改為循環(huán)迭代

如果可以,對(duì)一些函數(shù)的計(jì)算結(jié)果進(jìn)行緩存

5.字符串和正則表達(dá)式

進(jìn)行大量字符串的連接時(shí),+和+=效率比數(shù)組的join方法要高

當(dāng)創(chuàng)建了一個(gè)正則表達(dá)式對(duì)象時(shí),瀏覽器會(huì)驗(yàn)證你的表達(dá)式,然后將其轉(zhuǎn)化為一個(gè)原生代碼程序,用戶執(zhí)行匹配工作。當(dāng)你將其賦值給變量時(shí),可以避免重復(fù)執(zhí)行該步驟。

當(dāng)正則進(jìn)入使用狀態(tài)時(shí),首先要確定目標(biāo)字符串的起始搜索位置(字符串的起始位置或正則表達(dá)式的lastIndex屬性),之后正則表達(dá)式會(huì)逐個(gè)檢查文本和正則模式,當(dāng)一個(gè)特定的字元匹配失敗時(shí),正則表達(dá)式會(huì)試著回溯到之前嘗試匹配的位置,然后嘗試其他路徑。如果正則表達(dá)式所有的可能路徑都沒(méi)有匹配到,其會(huì)將起始搜索位置下移一位,重新開(kāi)始檢查。如果字符串的每個(gè)字符都經(jīng)歷過(guò)檢查,沒(méi)有匹配成功,則宣布徹底失敗。

當(dāng)正則表達(dá)式不那么具體時(shí),例如.和[\s\S]等,很可能會(huì)出現(xiàn)回溯失控的情況,在js中可以應(yīng)用預(yù)查模擬原子組(?=(pattern))\1來(lái)避免不必要的回溯。除此之外,嵌套的量詞,例如/(A+A+)+B/在匹配"AAAAAAAA"時(shí)可能會(huì)造成驚人的回溯,應(yīng)盡量避免使用嵌套的量詞或使用預(yù)查模擬原子組消除回溯問(wèn)題。

將復(fù)雜的正則表達(dá)式拆分為多個(gè)簡(jiǎn)單的片段、正則以簡(jiǎn)單、必需的字元開(kāi)始、減少分支數(shù)量|,有助于提高匹配的效率。

6.快速響應(yīng)的用戶界面

  • 單個(gè)JavaScript運(yùn)算操作時(shí)間不應(yīng)該超出100ms,否則可能會(huì)阻塞用戶操作
  • 如果要執(zhí)行長(zhǎng)時(shí)間的運(yùn)算,可以通過(guò)定時(shí)器將計(jì)算過(guò)程分割成多個(gè)步驟,使UI可以得到更新,例如
setTimeout(function(){
    process(todo.shift());

    if (todo.length > 0) {
        setTimeout(arguments.callee, 25);
    } else {
        callback();
    }
})




較長(zhǎng)時(shí)間的計(jì)算過(guò)程也可以按照代碼運(yùn)行的時(shí)間進(jìn)行分割,每次控制運(yùn)行的時(shí)間,例如

setTimeout(function(){
    let start = +new Date();
    do {
        process(todo.shift());
    } while(todo.length > 0 && (+new Date() - start) < 50)

    if (todo.length > 0) {
        setTimeout(arguments.callee, 25);
    } else {
        callback();
    }
})


  • 高頻率重復(fù)的定時(shí)器數(shù)量盡量要少,建議使用一個(gè)獨(dú)立的重復(fù)定時(shí)器
  • 使用WebWork進(jìn)行計(jì)算

7. AJAX

  • 設(shè)置HTTP頭部信息進(jìn)行緩存,例如
Expires: Mon,28 Jul 2018 23:30:30 GMT


  • 對(duì)于一些函數(shù)的計(jì)算結(jié)果進(jìn)行本地緩存

8. 編程實(shí)踐

  • 避免使用eval、Function進(jìn)行雙重求值
  • 使用Object/Array字面量定義,不要使用構(gòu)造函數(shù)
  • 使用延遲加載消除函數(shù)中重復(fù)的工作
  • 使用位操作,例如與1進(jìn)行按位與計(jì)算,得到奇偶交替


if (i & 1) {
    className = 'odd';
} else {
    className = 'even';
}   


  • 多使用JS內(nèi)置的原生方法,例如Math對(duì)象等

9.構(gòu)建和部署

  • 合并、壓縮多個(gè)js文件
  • 設(shè)置HTTP緩存
  • 使用內(nèi)容分發(fā)網(wǎng)絡(luò)CDN

10.性能分析工具

————————————————
版權(quán)聲明:本文為CSDN博主「PAT-python-zjw」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zjw_python/java/article/details/105293878

v-if 和 v-show的區(qū)別

前端達(dá)人

簡(jiǎn)單來(lái)說(shuō),v-if 的初始化較快,但切換代價(jià)高;v-show 初始化慢,但切換成本低

1.共同點(diǎn)

都是動(dòng)態(tài)顯示DOM元素

2.區(qū)別

(1)手段:
v-if是動(dòng)態(tài)的向DOM樹(shù)內(nèi)添加或者刪除DOM元素;
v-show是通過(guò)設(shè)置DOM元素的display樣式屬性控制顯隱;
(2)編譯過(guò)程:
v-if切換有一個(gè)局部編譯/卸載的過(guò)程,切換過(guò)程中合適地銷(xiāo)毀和重建內(nèi)部的事件監(jiān)聽(tīng)和子組件;
v-show只是簡(jiǎn)單的基于css切換;
(3)編譯條件:
v-if是惰性的,如果初始條件為假,則什么也不做;只有在條件第一次變?yōu)檎鏁r(shí)才開(kāi)始局部編譯(編譯被緩存?編譯被緩存后,然后再切換的時(shí)候進(jìn)行局部卸載);
v-show是在任何條件下(首次條件是否為真)都被編譯,然后被緩存,而且DOM元素保留;
(4)性能消耗:
v-if有更高的切換消耗;
v-show有更高的初始渲染消耗;
(5)使用場(chǎng)景:
v-if適合運(yùn)營(yíng)條件不大可能改變;
v-show適合頻繁切換。



前端架構(gòu)演進(jìn)及主流UI

前端達(dá)人

文章目錄



    前端三要素

    HTML(結(jié)構(gòu)):超文本標(biāo)記語(yǔ)言(Hyper Text Markup Language),決定網(wǎng)頁(yè)的結(jié)構(gòu)和內(nèi)容
    CSS(表現(xiàn)):層疊樣式表(Cascading Style Sheets),設(shè)定網(wǎng)頁(yè)的表現(xiàn)樣式
    JavaScript(行為):是一種弱類(lèi)型腳本語(yǔ)言,其源代碼不需經(jīng)過(guò)編譯,而是由瀏覽器解釋運(yùn)行, 用于控制網(wǎng)頁(yè)的行為
    HTML 稱(chēng)為超文本標(biāo)記語(yǔ)言,是一種標(biāo)識(shí)性的語(yǔ)言。它通過(guò)一系列標(biāo)簽組合,組成一個(gè)個(gè)不同結(jié)構(gòu)的頁(yè)面!關(guān)于html標(biāo)簽的學(xué)習(xí)可以去菜鳥(niǎo)教程學(xué)習(xí),此處不再贅述!

    CSS層疊樣式表 也是一門(mén)標(biāo)記語(yǔ)言,并不是編程語(yǔ)言,因此不可以自定義變量,不可以引用等,換句話說(shuō)
    就是不具備任何語(yǔ)法支持,它主要缺陷如下:

    語(yǔ)法不夠強(qiáng)大,比如無(wú)法嵌套書(shū)寫(xiě),導(dǎo)致模塊化開(kāi)發(fā)中需要書(shū)寫(xiě)很多重復(fù)的選擇器;
    沒(méi)有變量和合理的樣式復(fù)用機(jī)制,使得邏輯上相關(guān)的屬性值必須以字面量的形式重復(fù)輸出,導(dǎo)致難 以維護(hù);
    這就導(dǎo)致了我們?cè)诠ぷ髦袩o(wú)端增加了許多工作量。為了解決這個(gè)問(wèn)題,前端開(kāi)發(fā)人員會(huì)使用一種稱(chēng)之為 【CSS 預(yù)處理器】 的工具,提供 CSS 缺失的樣式層復(fù)用機(jī)制、減少冗余代碼,提高樣式代碼的可維護(hù) 性。大大提高了前端在樣式上的開(kāi)發(fā)效率。

    什么是CSS 預(yù)處理器呢?

    CSS 預(yù)處理器定義了一種新的語(yǔ)言,其基本思想是,用一種專(zhuān)門(mén)的編程語(yǔ)言,為 CSS 增加了一些編程的 特性,將 CSS 作為目標(biāo)生成文件,然后開(kāi)發(fā)者就只要使用這種語(yǔ)言進(jìn)行 CSS 的編碼工作。轉(zhuǎn)化成通俗易 懂的話來(lái)說(shuō)就是“用一種專(zhuān)門(mén)的編程語(yǔ)言,進(jìn)行 Web 頁(yè)面樣式設(shè)計(jì),再通過(guò)編譯器轉(zhuǎn)化為正常的 CSS 文 件,以供項(xiàng)目使用”。

    常用的 CSS 預(yù)處理器有哪些?

    SASS:基于 Ruby,通過(guò)服務(wù)端處理,功能強(qiáng)大。解析效率高。需要學(xué)習(xí) Ruby 語(yǔ)言,上手難度高于 LESS。
    LESS:基于 NodeJS,通過(guò)客戶端處理,使用簡(jiǎn)單。功能比 SASS 簡(jiǎn)單,解析效率也低于 SASS,但在實(shí)際開(kāi)發(fā)中足夠了,所以我們后臺(tái)人員如果需要的話,建議使用 LESS。
    JavaScript 一門(mén)弱類(lèi)型腳本語(yǔ)言,其源代碼在發(fā)往客戶端運(yùn)行之前不需經(jīng)過(guò)編譯,而是將文本格式的字 符代碼發(fā)送給瀏覽器由瀏覽器解釋運(yùn)行。

    Native 原生 JS 開(kāi)發(fā)
    原生 JS 開(kāi)發(fā),也就是讓我們按照 【ECMAScript】 標(biāo)準(zhǔn)的開(kāi)發(fā)方式,簡(jiǎn)稱(chēng)是 ES,特點(diǎn)是所有瀏覽器都支持。

    ES 標(biāo)準(zhǔn)已發(fā)布如下版本:

    ES3
    ES4(內(nèi)部,未正式發(fā)布)
    ES5(全瀏覽器支持)
    ES6(常用,當(dāng)前主流版本:webpack打包成為ES5支持!)
    ES7
    ES8
    ES9(草案階段)
    從 ES6 開(kāi)始每年發(fā)布一個(gè)版本,以年份作為名稱(chēng),區(qū)別就是逐步增加新特性。

    TypeScript 微軟的標(biāo)準(zhǔn)
    TypeScript 是一種由微軟開(kāi)發(fā)的自由和開(kāi)源的編程語(yǔ)言。它是 JavaScript 的一個(gè)超集,而且本質(zhì)上向這 個(gè)語(yǔ)言添加了可選的靜態(tài)類(lèi)型和基于類(lèi)的面向?qū)ο缶幊?。由安德斯·海爾斯伯?C#、Delphi、 TypeScript 之父;.NET 創(chuàng)立者)主導(dǎo)。

    JavaScript 框架

    1.jQuery庫(kù)

    大家最熟知的 JavaScript庫(kù),優(yōu)點(diǎn)是簡(jiǎn)化了 DOM 操作,缺點(diǎn)是 DOM 操作太頻繁,影響前端性能;在 前端眼里使用它僅僅是為了兼容 IE6、7、8;

    2.Angular庫(kù)

    Google 收購(gòu)的前端框架,由一群 Java 程序員開(kāi)發(fā),其特點(diǎn)是將后臺(tái)的 MVC 模式搬到了前端并增加了模 塊化開(kāi)發(fā)的理念,與微軟合作,采用 TypeScript 語(yǔ)法開(kāi)發(fā);對(duì)后臺(tái)程序員友好,對(duì)前端程序員不太友 好;最大的缺點(diǎn)是版本迭代不合理(如:1代 -> 2代,除了名字,基本就是兩個(gè)東西;已推出了 Angular6)

    3.React

    Facebook 出品,一款高性能的 JS 前端框架;特點(diǎn)是提出了新概念 【虛擬 DOM】 用于減少真實(shí) DOM 操作,在內(nèi)存中模擬 DOM 操作,有效的提升了前端渲染效率;缺點(diǎn)是使用復(fù)雜,因?yàn)樾枰~外學(xué)習(xí)一 門(mén) 【JSX】 語(yǔ)言;

    4.Vue

    一款漸進(jìn)式 JavaScript 框架,所謂漸進(jìn)式就是逐步實(shí)現(xiàn)新特性的意思,如實(shí)現(xiàn)模塊化開(kāi)發(fā)、路由、狀態(tài) 管理等新特性。

    其特點(diǎn)是綜合了 Angular(模塊化) 和 React(虛擬 DOM) 的優(yōu)點(diǎn);

    5.Axios

    前端通信框架;因?yàn)?Vue 的邊界很明確,就是為了處理 DOM,所以并不具備通信能力,此時(shí)就需要額 外使用一個(gè)通信框架與服務(wù)器交互;當(dāng)然也可以直接選擇使用 jQuery 提供的 A JAX 通信功能;

    JavaScript 構(gòu)建工具

    Babel:JS 編譯工具,主要用于瀏覽器不支持的 ES 新特性,比如用于編譯 TypeScript
    WebPack:模塊打包器,主要作用是打包、壓縮、合并及按序加載

    NodeJs


    Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境,說(shuō)白了就是運(yùn)行在服務(wù)端的JavaScript;

    前端人員為了方便開(kāi)發(fā)也需要掌握一定的后端技術(shù),但我們 Java 后臺(tái)人員知道后臺(tái)知識(shí)體系極其龐大復(fù) 雜,所以為了方便前端人員開(kāi)發(fā)后臺(tái)應(yīng)用,就出現(xiàn)了 NodeJS 這樣的技術(shù)。NodeJS 的作者已經(jīng)聲稱(chēng)放棄 NodeJS(說(shuō)是架構(gòu)做的不好再加上笨重的node_modules,可能讓作者不爽了吧),開(kāi)始開(kāi)發(fā)全新架構(gòu)的 什么是Deno?跟Node.js有何區(qū)別?

    既然是后臺(tái)技術(shù),那肯定也需要框架和項(xiàng)目管理工具,NodeJS 框架及項(xiàng)目管理工具如下:

    Express: NodeJS 框架
    Koa: Express 簡(jiǎn)化版
    NPM: 項(xiàng)目綜合管理工具,類(lèi)似于 Maven
    YARN: NPM 的替代方案,類(lèi)似于 Maven 和 Gradle 的關(guān)系

    常用UI框架


    Ant-Design:阿里巴巴出品,基于 React 的 UI 框架
    ElementUI、MintUi、iview、ic、:餓了么出品,基于 Vue 的 UI 框架
    Bootstrap:Twitter 推出的一個(gè)用于前端開(kāi)發(fā)的開(kāi)源工具包
    AmazeUI:又叫“妹子 UI”,一款 HTML5 跨屏前端框架
    Layui:輕量級(jí)框架(Layer)
    Ant-Design

    ant.design是基于react開(kāi)發(fā)的一個(gè)解放ui和前端的工具,它提供了一致的設(shè)計(jì)方便我們快速開(kāi)發(fā)和減少不必要的設(shè)計(jì)與代碼,很多實(shí)用react框架的開(kāi)發(fā)者都已經(jīng)在使用ant.design了,且其在github上的star數(shù)也早已上萬(wàn),足見(jiàn)其火熱程度。

    ant.design的目的也在于提高用戶、開(kāi)發(fā)者等多方的體驗(yàn)與幸福感。

    ant.design設(shè)計(jì)很精妙,vue的iview就是模仿ant.design來(lái)實(shí)現(xiàn)的

    官網(wǎng)地址:https://ant.design/index-cn
    github地址:https://github.com/ant-design/ant-design/
    ElementUi

    ElementUi是餓了么前端開(kāi)源維護(hù)的VueUI組件庫(kù),組件齊全基本涵蓋后臺(tái)所需的所有組件,文檔講解詳細(xì),例子也很豐富。主要用于開(kāi)發(fā)PC端的頁(yè)面,是一個(gè)質(zhì)量比較高的VueUI組件庫(kù)!

    官網(wǎng)地址:http://element-cn.eleme.io/#/zh-CN
    github地址:https://github.com/ElementUI/element-starter
    vue-element-admin:https://github.com/PanJiaChen/vue-element-admin
    MintUi

    MintUi是由餓了么前端團(tuán)隊(duì)推出的一個(gè)基于 Vue.js的移動(dòng)端組件庫(kù),組件比較單一,功能簡(jiǎn)單易上手!

    官網(wǎng)地址:https://mint-ui.github.io/#!/zh-cn
    github地址:https://github.com/ElemeFE/mint-ui
    iview

    iview 是一個(gè)強(qiáng)大的基于 Vue 的 UI 庫(kù),有很多實(shí)用的基礎(chǔ)組件比 elementui 的組件更豐富,主要服務(wù)于 PC 界面的中后臺(tái)產(chǎn)品。使用單文件的 Vue 組件化開(kāi)發(fā)模式 基于 npm + webpack + babel 開(kāi)發(fā),支持 ES2015 高質(zhì)量、功能豐富 友好的 API ,自由靈活地使用空間。

    官網(wǎng)地址:https://www.iviewui.com/
    github地址:https://github.com/TalkingData/iview-weapp
    iview-admin: https://github.com/iview/iview-admin
    備注:屬于前端主流框架,選型時(shí)可考慮使用,主要特點(diǎn)是移動(dòng)端支持較多

    ICE

    飛冰是阿里巴巴團(tuán)隊(duì)基于 React/Angular/Vue 的中后臺(tái)應(yīng)用解決方案,在阿里巴巴內(nèi)部,已經(jīng)有 270 多 個(gè)來(lái)自幾乎所有 BU 的項(xiàng)目在使用。飛冰包含了一條從設(shè)計(jì)端到開(kāi)發(fā)端的完整鏈路,幫助用戶快速搭建 屬于自己的中后臺(tái)應(yīng)用。

    官網(wǎng)地址:https://alibaba.github.io/ice
    github地址 :https://github.com/alibaba/ice
    備注:主要組件還是以 React 為主,對(duì) Vue 的支持還不太完善, 目前尚處于觀望階段

    VantUI

    Vant UI 是有贊前端團(tuán)隊(duì)基于有贊統(tǒng)一的規(guī)范實(shí)現(xiàn)的 Vue 組件庫(kù),提供了一整套 UI 基礎(chǔ)組件和業(yè)務(wù)組 件。通過(guò) Vant,可以快速搭建出風(fēng)格統(tǒng)一的頁(yè)面,提升開(kāi)發(fā)效率。

    官網(wǎng)地址: https://youzan.github.io/vant/#/zh-CN/intro
    github地址: https://github.com/youzan/vant
    AtUi

    at-ui是一款基于Vue 2.x的前端UI組件庫(kù),主要用于快速開(kāi)發(fā)PC網(wǎng)站產(chǎn)品。 它提供了一套npm + webpack + babel 前端開(kāi)發(fā)工作流程,CSS樣式獨(dú)立,即使采用不同的框架實(shí)現(xiàn)都能保持統(tǒng)一的 UI風(fēng)格。

    官網(wǎng)地址:https://at-ui.github.io/at-ui/#/zh
    github地址: https://github.com/at-ui/at-ui
    CubeUI
    cube-ui 是滴滴團(tuán)隊(duì)開(kāi)發(fā)的基于 Vue.js 實(shí)現(xiàn)的精致移動(dòng)端組件庫(kù)。支持按需引入和后編譯,輕量靈活; 擴(kuò)展性強(qiáng),可以方便地基于現(xiàn)有組件實(shí)現(xiàn)二次開(kāi)發(fā).

    官網(wǎng)地址:https://didi.github.io/cube-ui/#/zh-CN
    github地址:https://github.com/didi/cube-ui/
    Flutter

    Flutter 是谷歌的移動(dòng)端 UI 框架,可在極短的時(shí)間內(nèi)構(gòu)建 Android 和 iOS 上高質(zhì)量的原生級(jí)應(yīng)用。 Flutter 可與現(xiàn)有代碼一起工作, 它被世界各地的開(kāi)發(fā)者和組織使用, 并且 Flutter 是免費(fèi)和開(kāi)源的。

    官網(wǎng)地址:https://flutter.dev/docs
    github地址:https://github.com/flutter/flutter
    備注:Google 出品,主要特點(diǎn)是快速構(gòu)建原生 APP 應(yīng)用程序,如做混合應(yīng)用該框架為必選框架

    Ionic

    Ionic 既是一個(gè) CSS 框架也是一個(gè) Javascript UI 庫(kù),Ionic 是目前最有潛力的一款 HTML5 手機(jī)應(yīng)用開(kāi)發(fā) 框架。通過(guò) SASS 構(gòu)建應(yīng)用程序,它提供了很多 UI 組件來(lái)幫助開(kāi)發(fā)者開(kāi)發(fā)強(qiáng)大的應(yīng)用。它使用 JavaScript MVVM 框架和 AngularJS/Vue 來(lái)增強(qiáng)應(yīng)用。提供數(shù)據(jù)的雙向綁定,使用它成為 Web 和移動(dòng) 開(kāi)發(fā)者的共同選擇。

    官網(wǎng)地址:https://ionicframework.com/
    github地址:https://github.com/ionic-team/ionic
    mpvue

    mpvue 是美團(tuán)開(kāi)發(fā)的一個(gè)使用 Vue.js 開(kāi)發(fā)小程序的前端框架,目前支持 微信小程序、百度智能小程 序,頭條小程序 和 支付寶小程序。 框架基于 Vue.js,修改了的運(yùn)行時(shí)框架 runtime 和代碼編譯器 compiler 實(shí)現(xiàn),使其可運(yùn)行在小程序環(huán)境中,從而為小程序開(kāi)發(fā)引入了 Vue.js 開(kāi)發(fā)體驗(yàn)。

    官網(wǎng)地址:http://mpvue.com/
    github地址:https://github.com/Meituan-Dianping/mpvue
    備注:完備的 Vue 開(kāi)發(fā)體驗(yàn),并且支持多平臺(tái)的小程序開(kāi)發(fā),推薦使用

    WeUi

    WeUI 是一套同微信原生視覺(jué)體驗(yàn)一致的基礎(chǔ)樣式庫(kù),由微信官方設(shè)計(jì)團(tuán)隊(duì)為微信內(nèi)網(wǎng)頁(yè)和微信小程序 量身設(shè)計(jì),令用戶的使用感知更加統(tǒng)一。包含 button、cell、dialog、toast、article、icon 等各式元 素。

    官網(wǎng)地址:https://weui.io/
    github地址:https://github.com/weui/weui.git

    前后端分離的演進(jìn)

    為了降低開(kāi)發(fā)的復(fù)雜度,以后端為出發(fā)點(diǎn),比如:Struts、SpringMVC 等框架的使用,就是后端的 MVC 時(shí)代;

    以 SpringMVC 流程為例:


    1.發(fā)起請(qǐng)求到前端控制器(DispatcherServlet)
    2.前端控制器請(qǐng)求HandlerMapping查找 Handler (可以根據(jù)xml配置、注解進(jìn)行查找)
    3.處理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping會(huì)把請(qǐng)求映射為HandlerExecutionChain對(duì)象(包含一個(gè)Handler處理器(頁(yè)面控制器)對(duì)象,多個(gè)HandlerInterceptor攔截器對(duì)象),通過(guò)這種策略模式,很容易添加新的映射策略
    4.前端控制器調(diào)用處理器適配器去執(zhí)行Handler
    5.處理器適配器HandlerAdapter將會(huì)根據(jù)適配的結(jié)果去執(zhí)行Handler
    6.Handler執(zhí)行完成給適配器返回ModelAndView
    7.處理器適配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一個(gè)底層對(duì)象,包括 Model和view)
    8.前端控制器請(qǐng)求視圖解析器去進(jìn)行視圖解析 (根據(jù)邏輯視圖名解析成真正的視圖(jsp)),通過(guò)這種策略很容易更換其他視圖技術(shù),只需要更改視圖解析器即可
    9.視圖解析器向前端控制器返回View
    10.前端控制器進(jìn)行視圖渲染 (視圖渲染將模型數(shù)據(jù)(在ModelAndView對(duì)象中)填充到request域)
    11.前端控制器向用戶響應(yīng)結(jié)果
    優(yōu)點(diǎn):

    MVC 是一個(gè)非常好的協(xié)作模式,能夠有效降低代碼的耦合度,從架構(gòu)上能夠讓開(kāi)發(fā)者明白代碼應(yīng)該寫(xiě)在 哪里。為了讓 View 更純粹,還可以使用 Thymeleaf、Freemarker 等模板引擎,使模板里無(wú)法寫(xiě)入 Java 代碼,讓前后端分工更加清晰。單體應(yīng)用!

    缺點(diǎn):

    前端開(kāi)發(fā)重度依賴(lài)開(kāi)發(fā)環(huán)境,開(kāi)發(fā)效率低,這種架構(gòu)下,前后端協(xié)作有兩種模式:

    1、第一種是前端寫(xiě) DEMO,寫(xiě)好后,讓后端去套模板。好處是 DEMO 可以本地開(kāi)發(fā),很。不足是 還需要后端套模板,有可能套錯(cuò),套完后還需要前端確定,來(lái)回溝通調(diào)整的成本比較大;

    2、另一種協(xié)作模式是前端負(fù)責(zé)瀏覽器端的所有開(kāi)發(fā)和服務(wù)器端的 View 層模板開(kāi)發(fā)。好處是 UI 相關(guān)的 代碼都是前端去寫(xiě)就好,后端不用太關(guān)注,不足就是前端開(kāi)發(fā)重度綁定后端環(huán)境,環(huán)境成為影響前端開(kāi) 發(fā)效率的重要因素。

    前后端職責(zé)糾纏不清:模板引擎功能強(qiáng)大,依舊可以通過(guò)拿到的上下文變量來(lái)實(shí)現(xiàn)各種業(yè)務(wù)邏輯。但這樣只要前端弱勢(shì)一點(diǎn),往往就會(huì)被后端要求在模板層寫(xiě)出不少業(yè)務(wù)代碼。還有一個(gè)很大的灰色地帶是,頁(yè)面路由等功能本應(yīng)該是前端最關(guān)注的,但卻是由后端來(lái)實(shí)現(xiàn)。

    ajax 的時(shí)代

    時(shí)間回到 2005 年 AJAX (Asynchronous JavaScript And XML,異步 JavaScript 和 XML,老技術(shù)新 用法) 被正式提出并開(kāi)始使用 CDN 作為靜態(tài)資源存儲(chǔ),于是出現(xiàn)了 JavaScript 王者歸來(lái)(在這之前 JS 都是用來(lái)在網(wǎng)頁(yè)上貼狗皮膏藥廣告的)的 SPA(Single Page Application)單頁(yè)面應(yīng)用時(shí)代。
    優(yōu)點(diǎn):
    這種模式下,前后端的分工非常清晰,前后端的關(guān)鍵協(xié)作點(diǎn)是 A JAX 接口??雌饋?lái)是如此美妙,但回過(guò) 頭來(lái)看看的話,這與 JSP 時(shí)代區(qū)別不大。復(fù)雜度從服務(wù)端的 JSP 里移到了瀏覽器的 JavaScript,瀏覽器 端變得很復(fù)雜。類(lèi)似 Spring MVC,這個(gè)時(shí)代開(kāi)始出現(xiàn)瀏覽器端的分層架構(gòu):

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-fP8yZYUq-1587440620216)()]
    缺點(diǎn):

    前后端接口的約定: 如果后端的接口一塌糊涂,如果后端的業(yè)務(wù)模型不夠穩(wěn)定,那么前端開(kāi)發(fā)會(huì)很 痛苦;不少團(tuán)隊(duì)也有類(lèi)似嘗試,通過(guò)接口規(guī)則、接口平臺(tái)等方式來(lái)做。有了和后端一起沉淀的 接口 規(guī)則,還可以用來(lái)模擬數(shù)據(jù),使得前后端可以在約定接口后實(shí)現(xiàn)并行開(kāi)發(fā)。
    前端開(kāi)發(fā)的復(fù)雜度控制: SPA 應(yīng)用大多以功能交互型為主,JavaScript 代碼過(guò)十萬(wàn)行很正常。大量 JS 代碼的組織,與 View 層的綁定等,都不是容易的事情
    前端為主的 MV* 時(shí)代

    此處的 MV* 模式如下:

    MVC(同步通信為主):Model、View、Controller
    MVP(異步通信為主):Model、View、Presenter
    MVVM(異步通信為主):Model、View、ViewModel
    為了降低前端開(kāi)發(fā)復(fù)雜度,涌現(xiàn)了大量的前端框架,比如: AngularJS 、 React 、Vue.js 、 EmberJS 等,這些框架總的原則是先按類(lèi)型分層,比如 Templates、Controllers、Models,然后再在層內(nèi)做切分,




    優(yōu)點(diǎn):

    前后端職責(zé)很清晰: 前端工作在瀏覽器端,后端工作在服務(wù)端。清晰的分工,可以讓開(kāi)發(fā)并行,測(cè) 試數(shù)據(jù)的模擬不難,前端可以本地開(kāi)發(fā)。后端則可以專(zhuān)注于業(yè)務(wù)邏輯的處理,輸出 RESTful等接 口。
    前端開(kāi)發(fā)的復(fù)雜度可控: 前端代碼很重,但合理的分層,讓前端代碼能各司其職。這一塊蠻有意思 的,簡(jiǎn)單如模板特性的選擇,就有很多很多講究。并非越強(qiáng)大越好,限制什么,留下哪些自由,代 碼應(yīng)該如何組織,所有這一切設(shè)計(jì),得花一本書(shū)的厚度去說(shuō)明。
    -部署相對(duì)獨(dú)立: 可以快速改進(jìn)產(chǎn)品體驗(yàn)
    缺點(diǎn):

    代碼不能復(fù)用。比如后端依舊需要對(duì)數(shù)據(jù)做各種校驗(yàn),校驗(yàn)邏輯無(wú)法復(fù)用瀏覽器端的代碼。如果可 以復(fù)用,那么后端的數(shù)據(jù)校驗(yàn)可以相對(duì)簡(jiǎn)單化。
    全異步,對(duì) SEO 不利。往往還需要服務(wù)端做同步渲染的降級(jí)方案。 性能并非最佳,特別是移動(dòng)互聯(lián)網(wǎng)環(huán)境下。
    SPA 不能滿足所有需求,依舊存在大量多頁(yè)面應(yīng)用。URL Design 需要后端配合,前端無(wú)法完全掌控。
    NodeJS 帶來(lái)的全棧時(shí)代

    前端為主的 MV* 模式解決了很多很多問(wèn)題,但如上所述,依舊存在不少不足之處。隨著 NodeJS 的興 起,JavaScript 開(kāi)始有能力運(yùn)行在服務(wù)端。這意味著可以有一種新的研發(fā)模式:
    ————————————————
    版權(quán)聲明:本文為CSDN博主「叁有三分之一」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
    原文鏈接:https://blog.csdn.net/iME_cho/article/details/105654633


【CSS基礎(chǔ)學(xué)習(xí)】行內(nèi)元素,塊級(jí)元素,行內(nèi)塊級(jí)元素

前端達(dá)人

文章目錄

    • 元素的顯示方式和轉(zhuǎn)換


    • 元素的顯示方式和轉(zhuǎn)換

      塊級(jí)元素

      塊級(jí)元素(inline):
      塊級(jí)元素可以包含行內(nèi)元素和其它塊級(jí)元素,且占據(jù)父元素的整個(gè)空間,可以設(shè)置 width 和 height 屬性,瀏覽器通常會(huì)在塊級(jí)元素前后另起一個(gè)新行。
      常見(jiàn)塊級(jí)元素:

      header,form,ul,ol,table,article,div,hr,aside,figure,canvas,video,audio,footer
      特點(diǎn):

      塊級(jí)元素會(huì)獨(dú)占一行
      高度,行高,外邊距和內(nèi)邊距都可以單獨(dú)設(shè)置
      寬度默認(rèn)是容器的100%
      可以容納內(nèi)聯(lián)元素和其他的塊級(jí)元素
      例如:





      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
          <style>
              div{
                  width: 150px;
                  height: 150px;
                  background-color: cadetblue;
              }
          </style>
      </head>
      <body>
          <div>塊級(jí)元素1</div>
          <div>塊級(jí)元素2</div>
      </body>
      </html>
      



       

      分析:
      塊級(jí)元素的高和寬可以被修改,而且塊級(jí)元素會(huì)在一個(gè)塊級(jí)元素之后另起一行。

      行級(jí)元素
      行級(jí)元素(block):
      一般情況下,行內(nèi)元素只能包含內(nèi)容或者其它行內(nèi)元素,寬度和長(zhǎng)度依據(jù)內(nèi)容而定,不可以設(shè)置,可以和其它元素和平共處于一行。
      常見(jiàn)行級(jí)元素:
      a,b,strong,span,img,label,button,input,select,textarea
      特點(diǎn):

      和相鄰的行內(nèi)元素在一行上
      高度和寬度無(wú)效,但是水平方向上的padding和margin可以設(shè)置,垂直方向上的無(wú)效
      默認(rèn)的寬度就是它本身的寬度
      行內(nèi)元素只能容納純文本或者是其他的行內(nèi)元素(a標(biāo)簽除外)
      例如:

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
          <style>
              span{
                  width: 150px;
                  height: 150px;
                  font-size: 40px;
                  background-color: cadetblue;
              }
          </style>
      </head>
      <body>
          <span>行級(jí)元素1</span>
          <span>行級(jí)元素2</span>
      </body>
      </html>
      


      分析:
      對(duì)他的高和寬進(jìn)行修改,但是沒(méi)有發(fā)生改變,對(duì)他的字體大小進(jìn)行修改卻發(fā)生了整體大小的改變,所以得出結(jié)論行級(jí)元素的寬高是與內(nèi)容有關(guān)的,且不可修改高寬的屬性,只能對(duì)內(nèi)容修改。

      行內(nèi)塊級(jí)元素
      行內(nèi)塊級(jí)元素(inline-block):
      他包含了行級(jí)元素與塊級(jí)元素的特點(diǎn),在同一行顯示,可以設(shè)置元素寬度和高度,可以將塊級(jí)元素和行級(jí)元素轉(zhuǎn)化為行內(nèi)塊級(jí)元素。他不屬于基本的元素,是通過(guò)修改獲得的。
      特點(diǎn):

      和其他行內(nèi)或行內(nèi)塊級(jí)元素元素放置在同一行上
      元素的高度、寬度、行高以及頂和底邊距都可設(shè)置
      舉例:
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
          <style>
              span{
                  width: 150px;
                  height: 150px;
                  font-size: 20px;
                  background-color: cadetblue;
                  display: inline-block;
              }
          </style>
      </head>
      <body>
          <span>以前我是行級(jí)元素,</span>
          <span>現(xiàn)在我只想做行內(nèi)塊級(jí)元素。</span>
      </body>
      </html>
      


      分析:
      他可以進(jìn)行修改寬高,也屬于同一行,包含著行級(jí)元素和塊級(jí)元素的特點(diǎn),他就是行!內(nèi)!塊!級(jí)!元!素!

      顯示方式之間的轉(zhuǎn)化
      想要轉(zhuǎn)成什么顯示方式 格式
      塊級(jí)元素 display:inline;
      行級(jí)元素 display: block;
      行內(nèi)塊級(jí)元素 display: inline-block;
      這些直接在元素里面添加就可以了,就會(huì)轉(zhuǎn)換成相對(duì)應(yīng)的格式。
      舉例:


      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
          <style>
              div{
                  width: 150px;
                  height: 150px;
                  font-size: 30px;
                  background-color: cadetblue;
                  display: inline;
              }
          </style>
      </head>
      <body>
          <div>我以前是塊級(jí)元素,</div>
          <div>現(xiàn)在我是行級(jí)元素!</div>
      </body>
      </html>
      






      分析:
      在VSC中,修改寬高的代碼已經(jīng)出現(xiàn)了波浪線,證明他是錯(cuò)誤的,所以現(xiàn)在的div已經(jīng)變成了行級(jí)元素。






      ————————————————
      版權(quán)聲明:本文為CSDN博主「董小宇」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
      原文鏈接:https://blog.csdn.net/lolly1023/article/details/105715892



帶你快速了解VSCode的10個(gè)特性,極大提高開(kāi)發(fā)效率

前端達(dá)人

其實(shí)VSCode編輯器本身自帶了一個(gè)功能(Interactive Editor Playground :可以讓你快速了解VSCode的特性,并且是可以交互的),



但很可惜它的內(nèi)容是全英文的(將VSCode設(shè)置為中文也沒(méi)用哦~),



我將每一部分截圖下來(lái),并為你說(shuō)明關(guān)鍵內(nèi)容,教你學(xué)會(huì)使用 Interactive Editor Playground



還有一些顯而易見(jiàn)的特性,我不會(huì)再用文字?jǐn)⑹鲆槐椋ㄋ鼈兌际菨撘颇模?br />
在下文中會(huì)涉及到大量快捷鍵的介紹,如果看不懂快捷鍵請(qǐng)自行百度

鼠標(biāo) = 文本光標(biāo) = 光標(biāo)

本文成于2020年4月22日,隨著VSCode的版本更迭,此部分內(nèi)容可能會(huì)略有差異(小更改不影響觀看,有較大影響的更新請(qǐng)?jiān)谠u(píng)論區(qū)告之,我會(huì)及時(shí)更新的)



打開(kāi)VSCode > Help > Interactive Playground

點(diǎn)擊查看原圖

你將會(huì)打開(kāi) Interactive Editor Playground 頁(yè)面

互動(dòng)式編輯游樂(lè)場(chǎng)

點(diǎn)擊查看原圖

VS代碼中的核心編輯器包含許多特性。此頁(yè)高亮顯示了10個(gè)特性,每個(gè)特性介紹中都提供了代碼行供你編輯

接下來(lái)的10行內(nèi)容(你可以理解為目錄,對(duì)應(yīng)10個(gè)特性)

多光標(biāo)編輯(Multi-Cursor Editing)- 選擇一塊區(qū)域,選擇所有匹配項(xiàng),添加其余光標(biāo)等
智能感應(yīng)(intelliSense)- 獲取代碼和外部模塊的代碼幫助和參數(shù)建議
行操作(Line Actions )- 快速移動(dòng)行以重新排序代碼
重命名重構(gòu)(Rename Refactoring)- 快速重命名代碼庫(kù)中的符號(hào)(比如變量名、函數(shù)名)
格式化(Formatting)- 使用內(nèi)置文檔和選擇格式使代碼看起來(lái)很棒
代碼折疊(Code Folding) - 通過(guò)折疊其他代碼區(qū)域,關(guān)注代碼中最相關(guān)的部分
錯(cuò)誤和警告(Errors and Warnings)- 寫(xiě)代碼時(shí)請(qǐng)參閱錯(cuò)誤和警告
片段(Snippets)- 花更少的時(shí)間輸入片段
Emmet - 只需要敲一行代碼就能生成你想要的完整HTML結(jié)構(gòu)等(極大方便前端開(kāi)發(fā))
JavaScript Type Checking- 使用零配置的TypeScript對(duì)JavaScript文件執(zhí)行類(lèi)型檢查。
Multi-Cursor Editing

點(diǎn)擊查看原圖

使用多光標(biāo)編輯可以同時(shí)編輯文檔的多個(gè)部分,極大地提高了工作效率

框式選擇
鍵盤(pán)同時(shí)按下 Shift + DownArrow(下鍵)、Shift + RightArrow(右鍵)、Shift + UpArrow(上鍵)、Shift + LeftArrow(左鍵) 的任意組合可選擇文本塊
也可以用鼠標(biāo)選擇文本時(shí)按 Shift + Alt 鍵
或使用鼠標(biāo)中鍵拖動(dòng)選擇(可用性很高)
添加光標(biāo)
按 Ctrl + Alt + UpArrow 在行上方添加新光標(biāo)
或按 Ctrl + Alt + DownArrow 在行下方添加新光標(biāo)
您也可以使用鼠標(biāo)和 Alt + Click 在任何地方添加光標(biāo)(可用性很高)
在所有出現(xiàn)的字符串上創(chuàng)建光標(biāo)
選擇字符串的一個(gè)實(shí)例,例如我用鼠標(biāo)選中所有background,然后按 Ctrl + Shift + L,文本中所有的background都將被選中(可用性很高)
IntelliSense

點(diǎn)擊查看原圖

Visual Studio Code 預(yù)裝了強(qiáng)大的JavaScript和TypeScript智能感知。

在代碼示例中,將文本光標(biāo)放在錯(cuò)誤下劃線的上面,會(huì)自動(dòng)調(diào)用IntelliSense


這只是智能提示的冰山一角,還有懸停在函數(shù)名上可以看到參數(shù)及其注釋?zhuān)ㄈ绻校┑鹊?,它?huì)潛移默化的帶給你極大幫助

其他語(yǔ)言在安裝對(duì)應(yīng)插件后,會(huì)附帶對(duì)應(yīng)語(yǔ)言的IntelliSense

Line Actions

點(diǎn)擊查看原圖

分別使用 Shift + Alt + DownArrow 或 Shift + Alt + UpArrow 復(fù)制光標(biāo)所在行并將其插入當(dāng)前光標(biāo)位置的上方或下方
分別使用 Alt + UpArrow 和 Alt + DownArrow 向上或向下移動(dòng)選定行(可用性很高)
用 Ctrl + Shift + K 刪除整行(可用性很高)
通過(guò)按 Ctrl + / 來(lái)注釋掉光標(biāo)所在行、切換注釋?zhuān)捎眯院芨撸?br /> Rename Refactoring

點(diǎn)擊查看原圖

重命名符號(hào)(如函數(shù)名或變量名)

  1. 將光標(biāo)選中符號(hào),按F2鍵
  2. 或者 選中該符號(hào),鼠標(biāo)右鍵 > Rename Symbol

重命名操作將在項(xiàng)目中的所有文件中發(fā)生可用性很高

Formatting

點(diǎn)擊查看原圖

代碼如果沒(méi)有良好的編寫(xiě)格式,閱讀起來(lái)是一個(gè)折磨

Formatting可以解決編寫(xiě)格式問(wèn)題:無(wú)論你的代碼的格式寫(xiě)的有多么糟糕,它可以將代碼格式化為閱讀性良好的格式

格式化整個(gè)文檔 Shift + Alt + F (可用性很高)
格式化當(dāng)前行 Ctrl + K Ctrl + F(即先按Ctrl,再按K,最后按F)
鼠標(biāo)右鍵 > Format Document (格式化整個(gè)文檔)
將格式化操作設(shè)置為自動(dòng)化(保存時(shí)自動(dòng)格式化整個(gè)文檔):Ctrl + , 輸入 editor.formatOnSave

點(diǎn)擊查看原圖

Code Folding

點(diǎn)擊查看原圖

鼠標(biāo)操作,自己嘗試一下,秒懂

快捷鍵:

  • 折疊 Ctrl + Shift + [
  • 展開(kāi) Ctrl + Shift + ]

折疊代碼段是基于基于縮進(jìn)

Errors and Warning

點(diǎn)擊查看原圖

錯(cuò)誤和警告將在你出現(xiàn)錯(cuò)誤時(shí),高亮該代碼行

在代碼示例中可以看到許多語(yǔ)法錯(cuò)誤(如果沒(méi)有,請(qǐng)你隨便修改它,讓它出現(xiàn)錯(cuò)誤)

按F8鍵可以按順序在錯(cuò)誤之間導(dǎo)航,并查看詳細(xì)的錯(cuò)誤消息(可用性很高)

Snippets

通過(guò)使用代碼片段,可以大大加快編輯速度

在代碼編輯區(qū),你可以嘗試輸入try并從建議列表中選擇try catch,

然后按Tab鍵或者Enter,創(chuàng)建try->catch塊

你的光標(biāo)將放在文本error上,以便編輯。如果存在多個(gè)參數(shù),請(qǐng)按Tab鍵跳轉(zhuǎn)到該參數(shù)。

Emmet

Emmet將代碼片段的概念提升到了一個(gè)全新的層次(前端開(kāi)發(fā)的大寶貝)

你可以鍵入類(lèi)似Css的可動(dòng)態(tài)解析表達(dá)式,并根據(jù)在abrevision中鍵入的內(nèi)容生成輸出

比如說(shuō):

然后Enter

JavaScript Type Checking

點(diǎn)擊查看原圖



————————————————
版權(quán)聲明:本文為CSDN博主「索兒呀」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Zhangguohao666/article/details/105676173

PC端表單設(shè)計(jì)的研究:如何設(shè)計(jì)一個(gè)優(yōu)秀的表單頁(yè)面

前端達(dá)人

1.jpg

最近身邊的一些小伙伴,總會(huì)遇見(jiàn)B端設(shè)計(jì)工作,對(duì)于這種偏后臺(tái)設(shè)計(jì)的B端設(shè)計(jì),總會(huì)有大量的表單設(shè)計(jì)需要做,結(jié)合以前自己也有過(guò)不少表單設(shè)計(jì)的工作,在這里給大家分享一下自己對(duì)于PC端表單設(shè)計(jì)的研究,聊一聊表單在PC端中的運(yùn)用。


表單的作用

商業(yè)離不開(kāi)數(shù)據(jù),而數(shù)據(jù)總會(huì)依賴(lài)不同的表現(xiàn)形式,不管是word文檔,還是數(shù)據(jù)可視化,都是瀏覽者通過(guò)表現(xiàn)形式來(lái)對(duì)數(shù)據(jù)進(jìn)行閱讀和分析,因此表單的設(shè)計(jì)就是一種表現(xiàn)形式,我們將捋一捋如何通過(guò)表單更好的讓用戶閱讀順暢、操作方便、總而言之就是更好用啦。

表單信息的分割方式

無(wú)線分割:顧名思義,列表的信息之間正常情況下沒(méi)有分割線等方法來(lái)分隔,僅僅是用間距來(lái)分隔開(kāi)內(nèi)容。好處是元素更少,畫(huà)面更簡(jiǎn)潔,但是視覺(jué)可能就沒(méi)那么清晰了,使用的出場(chǎng)率一般。

點(diǎn)擊查看原圖

點(diǎn)擊查看原圖

有線分割:同樣字面意思,就是通過(guò)簡(jiǎn)單的分割線來(lái)分割列表中的信息,讓視線左右移動(dòng)的時(shí)候更加穩(wěn)定、輕松,在表單設(shè)計(jì)中使用的出場(chǎng)率非常高。

點(diǎn)擊查看原圖

點(diǎn)擊查看原圖

斑馬線:通過(guò)深淺交替的色塊,以及色塊產(chǎn)生的對(duì)比來(lái)分隔列表中的信息,深淺深淺的循環(huán)就好像斑馬線,使用時(shí)是通過(guò)色塊產(chǎn)生對(duì)比,所以也可以使用帶有適量飽和度的色塊來(lái)區(qū)分,占頁(yè)面面積比例較大,適當(dāng)用色可以使得畫(huà)面更加活潑、豐滿,斑馬線也是出場(chǎng)率極高的一種展現(xiàn)形式。

點(diǎn)擊查看原圖


斑馬線+分割線:很容易理解,就是斑馬線風(fēng)格+分割線的結(jié)合,用色塊區(qū)分的同時(shí)又加了分割線,信息之間的區(qū)分對(duì)比更加強(qiáng)烈,但是畫(huà)面層級(jí)就多了一些,沒(méi)有其他的看起來(lái)簡(jiǎn)潔,使用出場(chǎng)率也一般。


點(diǎn)擊查看原圖


卡片式:跟卡片式風(fēng)格其他設(shè)計(jì)一樣,分別用懸浮的色塊來(lái)區(qū)分,間隔的地方是背景色,分隔的力度比較強(qiáng),內(nèi)容區(qū)分的很清晰,弊端是更加占畫(huà)面的位置,尤其在信息很多列的時(shí)候,會(huì)增加大量的高度,用戶需要更多時(shí)間進(jìn)行下翻的操作。使用出場(chǎng)率相對(duì)其他形式來(lái)說(shuō)稍低。

點(diǎn)擊查看原圖


可控制頁(yè)面顯示數(shù)量

場(chǎng)景:用戶需要閱讀大量的表單數(shù)據(jù),且需要頻繁的翻頁(yè)、跳轉(zhuǎn)。

如圖,左下角可以設(shè)置界面中每頁(yè)顯示信息數(shù)量的多少,用戶可以根據(jù)自己的需要自由設(shè)置,當(dāng)瀏覽的數(shù)據(jù)較多的時(shí)候,不再需要頻繁點(diǎn)擊下一頁(yè)來(lái)瀏覽信息,只需把每頁(yè)顯示的數(shù)量調(diào)高,如此便減少了大量的操作次數(shù)。

點(diǎn)擊查看原圖


像這樣允許用戶可以自由編輯來(lái)改進(jìn)體驗(yàn)的方式還有很多,比如可以設(shè)置顯示密度,就是以一樣的方式自由調(diào)整信息與分割線的間距。除了行間距,有的可以自由設(shè)置每一列的列間距,用戶可以根據(jù)自己的習(xí)慣來(lái)設(shè)置。

列表+可視化

場(chǎng)景:用戶需要瀏覽大量的數(shù)據(jù),并需要對(duì)數(shù)據(jù)反復(fù)進(jìn)行計(jì)算、分析。

在使用大量的文字列表展示數(shù)據(jù)的同時(shí),使用數(shù)據(jù)可視化加以配合,用戶可以更好的預(yù)覽到數(shù)據(jù)的大致情況,又可以在列表表單中閱讀到詳細(xì)的數(shù)據(jù)。

點(diǎn)擊查看原圖


點(diǎn)擊查看原圖


根據(jù)條件排序

場(chǎng)景:用戶想根據(jù)某種條件的大小排序,來(lái)先后閱讀數(shù)據(jù)。

通過(guò)點(diǎn)擊第一排小標(biāo)題行,可以選擇不同的方式調(diào)整信息的排序方式,就和電商商品排序一樣,可以選擇金額高到低或者低到高排序,也可以選擇別的方式進(jìn)行排序,從而更快找到自己所需要的內(nèi)容。

點(diǎn)擊查看原圖



篩選過(guò)濾

場(chǎng)景:從一大堆混雜的數(shù)據(jù)當(dāng)中,尋找符合條件的自己所需要的數(shù)據(jù)。

添加篩選功能,過(guò)濾掉自己不想瀏覽的內(nèi)容,通過(guò)條件篩選,更快的更的找到自己想要的內(nèi)容、縮小查找范圍、減少達(dá)到目的所花的時(shí)間。一般通過(guò)下拉按鈕的形式選擇不同的條件來(lái)進(jìn)行篩選過(guò)濾。

點(diǎn)擊查看原圖



關(guān)鍵字搜索

場(chǎng)景:已知列表中某信息的名稱(chēng)關(guān)鍵字,想從大量混雜的列表中快速找到。

跟篩選過(guò)濾一樣,添加關(guān)鍵字搜索功能,用戶提供部分關(guān)鍵字,可通過(guò)關(guān)鍵字查詢(xún),最快最的找到想要的那一條內(nèi)容。一般該目標(biāo)內(nèi)容是用戶已知的,有時(shí)候是針對(duì)性的。

點(diǎn)擊查看原圖



懸停展現(xiàn)操作

場(chǎng)景:精簡(jiǎn)設(shè)計(jì)風(fēng)格的界面,不想界面中內(nèi)容過(guò)于繁多。

如圖,鼠標(biāo)懸停在哪一行,哪一行才會(huì)顯示該列表后面的操作按鈕,好處是減少了視覺(jué)干擾,能更快的找到捕捉到操作位置,弊端是用戶不進(jìn)行交互的時(shí)候無(wú)法發(fā)現(xiàn)操作按鈕如何出現(xiàn)。


點(diǎn)擊查看原圖



可展開(kāi)列表

場(chǎng)景:想快速獲取列表中某信息的其他附屬內(nèi)容。

如圖,點(diǎn)擊某一行后,展現(xiàn)該行的一些附屬信息??梢圆挥锰D(zhuǎn)頁(yè)面而進(jìn)一步了解該行信息的詳情。

點(diǎn)擊查看原圖



可編輯列表

場(chǎng)景:在瀏覽列表的同時(shí),需要頻繁的對(duì)列表中的信息進(jìn)行編輯。

用戶可以直接對(duì)列表信息進(jìn)行修改、編輯,省去了跳轉(zhuǎn)再編輯的麻煩步驟,更節(jié)約時(shí)間,用戶操作起來(lái)更加方便。

點(diǎn)擊查看原圖



快速預(yù)覽

場(chǎng)景:需要充分了解列表中不同信息的詳細(xì)說(shuō)明,頻繁跳轉(zhuǎn)又過(guò)于麻煩。

和可展開(kāi)列表的作用類(lèi)似,但是可展開(kāi)列表顯示的內(nèi)容有限,快速預(yù)覽的功能可以用側(cè)彈框的方式、彈出對(duì)話窗口的方式、以及其他方式對(duì)選中的內(nèi)容直接展示詳細(xì)信息。用戶不需要跳轉(zhuǎn)至詳情頁(yè)就可以了解到大量信息,省去繁瑣的交互流程。不再需要頻繁的跳轉(zhuǎn)到詳情-返回-跳轉(zhuǎn)到另一個(gè)詳情-返回-跳轉(zhuǎn)-返回。使用快速預(yù)覽的功能就可以很好的解決這一問(wèn)題。

(PS:彈出對(duì)話窗口的方式,可以同時(shí)彈出好幾項(xiàng)列表的詳情信息進(jìn)行對(duì)比,但是側(cè)彈框因?yàn)楦叨葍?yōu)勢(shì),可以展現(xiàn)更多內(nèi)容)


點(diǎn)擊查看原圖


點(diǎn)擊查看原圖



自定義列

場(chǎng)景:列表中每條內(nèi)容顯示信息參數(shù)過(guò)多,且很多不想瀏覽。

自定義列表功能是用戶可以自由設(shè)置每行信息參數(shù)的內(nèi)容,比如我不想列表中顯示金額這一項(xiàng),就可以刪除,想要的時(shí)候可以添加回來(lái),這樣用戶可以保留自己想要的那幾項(xiàng)內(nèi)容,可以更快更方便的閱讀到自己關(guān)心的那幾項(xiàng)參數(shù),節(jié)省了用戶的有效時(shí)間。

固定頭部

場(chǎng)景:列表橫向或者縱向過(guò)多,下翻或橫拉的時(shí)候標(biāo)題頭被隱藏,不知道自己當(dāng)前瀏覽到的參數(shù)屬于哪一項(xiàng)。

交互過(guò)程中,可以把第一排重要的東西固定,列表內(nèi)容翻動(dòng)的同時(shí),第一排仍然在原位不移動(dòng)而且覆蓋列表中的其他信息,很多自帶的框架都是這樣的形式,使用的出場(chǎng)率也是非常高,這樣用戶可以隨時(shí)查看到自己看到的內(nèi)容是屬于哪一項(xiàng)屬性,或者是屬于哪一條信息,可以是橫向固定,也可以固定豎直的第一排標(biāo)題,也可以固定最后一塊操作點(diǎn)擊區(qū)域,具體如何固定、是否固定,根據(jù)整體的需求來(lái)選擇。

間距的規(guī)則

通常表單都是大量的文字,大多數(shù)的文字高度都在該行高度的三分之一左右。過(guò)于緊密用戶瀏覽不順暢,過(guò)于分開(kāi)顯得畫(huà)面過(guò)于松散,不同的分割方式,間距也會(huì)有所不同。

總結(jié)

其實(shí)上面的每一條都是一個(gè)小總結(jié),每一條在大部分的列表中都可以用到,主要還是根據(jù)實(shí)際需求來(lái)運(yùn)用這幾點(diǎn),比如分割的方式根據(jù)主體風(fēng)格來(lái)搭配,不要為了設(shè)計(jì)而設(shè)計(jì)盲目運(yùn)用,畢竟設(shè)計(jì)都是以?xún)?nèi)容為主,尤其是表單設(shè)計(jì),本身就是更好的表達(dá)內(nèi)容。


本文發(fā)布于人人都是產(chǎn)品經(jīng)理。




ES6數(shù)據(jù)的解構(gòu)賦值使用及應(yīng)用

前端達(dá)人


定義


ES6 允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱(chēng)為解構(gòu)(Destructuring)



本質(zhì)上,這種寫(xiě)法屬于“模式匹配”,只要等號(hào)兩邊的模式相同,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值

如果解構(gòu)不成功,變量的值就等于undefined

解構(gòu)賦值的規(guī)則是,只要等號(hào)右邊的值不是對(duì)象或數(shù)組,就先將其轉(zhuǎn)為對(duì)象。由于undefined和null無(wú)法轉(zhuǎn)為對(duì)象,所以對(duì)它們進(jìn)行解構(gòu)賦值,都會(huì)報(bào)錯(cuò)、



解構(gòu)賦值的用途:

交換變量的值

例如:let x=1,y=2;[x,y] = [y,x]



從函數(shù)返回多個(gè)值

函數(shù)只能返回一個(gè)值,如果要返回多個(gè)值,只能將它們放在數(shù)組或?qū)ο罄锓祷亍S辛私鈽?gòu)賦值,取出這些值就非常方便



函數(shù)參數(shù)的定義

解構(gòu)賦值可以方便地將一組參數(shù)與變量名對(duì)應(yīng)起來(lái)



提取 JSON 數(shù)據(jù),很多接口數(shù)據(jù)只需要其中某部分

例如aa.axios.get(res=>{let {data:result}=res;}),則res.data.result = result了



函數(shù)參數(shù)的默認(rèn)值

指定參數(shù)的默認(rèn)值,就避免了在函數(shù)體內(nèi)部再寫(xiě)var foo = config.foo || ‘default foo’;這樣的語(yǔ)句



遍歷 Map 結(jié)構(gòu)

Map 結(jié)構(gòu)原生支持 Iterator 接口,配合變量的解構(gòu)賦值,獲取鍵名和鍵值就非常方便



輸入模塊的指定方法

加載模塊時(shí),往往需要指定輸入哪些方法。解構(gòu)賦值使得輸入語(yǔ)句非常清晰。* const { SourceMapConsumer, SourceNode } = require(“source-map”);


1、數(shù)組的解構(gòu)賦值


左右兩側(cè)數(shù)據(jù)解構(gòu)須得吻合,或者等號(hào)左邊的模式,只匹配一部分的等號(hào)右邊的數(shù)組(屬于不完全解構(gòu))



特殊情況使用…擴(kuò)展運(yùn)算符,無(wú)值是空數(shù)組



左右兩邊等式的性質(zhì)要相同,等號(hào)的右邊不是數(shù)組(或者嚴(yán)格地說(shuō),不是可遍歷的結(jié)構(gòu)),那么將會(huì)報(bào)錯(cuò),只要某種數(shù)據(jù)結(jié)構(gòu)具有 Iterator



接口,都可以采用數(shù)組形式的解構(gòu)賦值,例如Set結(jié)構(gòu)



解構(gòu)賦值允許指定默認(rèn)值,當(dāng)一個(gè)數(shù)組成員嚴(yán)格等于undefined,默認(rèn)值才會(huì)生效,否則取賦值的值;如果默認(rèn)值是一個(gè)表達(dá)式,那么這個(gè)表達(dá)式是惰性求值的,即只有在用到的時(shí)候,才會(huì)求值;默認(rèn)值可以引用解構(gòu)賦值的其他變量,但該變量必須已經(jīng)聲明



// 數(shù)組的解構(gòu)賦值
 let [a,b] = [1,2];
 console.log([a,b],a);//[1, 2] 1
 let [aa] = [11,22];
 console.log(aa)//11
 let [aaa,bbb] = [111];
 console.log(aaa,bbb)//111 undefined
 let [head, ...tail] = [1, 2, 3, 4];
 console.log(head,tail)//1,[2,3,4]
 let [x, y, ...z] = ['a'];
 console.log(x,y,z)//a undefined []
 // 等號(hào)右邊不是數(shù)組會(huì)報(bào)錯(cuò)
 // let [ab] = 121;
 // conosle.log(ab)//TypeError: 121 is not iterable
 // let [abc] = {}
 // conosle.log(abc)//TypeError: {} is not iterable
 // 默認(rèn)值賦值
 let [zz = 1] = [undefined];
 console.log(zz)//1
 let [zzz = 1] = [null];
 console.log(zzz)//null
 let [foo = true] = [];
 console.log(foo)// true
 let [xxx, yyy = 'b'] = ['a'];
 console.log(xxx,yyy)//a,b
 let [xxxx, yyyy = 'b'] = ['a', undefined]; 
 console.log(xxxx,yyyy)//a,b
 function f() {
   console.log('aaa');
 }
 let [xx = f()] = [1];
 console.log(xx)//1
 let [qq=ww,ww=11] = [23,44];
 console.log(qq,ww)//23,44,因?yàn)閣w申明比qq晚所以是undefined;

2、對(duì)象的解構(gòu)賦值
對(duì)象的解構(gòu)賦值的內(nèi)部機(jī)制,是先找到同名屬性,然后再賦給對(duì)應(yīng)的變量。真正被賦值的是后者,而不是前者

數(shù)組是按照位置區(qū)分,對(duì)象則是按照鍵名區(qū)分的,同樣的解構(gòu)失敗則為undefine
可將已有方法對(duì)象解構(gòu)賦值
嵌套賦值,注意是變量是否被賦值是模式還是鍵值
對(duì)象的解構(gòu)賦值可以取到繼承的屬性
如果要將一個(gè)已經(jīng)聲明的變量用于解構(gòu)賦值,必須非常小心
let xx; // {xx} = {xx: 1}這樣會(huì)報(bào)錯(cuò),

解構(gòu)賦值允許等號(hào)左邊的模式之中,不放置任何變量名。因此,可以寫(xiě)出非常古怪的賦值表達(dá)式
({} = [true, false]);//可執(zhí)行

由于數(shù)組本質(zhì)是特殊的對(duì)象,因此可以對(duì)數(shù)組進(jìn)行對(duì)象屬性的解構(gòu)

objFuc(){
            // 對(duì)象解構(gòu)賦值
            let {b,a} = {a:1}
            console.log(a,b)//1 undefined
            // 已有對(duì)象解構(gòu)賦值
            let { sin, cos } = Math;//將Math對(duì)象的對(duì)數(shù)、正弦、余弦三個(gè)方法,賦值到對(duì)應(yīng)的變量上
            console.log(sin);//log() { [native code] }
            const { log } = console;
            log('hello') // hello
            // 
            let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
            console.log(baz);//aaa
            // 嵌套賦值
            let obj = {
              p: [
                'Hello',
                { y: 'World' }
              ]
            };
            let { p,p:[x, { y }] } = obj;
            console.log(x,y,p)//Hello World p: ['Hello',{ y: 'World' }]
            //繼承賦值
            const obj1 = {};
            const obj2 = { foo: 'bar' };
            Object.setPrototypeOf(obj1, obj2);//obj1繼承obj2
            const { foo } = obj1;
            console.log(foo) // "bar"
            // 默認(rèn)值
            // 錯(cuò)誤的寫(xiě)法
            let xx;
            // {xx} = {xx: 1};// SyntaxError: syntax error,Uncaught SyntaxError: Unexpected token '='
            ({xx} = {xx: 1});//正確寫(xiě)法
            console.log(xx)
            // 古怪的,等式左邊可為空
            // ({} = [true, false]);
            // 對(duì)象可解構(gòu)數(shù)組
            let arr = [1, 2, 3];
            let {0 : first, [arr.length - 1] : last} = arr;
            console.log(first,last)//1 3
        },


3、字符串的解構(gòu)賦值

  • 字符串賦值
  • 類(lèi)似數(shù)組的對(duì)象都有一個(gè)length屬性,因此還可以對(duì)這個(gè)屬性解構(gòu)賦值
strFuc(){
            // str:'yan_yan'
            let [a,b,c,d,e,f,g] = this.str;
            console.log(a,b,c,d,e,f,g)//y a n _ y a n
            // 對(duì)數(shù)組屬性解構(gòu)賦值
            let {length} = this.str;
            console.log(length)//7
        },

    

4、數(shù)值和布爾值的解構(gòu)賦值

  • 解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值和布爾值,則會(huì)先轉(zhuǎn)為對(duì)象
  • 解構(gòu)賦值的規(guī)則是,只要等號(hào)右邊的值不是對(duì)象或數(shù)組,就先將其轉(zhuǎn)為對(duì)象。由于undefined和null無(wú)法轉(zhuǎn)為對(duì)象,所以對(duì)它們進(jìn)行解構(gòu)賦值,都會(huì)報(bào)錯(cuò)

let {toString: s} = 123;
console.log(s === Number.prototype.toString,s)//true ? toString() { [native code] }
let {toString: ss} = true;
console.log(ss === Boolean.prototype.toString,ss)// true ? toString() { [native code] }
// 右側(cè)必須是數(shù)組或?qū)ο?,undefined和null無(wú)法轉(zhuǎn)為對(duì)象,所以對(duì)它們進(jìn)行解構(gòu)賦值,都會(huì)報(bào)錯(cuò)
// let { prop: x } = undefined; // TypeError
// let { prop: y } = null; // TypeError


    

5、函數(shù)參數(shù)的解構(gòu)賦值

  • 也可使用默認(rèn)值,注意默認(rèn)值是指實(shí)參的默認(rèn)值而不是形參的默認(rèn)值
// 函數(shù)的解構(gòu)賦值可使用默認(rèn)值,注意默認(rèn)值是指實(shí)參的默認(rèn)值而不是形參的默認(rèn)值
            function move({x=1, y=1}={}) {
              return [x, y];
            }
            function move1({x, y} = { x: 0, y: 0 }) {
              return [x, y];
            }
            function move2({x, y=1} = { x: 0, y: 0 }) {
              return [x, y];
            }
            console.log(move({x: 3, y: 8})); // [3, 8]
            console.log(move({x: 3})); // [3, 1]
            console.log(move({})); // [1, 1]
            console.log(move()); // [1,1]
            console.log(move1({x: 3, y: 8})); // [3, 8]
            console.log(move1({x: 3})); // [3, 1]
            console.log(move1({})); // [undefined, 1]
            console.log(move1()); // [0,0]
            console.log(move2({x: 3, y: 8})); // [3, 8]
            console.log(move2({x: 3})); // [3, 1]
            console.log(move2({})); // [undefined, 1]
            console.log(move2()); // [0,0]

6、圓括號(hào)問(wèn)題
解構(gòu)賦值雖然很方便,但是解析起來(lái)并不容易。對(duì)于編譯器來(lái)說(shuō),一個(gè)式子到底是模式,還是表達(dá)式,沒(méi)有辦法從一開(kāi)始就知道,必須解析到(或解析不到)等號(hào)才能知道。
由此帶來(lái)的問(wèn)題是,如果模式中出現(xiàn)圓括號(hào)怎么處理。ES6 的規(guī)則是,只要有可能導(dǎo)致解構(gòu)的歧義,就不得使用圓括號(hào)。
可以使用圓括號(hào)的情況只有一種:賦值語(yǔ)句的非模式部分,可以使用圓括號(hào)
總結(jié):
不管是哪一類(lèi)的解構(gòu)賦值,等式右邊的數(shù)據(jù)必須是對(duì)象形式(數(shù)組也是一種對(duì)象形式)
————————————————
版權(quán)聲明:本文為CSDN博主「Yan_an_n」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44258964/article/details/105643553

淺析HTTP協(xié)議

前端達(dá)人

目錄

HTTP協(xié)議

HTTP請(qǐng)求:

HTTP響應(yīng):

會(huì)話與會(huì)話狀態(tài):

Cookie

Session

Cookie和Session的區(qū)別

HTTP協(xié)議


 HTTP請(qǐng)求:
Post /test.php HTTP/1.1                               //請(qǐng)求行以一個(gè)方法符號(hào)開(kāi)頭,以空格分開(kāi),后面跟著請(qǐng)求的URI和協(xié)議的版本

Host: www.test.com                                       //請(qǐng)求頭

User-agent:mozilla/5.0(windows NT 6.1: rv: 15.0)

Gecko/20100101 firefox15.0

                                                                                    //空白行,代表請(qǐng)求頭結(jié)束

Username=admin&passwd=admin                             //請(qǐng)求正文

HTTP請(qǐng)求方法



GET       請(qǐng)求獲取Request-URI所標(biāo)識(shí)的資源

POST     在Request-URI所標(biāo)識(shí)的資源后附加新的數(shù)據(jù)

HEAD    請(qǐng)求獲取由Request-URI所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭

PUT       請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URI作為其標(biāo)識(shí)

常用的為GET和POST;GET和POST的區(qū)別:

GET提交的內(nèi)容會(huì)直接顯示在URL中,私密性較差,可以用于顯示一些公共資源;但是GET效率會(huì)比較高。

POST不會(huì)將內(nèi)容顯示在URL中,可以用于提交一些敏感數(shù)據(jù),例如用戶名或密碼。

HTTP響應(yīng):
HTTP/1.1 200 OK                                         //響應(yīng)行由協(xié)議版本號(hào),響應(yīng)狀態(tài)碼和文本描述組成

Data:sun,15 nov 2018 11:02:04  GMT    //響應(yīng)頭

Server:bfe/1.0.8.9

……

Connection: keep-alive

                                                                      //空白行,代表響應(yīng)頭結(jié)束

<html>

</html><title>index.heml</title>                  //響應(yīng)正文

HTTP的狀態(tài)碼:

狀態(tài)代碼由三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類(lèi)別,且有五種可能取值。

1xx:指示信息 —— 表示請(qǐng)求已接收,繼續(xù)處理。

2xx:成功 —— 表示請(qǐng)求已被成功接收、理解、接受。

3xx:重定向 —— 要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作。

4xx:客戶端錯(cuò)誤 —— 請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)。

5xx:服務(wù)器端錯(cuò)誤 —— 服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求。

常見(jiàn)狀態(tài)代碼、狀態(tài)描述的說(shuō)明如下。

200 OK:客戶端請(qǐng)求成功。

400 Bad Request:客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解。

401 Unauthorized:請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和 WWW-Authenticate 報(bào)頭域一起使用。

403 Forbidden:服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)。

404 Not Found:請(qǐng)求資源不存在,舉個(gè)例子:輸入了錯(cuò)誤的URL。

500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤。

503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常。

會(huì)話與會(huì)話狀態(tài):
       Web中的會(huì)話是指一個(gè)客戶端瀏覽器與web服務(wù)器之間連續(xù)發(fā)生一系列請(qǐng)求和響應(yīng)過(guò)程。會(huì)話狀態(tài)是指在會(huì)話過(guò)程中產(chǎn)生的狀態(tài)信息;借助會(huì)話狀態(tài),web服務(wù)器能夠把屬于同一會(huì)話中的一系列的請(qǐng)求和響應(yīng)關(guān)聯(lián)起來(lái)。

Cookie
概述

       Cookie是一種在客戶端保持HTTP狀態(tài)信息的技術(shù),它好比商場(chǎng)發(fā)放的優(yōu)惠卡。在瀏覽器訪問(wèn)Web服務(wù)器的某個(gè)資源時(shí),由Web服務(wù)器在在HTTP響應(yīng)頭中附帶傳送給瀏覽器一片數(shù)據(jù),web服務(wù)器傳送給各個(gè)客戶端瀏覽器的數(shù)據(jù)是可以各不相同的。

       一旦Web瀏覽器保存了某個(gè)Cookie,那么它在以后每次訪問(wèn)該Web服務(wù)器是都應(yīng)在HTTP請(qǐng)求頭中將這個(gè)Cookie回傳個(gè)Web服務(wù)器。Web服務(wù)器通過(guò)在HTTP響應(yīng)消息中增加Set-Cookie響應(yīng)頭字段將CooKie信息發(fā)送給瀏覽器,瀏覽器則通過(guò)在HTTP請(qǐng)求消息中增加Cookie請(qǐng)求頭字段將Cookie回傳給Web服務(wù)器。

       一個(gè)Cookie只能標(biāo)識(shí)一種信息,它至少含有一個(gè)標(biāo)識(shí)該消息的名稱(chēng)(NAME)和和設(shè)置值(VALUE)。一個(gè)Web瀏覽器也可以存儲(chǔ)多個(gè)Web站點(diǎn)提供的Cookie。瀏覽器一般只允許存放300個(gè)Cookie,每個(gè)站點(diǎn)最多存放20個(gè)Cookie,每個(gè)Cookie的大小限制為4KB。

傳送示意圖



特點(diǎn)

存儲(chǔ)于瀏覽器頭部/傳輸與HTTP頭部,寫(xiě)時(shí)帶屬性,讀時(shí)無(wú)屬性。由三元【name,domain,path】唯一確定Cookie。

Set-Cookie2響應(yīng)頭字段

Set-Cookie2頭字段用于指定WEB服務(wù)器向客戶端傳送的Cookie內(nèi)容,但是按照Netscape規(guī)范實(shí)現(xiàn)Cookie功能的WEB服務(wù)器, 使用的是Set-Cookie頭字段,兩者的語(yǔ)法和作用類(lèi)似。Set-Cookie2頭字段中設(shè)置的cookie內(nèi)容是具有一定格式的字符串,它必須以Cookie的名稱(chēng)和設(shè)置值開(kāi)頭,格式為"名稱(chēng)=值”,后面可以加上0個(gè)或多個(gè)以分號(hào)(;) 和空格分隔的其它可選屬性,屬性格式一般為 "屬性名=值”。

除了“名稱(chēng)=值”對(duì)必須位于最前面外,其他的可選屬性可以任意。Cookie的名稱(chēng)只能由普通的英文ASCII字符組成,瀏覽器不用關(guān)心和理解Cookie的值部分的意義和格式,只要WEB服務(wù)器能理解值部分的意義就行。大多數(shù)現(xiàn)有的WEB服務(wù)器都是采用某種編碼方式將值部分的內(nèi)容編碼成可打印的ASCII字符,RFC 2965規(guī)范中沒(méi)有明確限定編碼方式。

舉例:   Set-Cookie2: user-hello; Version=1; Path=/

Cookie請(qǐng)求頭字段

Cookie請(qǐng)求頭字段中的每個(gè)Cookie之間用逗號(hào)(,)或分號(hào)(;)分隔。在Cookie請(qǐng)求字段中除了必須有“名稱(chēng)=值”的設(shè)置外,還可以有Version、path、domain、port等屬性;在Version、path、domain、port等屬性名之前,都要增加一個(gè)“$”字符作為前綴。Version屬性只能出現(xiàn)一次,且要位于Cookie請(qǐng)求頭字段設(shè)置值的最前面,如果需要設(shè)置某個(gè)Cookie信息的Path、Domain、Port等屬性,它們必須位于該Cookie信息的“名稱(chēng)=值”設(shè)置之后。

       瀏覽器使用Cookie請(qǐng)求頭字段將Cookie信息會(huì)送給Web服務(wù)器;多個(gè)Cookie信息通過(guò)一個(gè)Cookie請(qǐng)求頭字段會(huì)送給Web服務(wù)器。

瀏覽器會(huì)根據(jù)下面幾個(gè)規(guī)則決定是否發(fā)送某個(gè)Cookie信息:

       1、請(qǐng)求主機(jī)名是否與某個(gè)存儲(chǔ)的Cookie的Domain屬性匹配

       2、請(qǐng)求的端口號(hào)是否在該Cookie的Port屬性列表中

       3、請(qǐng)求的資源路徑是否在該Cookie的Path屬性指定的目錄及子目錄中

       4、該Cookie的有效期是否已過(guò)

Path屬性的指向子目錄的Cookie排在Path屬性指向父目錄的Cookie之前

舉例: Cookie: $Version=1; Course=Java; $Path=/hello/lesson;Course=vc; $Path=/hello

Cookie的安全屬性

secure屬性

當(dāng)設(shè)置為true時(shí),表示創(chuàng)建的Cookie會(huì)被以安全的形式向服務(wù)器傳輸,也就是只能在HTTPS連接中被瀏覽器傳遞到服務(wù)器端進(jìn)行會(huì)話驗(yàn)證,如果是HTTP連接則不會(huì)傳遞該信息,所以不會(huì)被竊取到Cookie的具體內(nèi)容。

 HttpOnly屬性

如果在Cookie中設(shè)置了"HttpOnly"屬性,那么通過(guò)程序(JS腳本、Applet等)將無(wú)法讀取到Cookie信息,這樣能有效的防止XSS攻擊。

總結(jié):secure屬性 是防止信息在傳遞的過(guò)程中被監(jiān)聽(tīng)捕獲后信息泄漏,HttpOnly屬性的目的是防止程序獲取cookie后進(jìn)行攻擊這兩個(gè)屬性并不能解決cookie在本機(jī)出現(xiàn)的信息泄漏的問(wèn)題(FireFox的插件FireBug能直接看到cookie的相關(guān)信息)。

Session
使用Cookie和附加URL參數(shù)都可以將上一-次請(qǐng)求的狀態(tài)信息傳遞到下一次請(qǐng)求中,但是如果傳遞的狀態(tài)信息較多,將極大降低網(wǎng)絡(luò)傳輸效率和增大服務(wù)器端程序處理的難度。

概述

Session技術(shù)是一種將會(huì)話狀態(tài)保存在服務(wù)器端的技術(shù),它可以比喻成是醫(yī)院發(fā)放給病人的病歷卡和醫(yī)院為每個(gè)病人保留的病歷檔案的結(jié)合方式??蛻舳诵枰邮?、記憶和回送Session的會(huì)話標(biāo)識(shí)號(hào),Session可以且通常是借助Cookie來(lái)傳遞會(huì)話標(biāo)識(shí)號(hào)。



Session的跟蹤機(jī)制

HttpSession對(duì)象是保持會(huì)話狀態(tài)信息的存儲(chǔ)結(jié)構(gòu),一個(gè)客戶端在WEB服務(wù)器端對(duì)應(yīng)一個(gè)各自的HttpSession對(duì)象。WEB服務(wù)器并不會(huì)在客戶端開(kāi)始訪問(wèn)它時(shí)就創(chuàng)建HttpSession對(duì)象,只有客戶端訪問(wèn)某個(gè)能與客戶端開(kāi)啟會(huì)話的服務(wù)端程序時(shí),WEB應(yīng)用程序才會(huì)創(chuàng)建一個(gè)與該客戶端對(duì)應(yīng)的HttpSession對(duì)象。WEB服務(wù)器為HttpSession對(duì)象分配一個(gè)獨(dú)一無(wú)的會(huì)話標(biāo)識(shí)號(hào), 然后在響應(yīng)消息中將這個(gè)會(huì)話標(biāo)識(shí)號(hào)傳遞給客戶端??蛻舳诵枰涀?huì)話標(biāo)識(shí)號(hào),并在后續(xù)的每次訪問(wèn)請(qǐng)求中都把這個(gè)會(huì)話標(biāo)識(shí)號(hào)傳送給WEB服務(wù)器,WEB服務(wù)器端程序依據(jù)回傳的會(huì)話標(biāo)識(shí)號(hào)就知道這次請(qǐng)求是哪個(gè)客戶端發(fā)出的,從而選擇與之對(duì)應(yīng)的HttpSession對(duì)象。

WEB應(yīng)用程序創(chuàng)建了與某個(gè)客戶端對(duì)應(yīng)的HttpSession對(duì)象后,只要沒(méi)有超出一個(gè)限定的空閑時(shí)間段,HttpSession對(duì)象就駐留在WEB服務(wù)器內(nèi)存之中,該客戶端此后訪問(wèn)任意的Servlet程序時(shí),它們都使用與客戶端對(duì)應(yīng)的那個(gè)已存在的HttpSession對(duì)象。

Session是實(shí)現(xiàn)網(wǎng)上商城的購(gòu)物車(chē)的最佳方案,存儲(chǔ)在某個(gè)客戶Session中的一個(gè)集合對(duì)象就可充當(dāng)該客戶的一個(gè)購(gòu)物車(chē)。

超時(shí)管理

WEB服務(wù)器無(wú)法判斷當(dāng)前的客戶端瀏覽器是否還會(huì)繼續(xù)訪問(wèn),也無(wú)法檢測(cè)客戶端瀏覽器是否關(guān)閉,所以,即使客戶已經(jīng)離開(kāi)或關(guān)閉了瀏覽器,WEB服務(wù)器還要保留與之對(duì)應(yīng)的HttpSession對(duì)象。隨著時(shí)間的推移而不斷增加新的訪問(wèn)客戶端,WEB服務(wù)器內(nèi)存中將會(huì)因此積累起大量的不再被使用的HttpSession對(duì)象,并將最終導(dǎo)致服務(wù)器內(nèi)存耗盡。WEB服務(wù)器采用“超時(shí)限制”的辦法來(lái)判斷客戶端是否還在繼續(xù)訪問(wèn)如果某個(gè)客戶端在一定的時(shí)間之 內(nèi)沒(méi)有發(fā)出后續(xù)請(qǐng)求,WEB服務(wù)器則認(rèn)為客戶端已經(jīng)停止了活動(dòng),結(jié)束與該客戶端的會(huì)話并將與之對(duì)應(yīng)的HttpSession對(duì)象變成垃圾。

如果客戶端瀏覽器超時(shí)后再次發(fā)出訪問(wèn)請(qǐng)求,Web服務(wù)器則認(rèn)為這是一個(gè)新的會(huì)話開(kāi)始,將為之創(chuàng)建新的Httpsession對(duì)象和分配新的會(huì)話標(biāo)識(shí)號(hào)。

利用Cookie實(shí)現(xiàn)Session的跟蹤

如果WEB服務(wù)器處理某個(gè)訪問(wèn)請(qǐng)求時(shí)創(chuàng)建了新的HttpSession對(duì)象,它將把會(huì)話標(biāo)識(shí)號(hào)作為一個(gè)Cookie項(xiàng)加入到響應(yīng)消息中,通常情況下,瀏覽器在隨后發(fā)出的訪問(wèn)請(qǐng)求中又將會(huì)話標(biāo)識(shí)號(hào)以Cookie的形式回傳給WEB服務(wù)器。WEB服務(wù)器端程序依據(jù)回傳的會(huì)話標(biāo)識(shí)號(hào)就知道以前已經(jīng)為該客戶端創(chuàng)建了HttpSession對(duì)象,不必再為該客戶端創(chuàng)建新的HttpSession對(duì)象,而是直接使用與該會(huì)話標(biāo)識(shí)號(hào)匹配的HttpSession對(duì)象,通過(guò)這種方式就實(shí)現(xiàn)了對(duì)同一個(gè)客戶端的會(huì)話狀態(tài)的跟蹤。

利用URL重寫(xiě)實(shí)現(xiàn)Session跟蹤

Servlet規(guī)范中引入了一種補(bǔ)充的會(huì)話管理機(jī)制,它允許不支持Cookie的瀏覽器也可以與WEB服務(wù)器保持連續(xù)的會(huì)話。這種補(bǔ)充機(jī)制要求在響應(yīng)消息的實(shí)體內(nèi)容中必須包含下一 次請(qǐng)求的超鏈接,并將會(huì)話標(biāo)識(shí)號(hào)作為超鏈接的URL地址的一個(gè)特殊參數(shù)。將會(huì)話標(biāo)識(shí)號(hào)以參數(shù)形式附加在超鏈接的URL地址后面的技術(shù)稱(chēng)為URL重寫(xiě)。 如果在瀏覽器不支持Cookie或者關(guān)閉了Cookie功能的情況下,WEB服務(wù)器還要能夠與瀏覽器實(shí)現(xiàn)有狀態(tài)的會(huì)話,就必須對(duì)所有能被客戶端訪問(wèn)的請(qǐng)求路徑(包括超鏈接、form表單的action屬性設(shè)置和重定向的URL)進(jìn)行URL重寫(xiě)。

Cookie和Session的區(qū)別
session和cookies同樣都是針對(duì)單獨(dú)用戶的變量(或者說(shuō)是對(duì)象好像更合適點(diǎn)),不同的用戶在訪問(wèn)網(wǎng)站的時(shí)候都會(huì)擁有各自的session或者cookies,不同用戶之間互不干擾。

他們的不同點(diǎn)是:

1,存儲(chǔ)位置不同

session在服務(wù)器端存儲(chǔ),比較安全,但是如果session較多則會(huì)影響性能

cookies在客戶端存儲(chǔ),存在較大的安全隱患

2,生命周期不同

session生命周期在指定的時(shí)間(如20分鐘) 到了之后會(huì)結(jié)束,不到指定的時(shí)間,也會(huì)隨著瀏覽器進(jìn)程的結(jié)束而結(jié)束。

cookies默認(rèn)情況下也隨著瀏覽器進(jìn)程結(jié)束而結(jié)束,但如果手動(dòng)指定時(shí)間,則不受瀏覽器進(jìn)程結(jié)束的影響。

總結(jié):簡(jiǎn)而言之,兩者都是保存了用戶操作的歷史信息,但是存在的地方不同;而且session和cookie的目的相同,都是為了克服HTTP協(xié)議無(wú)狀態(tài)的缺陷,但是完成方法不同。Session通過(guò)cookie在客戶端保存session id,將用戶的其他會(huì)話消息保存在服務(wù)端的session對(duì)象中;而cookie需要將所有信息都保存在客戶端,因此存在著一定的安全隱患,例如本地Cookie中可能保存著用戶名和密碼,容易泄露。
————————————————
版權(quán)聲明:本文為CSDN博主「悲觀的樂(lè)觀主義者」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43997530/article/details/105650267


淺顯易懂的cookie的使用(設(shè)置和獲取cookie緩存)

前端達(dá)人

js中cookie的使用(設(shè)置和獲取cookie緩存)
生為一個(gè)已經(jīng)入職一年多的前端小白,第一次寫(xiě)博客還有點(diǎn)小激動(dòng),有不足的地方還希望大家多多指出,因?yàn)樽罱?xiàng)目有涉及到利用cookie緩存數(shù)據(jù),所以在這邊再鞏固一下。

1、cookie的定義
在使用瀏覽器中,經(jīng)常涉及到數(shù)據(jù)的交換,比如你登錄系統(tǒng)賬號(hào),登錄一個(gè)頁(yè)面。我們經(jīng)常會(huì)在此時(shí)設(shè)置記住賬號(hào)啥的,或者自動(dòng)登錄選項(xiàng)。那這些都是怎么實(shí)現(xiàn)的呢,答案就是今天的主角cookie了,Cookie是由HTTP服務(wù)器設(shè)置的,保存在瀏覽器中,但HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會(huì)關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。
從JavaScript的角度看,cookie 就是一些字符串信息。這些信息存放在客戶端的計(jì)算機(jī)中,用于客戶端計(jì)算機(jī)與服務(wù)器之間傳遞信息。
在JavaScript中可以通過(guò) document.cookie 來(lái)讀取或設(shè)置這些信息。由于 cookie 多用在客戶端和服務(wù)端之間進(jìn)行通信,所以除了JavaScript以外,服務(wù)端的語(yǔ)言(如PHP)也可以存取 cookie。

2、cookie的使用
設(shè)置cookie
function setCookie(c_name, value, expiredays) {
       var exdate = new Date()
       exdate.setDate(exdate.getDate() + expiredays)
       document.cookie = c_name + "=" + escape(value) +
           ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString())+";path=/";
   }
1
2
3
4
5
6
調(diào)用該方法如:

var userId="123456";
setCookie("userId", userId, 30);
1
2
下面是里面參數(shù)的意義

參數(shù) 含義
c_name 自己定義的cookie名稱(chēng)
value 需要放在定義的c_name 中的值
expiredays cookie的有效期
這里有一個(gè)要注意點(diǎn)就是 " path=/"
" path=/"是只存下的cookie再該項(xiàng)目所有頁(yè)面都能去獲取,如果你想只存到弄個(gè)特定目錄可以在path中指定路徑,如:“path=/views/myHomePage”,z這樣你可以在/views/myHomePage文件下所有頁(yè)面都能取到你存的cookie了。

取回cookie
 function getCookie(c_name) {
        if (document.cookie.length > 0) {
            c_start = document.cookie.indexOf(c_name + "=")
            if (c_start != -1) {
                c_start = c_start + c_name.length + 1
                c_end = document.cookie.indexOf(";", c_start)
                if (c_end == -1) c_end = document.cookie.length
                return unescape(document.cookie.substring(c_start, c_end))
            }
        }
        return ""
    }
1
2
3
4
5
6
7
8
9
10
11
12
調(diào)用該方法如:

var newUserId= getCookie("userId");
console.log(newUserId)
alert(newUserId)
————————————————
版權(quán)聲明:本文為CSDN博主「前端陳偉霆」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43927397/article/details/105658614







javascript中的this綁定

前端達(dá)人

his是一個(gè)關(guān)鍵字,表示執(zhí)行當(dāng)前函數(shù)的對(duì)象

  • this永遠(yuǎn)跟著當(dāng)前函數(shù)走,
  • 永遠(yuǎn)是一個(gè)對(duì)象,

  • 永遠(yuǎn)在函數(shù)執(zhí)行時(shí)才能確定。
  • 1. 默認(rèn)綁定:沒(méi)有明確被隸屬對(duì)象執(zhí)行的函數(shù),this指向window


function fn(){
    console.log(this);              //window
    console.log(typeof this);       //object
}
fn();

- 嚴(yán)格模式下,this指向undefiend

"use strict";
function fn(){
    console.log(this);              //undefined
}
fn();




日歷

鏈接

個(gè)人資料

存檔