Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产精品久久久视频,国产综合一区二区,一区二区三区在线播放视频

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          新來的前端小姐姐問:Vue路由history模式刷新頁面出現(xiàn)404問題

          ??此賬號為華為云開發(fā)者社區(qū)官方運營賬號,提供全面深入的云計算前景分析、豐富的技術(shù)干貨、程序樣例,分享華為云前沿資訊動態(tài)


          本文分享自華為云社區(qū)《學(xué)習(xí)VueRouter,HTML5 History 模式,因為history模式刷新頁面會出現(xiàn)404》,作者: DevFeng 。


          vue-router 默認 hash 模式 —— 使用 URL 的 hash 來模擬一個完整的 URL,于是當(dāng) URL 改變時,頁面不會重新加載。

          如果不想要很丑的 hash,我們可以用路由的 history 模式,這種模式充分利用 history.pushState API 來完成 URL 跳轉(zhuǎn)而無須重新加載頁面。

          const router = new VueRouter({
            mode: 'history',
            routes: [...]
          })

          當(dāng)你使用 history 模式時,URL 就像正常的 url,例如 http://yoursite.com/user/id,也好看!

          不過這種模式要玩好,還需要后臺配置支持。因為我們的應(yīng)用是個單頁客戶端應(yīng)用,如果后臺沒有正確的配置,當(dāng)用戶在瀏覽器直接訪問 http://oursite.com/user/id 就會返回 404,這就不好看了。

          所以呢,你要在服務(wù)端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源,則應(yīng)該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。

          #后端配置例子

          注意:下列示例假設(shè)你在根目錄服務(wù)這個應(yīng)用。如果想部署到一個子目錄,你需要使用 VueCLI 的

          publicPath 選項 (opens new window)和相關(guān)的 router base property (opens new window)。你還需要把下列示例中的根目錄調(diào)整成為子目錄 (例如用 RewriteBase /name-of-your-subfolder/ 替換掉 RewriteBase/)。

          #Apache

          <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteRule ^index\.html$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . /index.html [L]
          </IfModule>

          除了 mod_rewrite,你也可以使用 FallbackResource (opens new window)。

          #nginx

          location / {
            try_files $uri $uri/ /index.html;
          }

          #原生 Node.js

          const http = require('http')
          const fs = require('fs')
          const httpPort = 80
          
          http.createServer((req, res) => {
            fs.readFile('index.html', 'utf-8', (err, content) => {
              if (err) {
                console.log('We cannot open "index.html" file.')
              }
          
              res.writeHead(200, {
                'Content-Type': 'text/html; charset=utf-8'
              })
          
              res.end(content)
            })
          }).listen(httpPort, () => {
            console.log('Server listening on: http://localhost:%s', httpPort)
          })

          #基于 Node.js 的 Express

          對于Node.js/Express,請考慮使用 connect-history-api-fallback 中間件 (opens new window)。

          #Internet InformationServices (IIS)

          1. 安裝 IIS UrlRewrite(opens new window)

          2. 在你的網(wǎng)站根目錄中創(chuàng)建一個 web.config 文件,內(nèi)容如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <configuration>
            <system.webServer>
              <rewrite>
                <rules>
                  <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll">
                      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/" />
                  </rule>
                </rules>
              </rewrite>
            </system.webServer>
          </configuration>

          #Caddy

          rewrite {
              regexp .*
              to {path} /
          }

          #Firebase 主機

          在你的 firebase.json 中加入:

          {
            "hosting": {
              "public": "dist",
              "rewrites": [
                {
                  "source": "**",
                  "destination": "/index.html"
                }
              ]
            }
          }

          #警告

          給個警告,因為這么做以后,你的服務(wù)器就不再返回 404 錯誤頁面,因為對于所有路徑都會返回

          index.html 文件。為了避免這種情況,你應(yīng)該在 Vue 應(yīng)用里面覆蓋所有的路由情況,然后再給出一個 404 頁面。

          const router = new VueRouter({
            mode: 'history',
            routes: [
              { path: '*', component: NotFoundComponent }
            ]
          })

          或者,如果你使用 Node.js 服務(wù)器,你可以用服務(wù)端路由匹配到來的 URL,并在沒有匹配到路由的時候返回 404,以實現(xiàn)回退。


          點擊關(guān)注,第一時間了解華為云新鮮技術(shù)~華為云博客_大數(shù)據(jù)博客_AI博客_云計算博客_開發(fā)者中心-華為云

          、良生- input type=file與文件上傳

          本文所說的input type=file指的是type類型是file的input元素,最簡HTML代碼如下:

          <input type=file>

          但是,為了習(xí)慣,我們多寫成:

          <input type="file">

          在HTML5出現(xiàn)之前(XHTML),我們的閉合規(guī)則則有些出入:

          <input type="file" />

          顧名思義,選擇文件,并上傳文件。

          在萬惡的舊時代,HTML5還沒有出現(xiàn)之前,原生的file input表單元素只能讓我們一次上傳一張圖片。無法滿足一次上傳多圖的交互需求,所以,很多場景,就被swfupload.js給取代了,有點逐漸淡出人們視野的感覺。

          然,技術(shù)發(fā)展,日新月異,三十年河?xùn)|,三十年河西。隨著原生HTML5表單對多圖(multiple屬性)、上傳前預(yù)覽,二進制上傳等支持越來越廣泛,原生的file input表單元素又迎來了新的升級,flash為背景的swfupload.js注定要落寞。

          但是,對于PC項目,IE8-IE9瀏覽器還是不能忽略的。所以,現(xiàn)在,很流行的一種處理方式,就是HTML5 file上傳和flash swfupload上傳一起整合的模式,優(yōu)先使用原生HTML5上傳,不支持的,使用flash上傳。我之前有篇關(guān)于HTML5上傳的文章,每天訪問量很高的:“基于HTML5的可預(yù)覽多圖片Ajax上傳”,大家有興趣可以看看。

          如果想使用瀏覽器原生特性實現(xiàn)文件上傳(如圖片)效果,父級的form元素有個東西不能丟,就是:

          enctype="multipart/form-data"

          enctype屬性規(guī)定在發(fā)送到服務(wù)器之前應(yīng)該如何對表單數(shù)據(jù)進行編碼,默認的編碼是:”application/x-www-form-urlencoded“。對于普通數(shù)據(jù)是挺適用的,但是,對于文件,科科,就不能亂編碼了,該什么就是什么,只能使用multipart/form-data作為enctype屬性值。

          無論是舊時代的單圖上傳,還是HTML5中的多圖上傳,均是如此。

          文件,尤其圖片,上場前能夠預(yù)覽,是很棒的交互體驗。不走服務(wù)器,不耗費流量,多棒!

          理想雖好,實現(xiàn)起來……

          在HTML5還沒出現(xiàn)的舊時代,只有低版本的IE瀏覽器貌似有方法,使用私有的濾鏡,超越安全的限制(其實是利用了不好的東西),實現(xiàn)圖片直接預(yù)覽;但是呢,那個時候,Chrome, FireFox沒有這一出,于是,想要使用原生file input實現(xiàn)圖片的上傳前預(yù)覽,兼容性坎很難跨過去。

          但是,后來,HTML5來了,我們出現(xiàn)了轉(zhuǎn)機,IE10+以及其他現(xiàn)代瀏覽器,可以讓我們直接讀取圖片的數(shù)據(jù),然后在頁面上呈現(xiàn),實現(xiàn)了上傳前預(yù)覽;加上之前老IE的濾鏡策略,貌似,可行。但是呢但是,老的IE瀏覽器只能最多一次選擇一個文件,因此,只有單圖上傳的時候,大家可以考慮考慮。

          傳統(tǒng)的form提交,是要改變頁面流的,也就是刷新后跳轉(zhuǎn)。好的體驗應(yīng)該是走Ajax交互的。HTML5里面支持二進制formData數(shù)據(jù)提交,因此,可以從容Ajax提交上傳的文件數(shù)據(jù);那老舊的IE瀏覽器怎么辦?

          一般方法如下:

          <form action="" method="post" enctype="multipart/form-data" target="uploadIframe">< <iframe id="uploadIframe"></iframe>

          var doc = iframe.contentDocument ? iframe.contentDocument : frames[iframe.id].document; var response = doc.body && doc.body.innerHTML;

          OK, 當(dāng)然,你也可以不用像上面這么麻煩,直接使用jquery.form.js. 原理呢,就是上面這樣,但是,不需要這么麻煩。

          原生的file input不收待見的另外一個原因是:長的丑還不好控制。

          舉個例子,下圖這個“選擇文件”這幾個文字,我們就不好對file控件動刀子實現(xiàn)自定義:

          file input框

          怎么辦呢?

          有一種方法是這樣的: 讓file類型的元素透明度0,覆蓋在我們好看的按鈕上。然后我們?nèi)c擊好看的按鈕,實際上點擊是是file元素。

          然而,此方法有一些不足:

          更好的方法是,使用label元素與file控件關(guān)聯(lián),好處在于:

          <label class="ui_button ui_button_primary" for="xFile">上傳文件</label> <form><input type="file" id="xFile" style="position:absolute;clip:rect(0 0 0 0);"></form>

          效果如下(真實實時效果):

          input file類型控件有一個屬性,名為

          accept

          , 可能有些小伙伴不太了解??梢杂脕碇付g覽器接受的文件類型,也就是的那個我們打開系統(tǒng)的選擇文件彈框的時候,默認界面中呈現(xiàn)的文件類型。例如:

          accept="image/jpeg"

          ,則界面中只有jpg圖片,如下截圖,同時,窗體右下方是“自定義文件”按鈕:

          自定義文件

          實際開發(fā)的時候,很少只允許傳jpg圖片,應(yīng)該都是只能傳圖片類型,此時,可以使用:

          accept="image/*"

          于是乎,“自定義文件”按鈕變成了語義更明確的“圖片文件”:

          圖片文件

          accept屬性值其實是MIME類型, 例如下面幾個可能常用的:

          accept="application/pdf" accept="audio/x-mpeg" accept="text/html" .accept="video/x-mpeg2"

          然后,多個屬性值使用逗號分隔,例如:

          <input accept="audio/*,video/*,image/*">

          現(xiàn)代瀏覽器直接value = "", 有些IE瀏覽器貌似不行,好像使用file.outerHTML = file.outerHTML,我自己沒測試。

          不過我覺得比較麻煩,還要判斷瀏覽器什么的。像本文的Ajax單圖上傳,直接form.reset()就可以了。

          以上~

          本文為原創(chuàng)文章,會經(jīng)常更新知識點以及修正一些錯誤,因此轉(zhuǎn)載請保留原出處,方便溯源,避免陳舊錯誤知識的誤導(dǎo),同時有更好的閱讀體驗。

          下面試題不分先后順序

          1、vue實現(xiàn)雙向數(shù)據(jù)綁定原理是什么?

          八股文不想寫了自己百度吧...

          2、v-model語法糖是怎么實現(xiàn)的

          3、Hash和history有什么區(qū)別

          Hash模式

          1、定義

          hash 模式是一種把前端路由的路徑用井號 # 拼接在真實 url 后面的模式。當(dāng)井號 # 后面的路徑發(fā)生變化時,瀏覽器并不會重新發(fā)起請求,而是會觸發(fā) onhashchange 事件。

          2、網(wǎng)頁url組成部分

          (1)了解幾個url的屬性

          屬性

          含義

          location.protocal

          協(xié)議

          location.hostname

          主機名

          location.host

          主機

          location.port

          端口號

          location.patchname

          訪問頁面

          location.search

          搜索內(nèi)容

          location.hash

          哈希值

          (2)演示

          下面用一個網(wǎng)址來演示以上屬性:

          History模式

          hash的特點

          • hash變化會觸發(fā)網(wǎng)頁跳轉(zhuǎn),即瀏覽器的前進和后退。
          • hash 可以改變 url ,但是不會觸發(fā)頁面重新加載(hash的改變是記錄在 window.history 中),即不會刷新頁面。也就是說,所有頁面的跳轉(zhuǎn)都是在客戶端進行操作。因此,這并不算是一次 http 請求,所以這種模式不利于 SEO 優(yōu)化。hash 只能修改 # 后面的部分,所以只能跳轉(zhuǎn)到與當(dāng)前 url 同文檔的 url 。
          • hash 通過 window.onhashchange 的方式,來監(jiān)聽 hash 的改變,借此實現(xiàn)無刷新跳轉(zhuǎn)的功能。
          • hash 永遠不會提交到 server 端(可以理解為只在前端自生自滅)。三、History模式

          1、定義

          history APIH5 提供的新特性,允許開發(fā)者直接更改前端路由,即更新瀏覽器 URL 地址而不重新發(fā)起請求。

          2、與hash的區(qū)別

          我們用一個例子來演示, hashhistory 在瀏覽器下刷新時的區(qū)別。具體如下:

          正常頁面瀏覽

          改造H5 history模式

          3、history的API

          下面闡述幾種 HTML5 新增的 history API具體如下表:

          API

          定義

          history.pushState(data, title [, url])

          pushState主要用于往歷史記錄堆棧頂部添加一條記錄。各參數(shù)解析如下:①data會在onpopstate事件觸發(fā)時作為參數(shù)傳遞過去;②title為頁面標(biāo)題,當(dāng)前所有瀏覽器都會忽略此參數(shù);③url為頁面地址,可選,缺少時表示為當(dāng)前頁地址

          history.replaceState(data, title [, url])

          更改當(dāng)前的歷史記錄,參數(shù)同上; 上面的pushState是添加,這個更改

          history.state

          用于存儲以上方法的data數(shù)據(jù),不同瀏覽器的讀寫權(quán)限不一樣

          window.onpopstate

          響應(yīng)pushState或者replaceState的調(diào)用

          4、history的特點

          對于 history 來說,主要有以下特點:

          • 新的 url 可以是與當(dāng)前 url 同源的任意 url ,也可以是與當(dāng)前 url 一樣的地址,但是這樣會導(dǎo)致的一個問題是,會把重復(fù)的這一次操作記錄到棧當(dāng)中。
          • 通過 history.state ,添加任意類型的數(shù)據(jù)到記錄中。
          • 可以額外設(shè)置 title 屬性,以便后續(xù)使用。
          • 通過 pushState 、 replaceState 來實現(xiàn)無刷新跳轉(zhuǎn)的功能。

          5、存在問題

          對于 history 來說,確實解決了不少 hash 存在的問題,但是也帶來了新的問題。

          具體如下:

          • 使用 history 模式時,在對當(dāng)前的頁面進行刷新時,此時瀏覽器會重新發(fā)起請求。如果 nginx 沒有匹配得到當(dāng)前的 url ,就會出現(xiàn) 404 的頁面。
          • 而對于 hash 模式來說, 它雖然看著是改變了 url ,但不會被包括在 http 請求中。所以,它算是被用來指導(dǎo)瀏覽器的動作,并不影響服務(wù)器端。因此,改變 hash 并沒有真正地改變 url ,所以頁面路徑還是之前的路徑, nginx 也就不會攔截。
          • 因此,在使用 history 模式時,需要通過服務(wù)端來允許地址可訪問,如果沒有設(shè)置,就很容易導(dǎo)致出現(xiàn) 404 的局面。

          6、兩者選擇

          下面我們再來介紹下在實際的項目中,如何對這兩者進行選擇。具體如下:

          • to B 的系統(tǒng)推薦用 hash ,相對簡單且容易使用,且因為 hashurl 規(guī)范不敏感;
          • to C 的系統(tǒng),可以考慮選擇 H5 history ,但是需要服務(wù)端支持
          • 能先用簡單的,就別用復(fù)雜的,要考慮成本和收益。

          4、什么是深拷貝和淺拷貝?以及怎么實現(xiàn)深拷貝和淺拷貝?

          淺拷貝與深拷貝

          • 淺拷貝是創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。如果屬性是基本類型,拷貝的就是基本類型的值,如果屬性是引用類型,拷貝的就是內(nèi)存地址 ,所以如果其中一個對象改變了這個地址,就會影響到另一個對象。
          • 深拷貝是將一個對象從內(nèi)存中完整的拷貝一份出來,從堆內(nèi)存中開辟一個新的區(qū)域存放新對象,且修改新對象不會影響原對象。

          借助ConardLi大佬以下兩張圖片,幫我們更好的理解兩者的含義:

          總而言之,淺拷貝只復(fù)制指向某個對象的指針,而不復(fù)制對象本身,新舊對象還是共享同一塊內(nèi)存。但深拷貝會另外創(chuàng)造一個一模一樣的對象,新對象跟原對象不共享內(nèi)存,修改新對象不會改到原對象。

          5、什么是原型什么是原型鏈?

          var person = new Person()

          console.log(person.constructor === Person) // true

          當(dāng)獲取person.constructor時,其實person中并沒有constructor屬性,當(dāng)不能讀取到constructor屬性時,會從person的原型,也就是Person.prototype中讀取時,正好原型中有該屬性,所以 person.constructor === Person.prototype.constructor

          其次是__proto__,絕大部分瀏覽器都支持這個非標(biāo)準的方法訪問原型,然而它并不存在于Person.prototype中。

          實際上,它是來自與Object.prototype,與其說是一個屬性,不如說是一個getter/setter,當(dāng)使用obj.__proto__時,可以理解成返回了Object.getPrototypeOf(obj) 。

          總結(jié):

          1. 當(dāng)一個對象查找屬性和方法時會從自身查找,如果查找不到則會通過__proto__指向被實例化的構(gòu)造函數(shù)的prototype
          2. 隱式原型也是一個對象,是指向我們構(gòu)造函數(shù)的原型
          3. 除了最頂層的Object對象沒有__proto_,其他所有的對象都有__proto__,這是隱式原型
          4. 隱式原型__proto__的作用是讓對象通過它來一直往上查找屬性或方法,直到找到最頂層的Object的__proto__屬性,它的值是null,這個查找的過程就是原型鏈

          6、箭頭函數(shù)和普通函數(shù)有什么區(qū)別?

          1. 箭頭函數(shù)比普通函數(shù)更加簡潔。

          如果沒有參數(shù),就直接寫一個空括號即可

          如果只有一個參數(shù),可以省去參數(shù)括號

          如果有多個參數(shù),用逗號分割

          如果函數(shù)體的返回值只有一句,可以省略大括號

          如果函數(shù)體不需要返回值,且只有一句話,可以給這個語句前面加一個void關(guān)鍵字。

          最常用的就是調(diào)用一個函數(shù):

          let fn = () => void doesNotReturn()

          1. 箭頭函數(shù)沒有自己的this

          箭頭函數(shù)不會創(chuàng)建自己的this,所以它沒有自己的this,它只會在自己作用域的上一層繼承this。所以箭頭函數(shù)中的this的指向在它在定義時一家確定了,之后不會改變。


          1. 箭頭函數(shù)繼承來的this指向永遠不會改變
          2. call()、apply()、bind()等方法不能改變箭頭函數(shù)中的this指向
          3. 箭頭函數(shù)不能作為構(gòu)造函數(shù)使用
          4. 箭頭函數(shù)沒有自己的arguments
          5. 箭頭函數(shù)沒有prototype
          6. 箭頭函數(shù)不能用作Generator函數(shù),不能使用yeild關(guān)鍵字

          7、New操作符做了什么事情?

          8、說一下eventloop

          戳右邊鏈接https://segmentfault.com/a/1190000016278115

          9、什么是閉包,閉包的作用是什么

          當(dāng)一個內(nèi)部函數(shù)被調(diào)用,就會形成閉包,閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。

          閉包作用:

          局部變量無法共享和長久的保存,而全局變量可能造成變量污染,所以我們希望有一種機制既可以長久的保存變量又不會造成全局污染。

          10、Promise是什么?

          Promise 是異步編程的一種解決方案:從語法上講,promise是一個對象,從它可以獲取異步操作的消息;從本意上講,它是承諾,承諾它過一段時間會給你一個結(jié)果。promise有三種狀態(tài): pending(等待態(tài)),fulfiled(成功態(tài)),rejected(失敗態(tài)) ;狀態(tài)一旦改變,就不會再變。創(chuàng)造promise實例后,它會立即執(zhí)行。


          11、Set 和 Map有什么區(qū)別?

          12、map和foreach有什么區(qū)別

          foreach()方法會針對每一個元素執(zhí)行提供得函數(shù),該方法沒有返回值,是否會改變原數(shù)組取決與數(shù)組元素的類型是基本類型還是引用類型

          map()方法不會改變原數(shù)組的值,返回一個新數(shù)組,新數(shù)組中的值為原數(shù)組調(diào)用函數(shù)處理之后的值

          13、localStorage sessionStorage cookies 有什么區(qū)別?

          localStorage:以鍵值對的方式存儲 儲存時間沒有限制 永久生效 除非自己刪除記錄

          sessionStorage:當(dāng)頁面關(guān)閉后被清理與其他相比不能同源窗口共享 是會話級別的存儲方式

          cookies數(shù)據(jù)不能超過4k 同時因為每次http請求都會攜帶cookie 所有cookie只適合保存很小的數(shù)據(jù) 如會話標(biāo)識

          14、Vuex有哪些基本屬性?為什么 Vuex 的 mutation 中不能做異步操作?

          有五種,分別是 State、 Getter、Mutation 、Action、 Module

          1. state => 基本數(shù)據(jù)(數(shù)據(jù)源存放地)
          2. getters => 從基本數(shù)據(jù)派生出來的數(shù)據(jù)
          3. mutations => 提交更改數(shù)據(jù)的方法,同步
          4. actions => 像一個裝飾器,包裹mutations,使之可以異步。
          5. modules => 模塊化Vuex
          • Vuex中所有的狀態(tài)更新的唯一途徑都是mutation,異步操作通過 Action 來提交 mutation實現(xiàn),這樣可以方便地跟蹤每一個狀態(tài)的變化,從而能夠?qū)崿F(xiàn)一些工具幫助更好地了解我們的應(yīng)用。
          • 每個mutation執(zhí)行完成后都會對應(yīng)到一個新的狀態(tài)變更,這樣devtools就可以打個快照存下來,然后就可以實現(xiàn) time-travel 了。如果mutation支持異步操作,就沒有辦法知道狀態(tài)是何時更新的,無法很好的進行狀態(tài)的追蹤,給調(diào)試帶來困難。

          15、Loader和Plugin 有什么區(qū)別

          Loader:直譯為"加載器"。Webpack將一切文件視為模塊,但是webpack原生是只能解析js文件,如果想將其他文件也打包的話,就會用到`loader`。 所以Loader的作用是讓webpack擁有了加載和解析非JavaScript文件的能力。

          Plugin:直譯為"插件"。Plugin可以擴展webpack的功能,讓webpack具有更多的靈活性。 在 Webpack 運行的生命周期中會廣播出許多事件,Plugin 可以監(jiān)聽這些事件,在合適的時機通過 Webpack 提供的 API 改變輸出結(jié)果。

          16、在地址欄里輸入一個地址回車會發(fā)生哪些事情

          1. 解析URL:首先會對 URL 進行解析,分析所需要使用的傳輸協(xié)議和請求的資源的路徑。如果輸入的 URL 中的協(xié)議或者主機名不合法,將會把地址欄中輸入的內(nèi)容傳遞給搜索引擎。如果沒有問題,瀏覽器會檢查 URL 中是否出現(xiàn)了非法字符,如果存在非法字符,則對非法字符進行轉(zhuǎn)義后再進行下一過程。
          2. 緩存判斷:瀏覽器會判斷所請求的資源是否在緩存里,如果請求的資源在緩存里并且沒有失效,那么就直接使用,否則向服務(wù)器發(fā)起新的請求。
          3. DNS解析: 下一步首先需要獲取的是輸入的 URL 中的域名的 IP 地址,首先會判斷本地是否有該域名的 IP 地址的緩存,如果有則使用,如果沒有則向本地 DNS 服務(wù)器發(fā)起請求。本地 DNS 服務(wù)器也會先檢查是否存在緩存,如果沒有就會先向根域名服務(wù)器發(fā)起請求,獲得負責(zé)的頂級域名服務(wù)器的地址后,再向頂級域名服務(wù)器請求,然后獲得負責(zé)的權(quán)威域名服務(wù)器的地址后,再向權(quán)威域名服務(wù)器發(fā)起請求,最終獲得域名的 IP 地址后,本地 DNS 服務(wù)器再將這個 IP 地址返回給請求的用戶。用戶向本地 DNS 服務(wù)器發(fā)起請求屬于遞歸請求,本地 DNS 服務(wù)器向各級域名服務(wù)器發(fā)起請求屬于迭代請求。
          4. 獲取MAC地址: 當(dāng)瀏覽器得到 IP 地址后,數(shù)據(jù)傳輸還需要知道目的主機 MAC 地址,因為應(yīng)用層下發(fā)數(shù)據(jù)給傳輸層,TCP 協(xié)議會指定源端口號和目的端口號,然后下發(fā)給網(wǎng)絡(luò)層。網(wǎng)絡(luò)層會將本機地址作為源地址,獲取的 IP 地址作為目的地址。然后將下發(fā)給數(shù)據(jù)鏈路層,數(shù)據(jù)鏈路層的發(fā)送需要加入通信雙方的 MAC 地址,本機的 MAC 地址作為源 MAC 地址,目的 MAC 地址需要分情況處理。通過將 IP 地址與本機的子網(wǎng)掩碼相與,可以判斷是否與請求主機在同一個子網(wǎng)里,如果在同一個子網(wǎng)里,可以使用 APR 協(xié)議獲取到目的主機的 MAC 地址,如果不在一個子網(wǎng)里,那么請求應(yīng)該轉(zhuǎn)發(fā)給網(wǎng)關(guān),由它代為轉(zhuǎn)發(fā),此時同樣可以通過 ARP 協(xié)議來獲取網(wǎng)關(guān)的 MAC 地址,此時目的主機的 MAC 地址應(yīng)該為網(wǎng)關(guān)的地址。
          5. TCP三次握手: 下面是 TCP 建立連接的三次握手的過程,首先客戶端向服務(wù)器發(fā)送一個 SYN 連接請求報文段和一個隨機序號,服務(wù)端接收到請求后向客戶端發(fā)送一個 SYN ACK報文段,確認連接請求,并且也向客戶端發(fā)送一個隨機序號。客戶端接收服務(wù)器的確認應(yīng)答后,進入連接建立的狀態(tài),同時向服務(wù)器也發(fā)送一個ACK 確認報文段,服務(wù)器端接收到確認后,也進入連接建立狀態(tài),此時雙方的連接就建立起來了。
          6. HTTPS握手: 如果使用的是 HTTPS 協(xié)議,在通信前還存在 TLS 的一個四次握手的過程。首先由客戶端向服務(wù)器端發(fā)送使用的協(xié)議的版本號、一個隨機數(shù)和可以使用的加密方法。服務(wù)器端收到后,確認加密的方法,也向客戶端發(fā)送一個隨機數(shù)和自己的數(shù)字證書??蛻舳耸盏胶螅紫葯z查數(shù)字證書是否有效,如果有效,則再生成一個隨機數(shù),并使用證書中的公鑰對隨機數(shù)加密,然后發(fā)送給服務(wù)器端,并且還會提供一個前面所有內(nèi)容的 hash 值供服務(wù)器端檢驗。服務(wù)器端接收后,使用自己的私鑰對數(shù)據(jù)解密,同時向客戶端發(fā)送一個前面所有內(nèi)容的 hash 值供客戶端檢驗。這個時候雙方都有了三個隨機數(shù),按照之前所約定的加密方法,使用這三個隨機數(shù)生成一把秘鑰,以后雙方通信前,就使用這個秘鑰對數(shù)據(jù)進行加密后再傳輸。
          7. 返回數(shù)據(jù): 當(dāng)頁面請求發(fā)送到服務(wù)器端后,服務(wù)器端會返回一個 html 文件作為響應(yīng),瀏覽器接收到響應(yīng)后,開始對 html 文件進行解析,開始頁面的渲染過程。
          8. 頁面渲染: 瀏覽器首先會根據(jù) html 文件構(gòu)建 DOM 樹,根據(jù)解析到的 css 文件構(gòu)建 CSSOM 樹,如果遇到 script 標(biāo)簽,則判端是否含有 defer 或者 async 屬性,要不然 script 的加載和執(zhí)行會造成頁面的渲染的阻塞。當(dāng) DOM 樹和 CSSOM 樹建立好后,根據(jù)它們來構(gòu)建渲染樹。渲染樹構(gòu)建好后,會根據(jù)渲染樹來進行布局。布局完成后,最后使用瀏覽器的 UI 接口對頁面進行繪制。這個時候整個頁面就顯示出來了。
          9. TCP四次揮手: 最后一步是 TCP 斷開連接的四次揮手過程。若客戶端認為數(shù)據(jù)發(fā)送完成,則它需要向服務(wù)端發(fā)送連接釋放請求。服務(wù)端收到連接釋放請求后,會告訴應(yīng)用層要釋放 TCP 鏈接。然后會發(fā)送 ACK 包,并進入 CLOSE_WAIT 狀態(tài),此時表明客戶端到服務(wù)端的連接已經(jīng)釋放,不再接收客戶端發(fā)的數(shù)據(jù)了。但是因為 TCP 連接是雙向的,所以服務(wù)端仍舊可以發(fā)送數(shù)據(jù)給客戶端。服務(wù)端如果此時還有沒發(fā)完的數(shù)據(jù)會繼續(xù)發(fā)送,完畢后會向客戶端發(fā)送連接釋放請求,然后服務(wù)端便進入 LAST-ACK 狀態(tài)??蛻舳耸盏结尫耪埱蠛?,向服務(wù)端發(fā)送確認應(yīng)答,此時客戶端進入 TIME-WAIT 狀態(tài)。該狀態(tài)會持續(xù) 2MSL(最大段生存期,指報文段在網(wǎng)絡(luò)中生存的時間,超時會被拋棄) 時間,若該時間段內(nèi)沒有服務(wù)端的重發(fā)請求的話,就進入 CLOSED 狀態(tài)。當(dāng)服務(wù)端收到確認應(yīng)答后,也便進入 CLOSED 狀態(tài)。

          17、UDP和TCP有什么區(qū)別

          18、項目中常用的性能優(yōu)化方式有哪些?

          太多了,自己整理吧-.-

          19、怎么解決跨域問題的,你是怎么配置的

          20、計算屬性和watch有什么區(qū)別?以及它們的運用場景?

          區(qū)別:

          computed 計算屬性:依賴其它屬性值,并且computed的值有緩存,只有它依賴的屬性值發(fā)生改變,下一次獲取computed的值時才會重新計算computed的值。

          watch 偵聽器:更多的是觀察的作用,無緩存性,類似與某些數(shù)據(jù)的監(jiān)聽回調(diào),每當(dāng)監(jiān)聽的數(shù)據(jù)變化時都會執(zhí)行回調(diào)進行后續(xù)操作

          運用場景:

          當(dāng)需要進行數(shù)值計算,并且依賴與其它數(shù)據(jù)時,應(yīng)該使用computed,因為可以利用computed的緩存屬性,避免每次獲取值時都要重新計算。

          當(dāng)需要在數(shù)據(jù)變化時執(zhí)行異步或開銷較大的操作時,應(yīng)該使用watch,使用watch選項允許執(zhí)行異步操作(訪問一個API),限制執(zhí)行該操作的頻率,并在得到最終結(jié)果前,設(shè)置中間狀態(tài)。這些都是計算屬性無法做到的。

          21、Vue的生命周期是什么 每個鉤子里面具體做了什么事情

          Vue 實例有?個完整的?命周期,也就是從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模版、掛載Dom -> 渲染、更新 -> 渲染、卸載等?系列過程,稱這是Vue的?命周期。

          1. beforeCreate(創(chuàng)建前) :數(shù)據(jù)觀測和初始化事件還未開始,此時 data 的響應(yīng)式追蹤、event/watcher 都還沒有被設(shè)置,也就是說不能訪問到data、computed、watch、methods上的方法和數(shù)據(jù)。
          2. created(創(chuàng)建后) :實例創(chuàng)建完成,實例上配置的 options 包括 data、computed、watch、methods 等都配置完成,但是此時渲染得節(jié)點還未掛載到 DOM,所以不能訪問到 `$el` 屬性。
          3. beforeMount(掛載前) :在掛載開始之前被調(diào)用,相關(guān)的render函數(shù)首次被調(diào)用。實例已完成以下的配置:編譯模板,把data里面的數(shù)據(jù)和模板生成html。此時還沒有掛載html到頁面上。
          4. mounted(掛載后) :在el被新創(chuàng)建的 vm.$el 替換,并掛載到實例上去之后調(diào)用。實例已完成以下的配置:用上面編譯好的html內(nèi)容替換el屬性指向的DOM對象。完成模板中的html渲染到html 頁面中。此過程中進行ajax交互。
          5. beforeUpdate(更新前) :響應(yīng)式數(shù)據(jù)更新時調(diào)用,此時雖然響應(yīng)式數(shù)據(jù)更新了,但是對應(yīng)的真實 DOM 還沒有被渲染。
          6. updated(更新后):在由于數(shù)據(jù)更改導(dǎo)致的虛擬DOM重新渲染和打補丁之后調(diào)用。此時 DOM 已經(jīng)根據(jù)響應(yīng)式數(shù)據(jù)的變化更新了。調(diào)用時,組件 DOM已經(jīng)更新,所以可以執(zhí)行依賴于DOM的操作。然而在大多數(shù)情況下,應(yīng)該避免在此期間更改狀態(tài),因為這可能會導(dǎo)致更新無限循環(huán)。該鉤子在服務(wù)器端渲染期間不被調(diào)用。
          7. beforeDestroy(銷毀前) :實例銷毀之前調(diào)用。這一步,實例仍然完全可用,`this` 仍能獲取到實例。
          8. destroyed(銷毀后) :實例銷毀后調(diào)用,調(diào)用后,Vue 實例指示的所有東西都會解綁定,所有的事件監(jiān)聽器會被移除,所有的子實例也會被銷毀。該鉤子在服務(wù)端渲染期間不被調(diào)用。 另外還有 `keep-alive` 獨有的生命周期,分別為 `activated` 和 `deactivated` 。用 `keep-alive` 包裹的組件在切換時不會進行銷毀,而是緩存到內(nèi)存中并執(zhí)行 `deactivated` 鉤子函數(shù),命中緩存渲染后會執(zhí)行 `activated` 鉤子函數(shù)。

          22、組件之間的傳值有幾種方式

          23、Eventbus具體是怎么實現(xiàn)的

          24、父組件到子組件更新的方式是什么樣的

          25、$nexttick 是干嘛的,你一般拿它做什么

          26、Keepalive 是什么,里面有哪些鉤子

          27、插槽是什么 怎么使用的

          28、Es6常見的語法你知道哪一些

          29、自定義指令你是怎么用的

          30、重繪和重排

          31、常見的水平垂直方式有幾種?

          //利用絕對定位,先將元素的左上角通過 top:50%和 left:50%定位到頁面的中心,然后再通過 translate 來調(diào)整元素的中心點到頁面的中心。該方法需要考慮瀏覽器兼容問題。


          //利用絕對定位,設(shè)置四個方向的值都為 0,并將 margin 設(shè)置為 auto,由于寬高固定,因此對應(yīng)方向?qū)崿F(xiàn)平分,可以實現(xiàn)水平和垂直方向上的居中。該方法適用于盒子有寬高的情況:

          //利用絕對定位,先將元素的左上角通過 top:50%和 left:50%定位到頁面的中心,然后再通過 margin 負值來調(diào)整元素的中心點到頁面的中心。該方法適用于盒子寬高已知的情況


          //使用 flex 布局,通過 align-items:center 和 justify-content:center 設(shè)置容器的垂直和水平方向上為居中對齊,然后它的子元素也可以實現(xiàn)垂直和水平的居中。該方法要**考慮兼容的問題**,該方法在移動端用的較多:


          //另外,如果父元素設(shè)置了flex布局,只需要給子元素加上`margin:auto;`就可以實現(xiàn)垂直居中布局

          32、標(biāo)準盒模型和怪異盒模型

          33、Flex常見的屬性 flex:1代表什么

          34、Rem你是怎么做適配的

          35、媒體查詢是什么

          36、首屏性能優(yōu)化你是怎么做的

          37、怎么解決白屏問題

          38、瀏覽器的性能監(jiān)控你是怎么做的

          戳右邊鏈接https://blog.csdn.net/qq_29438877/article/details/103998284

          39、Diff算法是什么 :key = index 為什么不常用數(shù)組的下標(biāo)作為index 加了它有什么好處

          40、虛擬列表你是怎么實現(xiàn)的

          41、說一下防抖和節(jié)流

          42、哪些情況會導(dǎo)致內(nèi)存泄漏

          1. 意外的全局變量:由于使用未聲明的變量,而意外的創(chuàng)建了一個全局變量,而使這個變量一直留在內(nèi)存中無法被回收
          2. 被遺忘的計時器或回調(diào)函數(shù):設(shè)置了 setInterval 定時器,而忘記取消它,如果循環(huán)函數(shù)有對外部變量的引用的話,那么這個變量會被一直留在內(nèi)存中,而無法被回收。
          3. 脫離 DOM 的引用:獲取一個 DOM 元素的引用,而后面這個元素被刪除,由于一直保留了對這個元素的引用,所以它也無法被回收。
          4. 閉包:不合理的使用閉包,從而導(dǎo)致某些變量一直被留在內(nèi)存當(dāng)中。

          43、Vue的父子組件生命周期鉤子函數(shù)執(zhí)行順序?

          44、說一下常見的檢測數(shù)據(jù)類型的幾種方式?

          • typeof 其中數(shù)組、對象、null都會被判斷為Object,其他判斷都正確
          • instanceof 只能判斷引用數(shù)據(jù)類型,不能判斷基本數(shù)據(jù)類型 constructor 它有2個作用 一是判斷數(shù)據(jù)的類型,二是對象實例通過
          • constructor對象訪問它的構(gòu)造函數(shù)。需要注意的事情是如果創(chuàng)建一個對象來改變它的原型,constructor就不能來判斷數(shù)據(jù)類型了
          • Object.prototype.toString.call()

          45、說一下data為什么是一個函數(shù)而不是一個對象?

          JavaScript中的對象是引用類型的數(shù)據(jù),當(dāng)多個實例引用同一個對象時,只要一個實例對這個對象進行操作,其他實例中的數(shù)據(jù)也會發(fā)生變化。而在Vue中,我們更多的是想要復(fù)用組件,那就需要每個組件都有自己的數(shù)據(jù),這樣組件之間才不會相互干擾。所以組件的數(shù)據(jù)不能寫成對象的形式,而是要寫成函數(shù)的形式。數(shù)據(jù)以函數(shù)返回值的形式定義,這樣當(dāng)我們每次復(fù)用組件的時候,就會返回一個新的data,也就是說每個組件都有自己的私有數(shù)據(jù)空間,它們各自維護自己的數(shù)據(jù),不會干擾其他組件的正常運行。

          46、說一下slice splice split 的區(qū)別?


          47、說一下怎么把類數(shù)組轉(zhuǎn)換為數(shù)組?

          48、說一下數(shù)組如何去重,你有幾種方法?

          49、說一下怎么取出數(shù)組最多的一項?

          50、說一下JSON.stringify有什么缺點?

          1.如果obj里面有時間對象,則JSON.stringify后再JSON.parse的結(jié)果,時間將只是字符串的形式,而不是對象的形式

          2.如果obj里有RegExp(正則表達式的縮寫)、Error對象,則序列化的結(jié)果將只得到空對象

          3、如果obj里有函數(shù),undefined,則序列化的結(jié)果會把函數(shù)或 undefined丟失

          4、如果obj里有NaN、Infinity和-Infinity,則序列化的結(jié)果會變成null

          5、JSON.stringify()只能序列化對象的可枚舉的自有屬性,例如 如果obj中的對象是有構(gòu)造函數(shù)生成的, 則使用JSON.parse(JSON.stringify(obj))深拷貝后,會丟棄對象的constructor

          6、如果對象中存在循環(huán)引用的情況也無法正確實現(xiàn)深拷貝

          51、說一下for...in 和 for...of的區(qū)別?

          • for...of遍歷獲取的是對象的鍵值, for...in獲取的是對象的鍵名;
          • for...in會遍歷對象的整個原型鏈, 性能非常差不推薦使用,而for...of只遍歷當(dāng)前對象不會遍歷原型鏈;
          • 對于數(shù)組的遍歷,for...in會返回數(shù)組中所有可枚舉的屬性(包括原型鏈上可枚舉的屬性),for...of只返回數(shù)組的下標(biāo)對應(yīng)的屬性值;

          總結(jié):for...in循環(huán)主要是為了遍歷對象而生,不適用遍歷數(shù)組; for....of循環(huán)可以用來遍歷數(shù)組、類數(shù)組對象、字符串、Set、Map以及Generator對象

          52、說一下類組件和函數(shù)組件的區(qū)別?

          1. 語法上的區(qū)別:

          函數(shù)式組件是一個純函數(shù),它是需要接受props參數(shù)并且返回一個React元素就可以了。類組件是需要繼承React.Component的,而且class組件需要創(chuàng)建render并且返回React元素,語法上來講更復(fù)雜。

          2. 調(diào)用方式

          函數(shù)式組件可以直接調(diào)用,返回一個新的React元素;類組件在調(diào)用時是需要創(chuàng)建一個實例的,然后通過調(diào)用實例里的render方法來返回一個React元素。

          3. 狀態(tài)管理

          函數(shù)式組件沒有狀態(tài)管理,類組件有狀態(tài)管理。

          4. 使用場景

          類組件沒有具體的要求。函數(shù)式組件一般是用在大型項目中來分割大組件(函數(shù)式組件不用創(chuàng)建實例,所有更高效),一般情況下能用函數(shù)式組件就不用類組件,提升效率。

          53、說一下react的更新機制

          答案戳這里:zhuanlan.zhihu.com/p/35801438

          54、說一下redux 里面有什么

          55、說一下react和vue框架的區(qū)別

          56、說一下proxy 它有什么優(yōu)點

          57、說一下vue3.0你了解多少?

          58、說一下bfc bfc有什么優(yōu)缺點

          59、說一下你對盒模型的理解?

          60、說一下SPA單頁面有什么優(yōu)缺點?

          61、說一下前端登錄的流程?

          初次登錄的時候,前端調(diào)后調(diào)的登錄接口,發(fā)送用戶名和密碼,后端收到請求,驗證用戶名和密碼,驗證成功,就給前端返回一個token,和一個用戶信息的值,前端拿到token,將token儲存到Vuex中,然后從Vuex中把token的值存入瀏覽器Cookies中。

          把用戶信息存到Vuex然后再存儲到LocalStroage中,然后跳轉(zhuǎn)到下一個頁面,根據(jù)后端接口的要求,只要不登錄就不能訪問的頁面需要在前端每次跳轉(zhuǎn)頁面師判斷Cookies中是否有token,沒有就跳轉(zhuǎn)到登錄頁,有就跳轉(zhuǎn)到相應(yīng)的頁面,我們應(yīng)該再每次發(fā)送post/get請求的時候應(yīng)該加入token,常用方法再項目utils/service.js中添加全局攔截器,將token的值放入請求頭中 后端判斷請求頭中有無token,有token,就拿到token并驗證token是否過期,在這里過期會返回?zé)o效的token然后有個跳回登錄頁面重新登錄并且清除本地用戶的信息

          62、說一下前端權(quán)限管理怎么實現(xiàn)

          答案戳這里https://blog.csdn.net/weixin_40599109/article/details/113728974

          63、說一下購物車的邏輯?

          vue中購物車邏輯的實現(xiàn)

          • 購物車信息用一個數(shù)組來存儲,數(shù)組中保存對象,對象中有id和count屬性
          • 在vuex中state中添加一個數(shù)據(jù) cartList 用來保存這個數(shù)組
          • 由于商品詳情頁需要用到加入購物車功能,所以我們需要提供一個mutation, 用來將購物車信息加入 cartList中
          • 加入購物車信息的時候,遵照如下規(guī)則: 如果購物車中已經(jīng)有了該商品信息,則數(shù)量累加,如果沒有該商品信息,則新增一個對象
          • 在商品詳情頁,點擊加入購物車按鈕的時候,調(diào)用vuex提供的addToCart這個mutation將當(dāng)前的商品信息 (id count)傳給addTocart this.$store.commit("addToCart", {id: , count:})

          js中購物車邏輯的實現(xiàn)

          • 商品頁點擊“加入購物車”按鈕,觸發(fā)事件
          • 事件調(diào)用購物車“增加商品”的Js程序(函數(shù)、對象方法)
          • 向Js程序傳遞傳遞“商品id”、“商品數(shù)量”等數(shù)據(jù)
          • 存儲“商品id”、“商品數(shù)量”到瀏覽器的localStorage中

          **展示購物車中的商品******

          • 打開購物車頁面
          • 從localStorage中取出“商品Id”、“商品數(shù)量”等信息。
          • 調(diào)用服務(wù)器端“獲得商品詳情”的接口得到購物車中的商品信息(參數(shù)為商品Id)
          • 將獲得的商品信息顯示在購物車頁面。

          **完成購物車中商品的購買******

          • 用戶對購物車中的商品完成購買流程,產(chǎn)生購物訂單
          • 清除localStorage中存儲的已經(jīng)購買的商品信息

          備注1:購物車中商品存儲的數(shù)據(jù)除了“商品id”、“商品數(shù)量”之外,根據(jù)產(chǎn)品要求還可以有其他的信息,例如完整的商品詳情(這樣就不用掉服務(wù)器接口獲得詳情了)、購物車商品的過期時間,超過時間的購物車商品在下次打開網(wǎng)站或者購物車頁面時被清除。

          備注2:購物車商品除了存儲在localStorage中,根據(jù)產(chǎn)品的需求不同,也可以存儲在sessionStorage、cookie、session中,或者直接向服務(wù)器接口發(fā)起請求存儲在服務(wù)器上。何種情況使用哪種方式存儲、有啥區(qū)別請自己分析。

          64、說一下HTTP和HTTPS協(xié)議的區(qū)別?

          1. HTTPS協(xié)議需要CA證書,費用較高;而HTTP協(xié)議不需要
          2. HTTP協(xié)議是超文本傳輸協(xié)議,信息是明文傳輸?shù)?HTTPS則是具有安全性的SSL加密傳輸協(xié)議
          3. 使用不同的連接方式,端口也不同,HTTP協(xié)議端口是80,HTTPS協(xié)議端口是443
          4. HTTP協(xié)議連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是具有SSL和HTTP協(xié)議構(gòu)建的可進行加密傳輸、身份認證的網(wǎng)絡(luò)協(xié)議,比HTTP更加安全

          65、說一下常見的HTTP狀態(tài)碼?說一下狀態(tài)碼是302和304是什么意思?你在項目中出現(xiàn)過么?你是怎么解決的?

          <!-- 狀態(tài)碼:由3位數(shù)字組成,第一個數(shù)字定義了響應(yīng)的類別 -->

          <!-- 1xx:指示消息,表示請求已接收,繼續(xù)處理 -->

          <!-- 2xx:成功,表示請求已被成功接收,處理 -->

          <!-- 200 OK:客戶端請求成功

          204 No Content:無內(nèi)容。服務(wù)器成功處理,但未返回內(nèi)容。一般用在只是客戶端向服務(wù)器發(fā)送信息,而服務(wù)器不用向客戶端返回什么信息的情況。不會刷新頁面。

          206 Partial Content:服務(wù)器已經(jīng)完成了部分GET請求(客戶端進行了范圍請求)。響應(yīng)報文中包含Content-Range指定范圍的實體內(nèi)容 -->

          <!-- 3xx 重定向 -->

          <!-- 301 Moved Permanently:永久重定向,表示請求的資源已經(jīng)永久的搬到了其他位置。

          302 Found:臨時重定向,表示請求的資源臨時搬到了其他位置

          303 See Other:臨時重定向,應(yīng)使用GET定向獲取請求資源。303功能與302一樣,區(qū)別只是303明確客戶端應(yīng)該使用GET訪問

          307 Temporary Redirect:臨時重定向,和302有著相同含義。POST不會變成GET

          304 Not Modified:表示客戶端發(fā)送附帶條件的請求(GET方法請求報文中的IF…)時,條件不滿足。返回304時,不包含任何響應(yīng)主體。雖然304被劃分在3XX,但和重定向一毛錢關(guān)系都沒有 -->

          <!-- 4xx:客戶端錯誤 -->

          <!-- 400 Bad Request:客戶端請求有語法錯誤,服務(wù)器無法理解。

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

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

          404 Not Found:請求資源不存在。比如,輸入了錯誤的url

          415 Unsupported media type:不支持的媒體類型 -->

          <!-- 5xx:服務(wù)器端錯誤,服務(wù)器未能實現(xiàn)合法的請求。 -->

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

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

          66、說一下常見的git操作

          我是cv的各位自取吧-。-




          原文鏈接:https://juejin.cn/post/7073869980411887652


          主站蜘蛛池模板: 人妻无码第一区二区三区| 天天爽夜夜爽人人爽一区二区| 久久亚洲中文字幕精品一区| 日韩免费视频一区| 亚洲av无码一区二区三区观看| 亚洲国产一区二区a毛片| 中文字幕精品无码一区二区三区| 中文字幕一区在线| 国精品无码一区二区三区在线蜜臀| 女人和拘做受全程看视频日本综合a一区二区视频 | 熟妇人妻一区二区三区四区| 波多野结衣一区二区免费视频 | 国模精品一区二区三区| 国产成人精品a视频一区| 精品一区二区三区四区在线 | 国产av成人一区二区三区| 久久精品国产一区二区三区| 中文字幕日韩一区二区三区不| 国产美女av在线一区| 亚洲日本一区二区三区在线| 国产在线精品一区二区中文| 无码一区二区三区| 国产韩国精品一区二区三区久久| 精品无码一区二区三区在线 | 性色AV一区二区三区无码| 无码人妻aⅴ一区二区三区| 国产成人一区二区三区高清| 亚洲国产综合无码一区二区二三区| 国产一区二区三区夜色| 台湾无码一区二区| 国产一区二区好的精华液| 精品一区二区三区视频在线观看| 久久se精品一区精品二区国产| 精品久久一区二区三区| 一区二区三区无码被窝影院| 国产激情一区二区三区四区| 中文字幕国产一区| 在线观看亚洲一区二区| 国产伦精品一区二区三区免费迷 | 亚洲熟女一区二区三区| 亚洲AV无码一区二区三区人|