亚洲另类97色波,四季久久免费一区二区三区四区,丰满蜜桃精品视频网,国产在线观看无码九色8X视频亚洲中文字幕久久精品无码喷水_国产精品无码一区二区

首頁

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

前端達(dá)人

1. 加載和執(zhí)行

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

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

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

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

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

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

避免使用with語句,其會延長作用域鏈

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

對象的屬性和方法在原型鏈的位置越深,訪問的速度也越慢

3.Dom編程

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

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

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

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

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

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

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

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

4.算法和流程控制

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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ù)量盡量要少,建議使用一個獨(dú)立的重復(fù)定時器
  • 使用WebWork進(jìn)行計算

7. AJAX

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


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

8. 編程實(shí)踐

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


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


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

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

  • 合并、壓縮多個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)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zjw_python/java/article/details/105293878

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

前端達(dá)人

簡單來說,v-if 的初始化較快,但切換代價高;v-show 初始化慢,但切換成本低

1.共同點(diǎn)

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

2.區(qū)別

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



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

前端達(dá)人

文章目錄



    前端三要素

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

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

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

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

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

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

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

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

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

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

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

    JavaScript 框架

    1.jQuery庫

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

    2.Angular庫

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

    3.React

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

    4.Vue

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

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

    5.Axios

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

    JavaScript 構(gòu)建工具

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

    NodeJs


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

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

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

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

    常用UI框架


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

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

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

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

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

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

    官網(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ì)推出的一個基于 Vue.js的移動端組件庫,組件比較單一,功能簡單易上手!

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

    iview 是一個強(qiáng)大的基于 Vue 的 UI 庫,有很多實(shí)用的基礎(chǔ)組件比 elementui 的組件更豐富,主要服務(wù)于 PC 界面的中后臺產(chǎn)品。使用單文件的 Vue 組件化開發(fā)模式 基于 npm + webpack + babel 開發(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
    備注:屬于前端主流框架,選型時可考慮使用,主要特點(diǎn)是移動端支持較多

    ICE

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

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

    VantUI

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

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

    at-ui是一款基于Vue 2.x的前端UI組件庫,主要用于快速開發(fā)PC網(wǎng)站產(chǎn)品。 它提供了一套npm + webpack + babel 前端開發(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ì)開發(fā)的基于 Vue.js 實(shí)現(xiàn)的精致移動端組件庫。支持按需引入和后編譯,輕量靈活; 擴(kuò)展性強(qiáng),可以方便地基于現(xiàn)有組件實(shí)現(xiàn)二次開發(fā).

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

    Flutter 是谷歌的移動端 UI 框架,可在極短的時間內(nèi)構(gòu)建 Android 和 iOS 上高質(zhì)量的原生級應(yīng)用。 Flutter 可與現(xiàn)有代碼一起工作, 它被世界各地的開發(fā)者和組織使用, 并且 Flutter 是免費(fè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 既是一個 CSS 框架也是一個 Javascript UI 庫,Ionic 是目前最有潛力的一款 HTML5 手機(jī)應(yīng)用開發(fā) 框架。通過 SASS 構(gòu)建應(yīng)用程序,它提供了很多 UI 組件來幫助開發(fā)者開發(fā)強(qiáng)大的應(yīng)用。它使用 JavaScript MVVM 框架和 AngularJS/Vue 來增強(qiáng)應(yīng)用。提供數(shù)據(jù)的雙向綁定,使用它成為 Web 和移動 開發(fā)者的共同選擇。

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

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

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

    WeUi

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

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

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

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

    以 SpringMVC 流程為例:


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

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

    缺點(diǎn):

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

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

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

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

    ajax 的時代

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

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

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

    此處的 MV* 模式如下:

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




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

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

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

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


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

前端達(dá)人

文章目錄

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


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

      塊級元素

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

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

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





      <!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>塊級元素1</div>
          <div>塊級元素2</div>
      </body>
      </html>
      



       

      分析:
      塊級元素的高和寬可以被修改,而且塊級元素會在一個塊級元素之后另起一行。

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

      和相鄰的行內(nèi)元素在一行上
      高度和寬度無效,但是水平方向上的padding和margin可以設(shè)置,垂直方向上的無效
      默認(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>行級元素1</span>
          <span>行級元素2</span>
      </body>
      </html>
      


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

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

      和其他行內(nèi)或行內(nèi)塊級元素元素放置在同一行上
      元素的高度、寬度、行高以及頂和底邊距都可設(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>以前我是行級元素,</span>
          <span>現(xiàn)在我只想做行內(nèi)塊級元素。</span>
      </body>
      </html>
      


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

      顯示方式之間的轉(zhuǎn)化
      想要轉(zhuǎn)成什么顯示方式 格式
      塊級元素 display:inline;
      行級元素 display: block;
      行內(nèi)塊級元素 display: inline-block;
      這些直接在元素里面添加就可以了,就會轉(zhuǎn)換成相對應(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>我以前是塊級元素,</div>
          <div>現(xiàn)在我是行級元素!</div>
      </body>
      </html>
      






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






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



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

前端達(dá)人

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



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



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



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

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

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



打開VSCode > Help > Interactive Playground

點(diǎn)擊查看原圖

你將會打開 Interactive Editor Playground 頁面

互動式編輯游樂場

點(diǎn)擊查看原圖

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

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

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

點(diǎn)擊查看原圖

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

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

點(diǎn)擊查看原圖

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

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


這只是智能提示的冰山一角,還有懸停在函數(shù)名上可以看到參數(shù)及其注釋(如果有)等等,它會潛移默化的帶給你極大幫助

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

Line Actions

點(diǎn)擊查看原圖

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

點(diǎn)擊查看原圖

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

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

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

Formatting

點(diǎn)擊查看原圖

代碼如果沒有良好的編寫格式,閱讀起來是一個折磨

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

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

點(diǎn)擊查看原圖

Code Folding

點(diǎn)擊查看原圖

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

快捷鍵:

  • 折疊 Ctrl + Shift + [
  • 展開 Ctrl + Shift + ]

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

Errors and Warning

點(diǎn)擊查看原圖

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

在代碼示例中可以看到許多語法錯誤(如果沒有,請你隨便修改它,讓它出現(xiàn)錯誤)

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

Snippets

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

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

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

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

Emmet

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

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

比如說:

然后Enter

JavaScript Type Checking

點(diǎn)擊查看原圖



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

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

前端達(dá)人

1.jpg

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


表單的作用

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

表單信息的分割方式

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

點(diǎn)擊查看原圖

點(diǎn)擊查看原圖

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

點(diǎn)擊查看原圖

點(diǎn)擊查看原圖

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

點(diǎn)擊查看原圖


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


點(diǎn)擊查看原圖


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

點(diǎn)擊查看原圖


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

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

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

點(diǎn)擊查看原圖


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

列表+可視化

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

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

點(diǎn)擊查看原圖


點(diǎn)擊查看原圖


根據(jù)條件排序

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

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

點(diǎn)擊查看原圖



篩選過濾

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

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

點(diǎn)擊查看原圖



關(guān)鍵字搜索

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

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

點(diǎn)擊查看原圖



懸停展現(xiàn)操作

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

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


點(diǎn)擊查看原圖



可展開列表

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

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

點(diǎn)擊查看原圖



可編輯列表

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

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

點(diǎn)擊查看原圖



快速預(yù)覽

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

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

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


點(diǎn)擊查看原圖


點(diǎn)擊查看原圖



自定義列

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

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

固定頭部

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

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

間距的規(guī)則

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

總結(jié)

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


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




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

前端達(dá)人


定義


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



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

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

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



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

交換變量的值

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



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

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



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

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



提取 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)部再寫var foo = config.foo || ‘default foo’;這樣的語句



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

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



輸入模塊的指定方法

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


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


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



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



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



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



解構(gòu)賦值允許指定默認(rèn)值,當(dāng)一個數(shù)組成員嚴(yán)格等于undefined,默認(rèn)值才會生效,否則取賦值的值;如果默認(rèn)值是一個表達(dá)式,那么這個表達(dá)式是惰性求值的,即只有在用到的時候,才會求值;默認(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 []
 // 等號右邊不是數(shù)組會報錯
 // 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、對象的解構(gòu)賦值
對象的解構(gòu)賦值的內(nèi)部機(jī)制,是先找到同名屬性,然后再賦給對應(yīng)的變量。真正被賦值的是后者,而不是前者

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

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

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

objFuc(){
            // 對象解構(gòu)賦值
            let {b,a} = {a:1}
            console.log(a,b)//1 undefined
            // 已有對象解構(gòu)賦值
            let { sin, cos } = Math;//將Math對象的對數(shù)、正弦、余弦三個方法,賦值到對應(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)值
            // 錯誤的寫法
            let xx;
            // {xx} = {xx: 1};// SyntaxError: syntax error,Uncaught SyntaxError: Unexpected token '='
            ({xx} = {xx: 1});//正確寫法
            console.log(xx)
            // 古怪的,等式左邊可為空
            // ({} = [true, false]);
            // 對象可解構(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)賦值

  • 字符串賦值
  • 類似數(shù)組的對象都有一個length屬性,因此還可以對這個屬性解構(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
            // 對數(shù)組屬性解構(gòu)賦值
            let {length} = this.str;
            console.log(length)//7
        },

    

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

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

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

淺析HTTP協(xié)議

前端達(dá)人

目錄

HTTP協(xié)議

HTTP請求:

HTTP響應(yīng):

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

Cookie

Session

Cookie和Session的區(qū)別

HTTP協(xié)議


 HTTP請求:
Post /test.php HTTP/1.1                               //請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協(xié)議的版本

Host: www.test.com                                       //請求頭

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

Gecko/20100101 firefox15.0

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

Username=admin&passwd=admin                             //請求正文

HTTP請求方法



GET       請求獲取Request-URI所標(biāo)識的資源

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

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

PUT       請求服務(wù)器存儲一個資源,并用Request-URI作為其標(biāo)識

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

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

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

HTTP響應(yīng):
HTTP/1.1 200 OK                                         //響應(yīng)行由協(xié)議版本號,響應(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ù)字組成,第一個數(shù)字定義了響應(yīng)的類別,且有五種可能取值。

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

2xx:成功 —— 表示請求已被成功接收、理解、接受。

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

4xx:客戶端錯誤 —— 請求有語法錯誤或請求無法實(shí)現(xiàn)。

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

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

200 OK:客戶端請求成功。

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

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

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

404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。

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

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

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

Cookie
概述

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

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

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

傳送示意圖



特點(diǎn)

存儲于瀏覽器頭部/傳輸與HTTP頭部,寫時帶屬性,讀時無屬性。由三元【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頭字段,兩者的語法和作用類似。Set-Cookie2頭字段中設(shè)置的cookie內(nèi)容是具有一定格式的字符串,它必須以Cookie的名稱和設(shè)置值開頭,格式為"名稱=值”,后面可以加上0個或多個以分號(;) 和空格分隔的其它可選屬性,屬性格式一般為 "屬性名=值”。

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

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

Cookie請求頭字段

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

       瀏覽器使用Cookie請求頭字段將Cookie信息會送給Web服務(wù)器;多個Cookie信息通過一個Cookie請求頭字段會送給Web服務(wù)器。

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

       1、請求主機(jī)名是否與某個存儲的Cookie的Domain屬性匹配

       2、請求的端口號是否在該Cookie的Port屬性列表中

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

       4、該Cookie的有效期是否已過

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

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

Cookie的安全屬性

secure屬性

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

 HttpOnly屬性

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

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

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

概述

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



Session的跟蹤機(jī)制

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

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

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

超時管理

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

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

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

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

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

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

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

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

1,存儲位置不同

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

cookies在客戶端存儲,存在較大的安全隱患

2,生命周期不同

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

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

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


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

前端達(dá)人

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

1、cookie的定義
在使用瀏覽器中,經(jīng)常涉及到數(shù)據(jù)的交換,比如你登錄系統(tǒng)賬號,登錄一個頁面。我們經(jīng)常會在此時設(shè)置記住賬號啥的,或者自動登錄選項(xiàng)。那這些都是怎么實(shí)現(xiàn)的呢,答案就是今天的主角cookie了,Cookie是由HTTP服務(wù)器設(shè)置的,保存在瀏覽器中,但HTTP協(xié)議是一種無狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。
從JavaScript的角度看,cookie 就是一些字符串信息。這些信息存放在客戶端的計算機(jī)中,用于客戶端計算機(jī)與服務(wù)器之間傳遞信息。
在JavaScript中可以通過 document.cookie 來讀取或設(shè)置這些信息。由于 cookie 多用在客戶端和服務(wù)端之間進(jìn)行通信,所以除了JavaScript以外,服務(wù)端的語言(如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名稱
value 需要放在定義的c_name 中的值
expiredays cookie的有效期
這里有一個要注意點(diǎn)就是 " path=/"
" path=/"是只存下的cookie再該項(xiàng)目所有頁面都能去獲取,如果你想只存到弄個特定目錄可以在path中指定路徑,如:“path=/views/myHomePage”,z這樣你可以在/views/myHomePage文件下所有頁面都能取到你存的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)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43927397/article/details/105658614







javascript中的this綁定

前端達(dá)人

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

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

  • 永遠(yuǎn)在函數(shù)執(zhí)行時才能確定。
  • 1. 默認(rèn)綁定:沒有明確被隸屬對象執(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();




日歷

鏈接

個人資料

存檔