細(xì)版:
1、瀏覽器會(huì)開(kāi)啟一個(gè)線程來(lái)處理這個(gè)請(qǐng)求,對(duì) URL 分析判斷,如果是 http 協(xié)議就按照 Web 方式來(lái)處理;
2、調(diào)用瀏覽器內(nèi)核中的對(duì)應(yīng)方法,比如 WebView 中的 loadUrl 方法;
3、通過(guò)DNS解析獲取網(wǎng)址的IP地址,設(shè)置 UA 等信息發(fā)出第二個(gè)GET請(qǐng)求;
4、進(jìn)行HTTP協(xié)議會(huì)話,客戶端發(fā)送報(bào)頭(請(qǐng)求報(bào)頭);
5、進(jìn)入到web服務(wù)器上的 Web Server,如 Apache、Tomcat、Node.JS 等服務(wù)器;
6、進(jìn)入部署好的后端應(yīng)用,如 PHP、Java、JavaScript、Python 等,找到對(duì)應(yīng)的請(qǐng)求處理;
7、處理結(jié)束回饋報(bào)頭,此處如果瀏覽器訪問(wèn)過(guò),緩存上有對(duì)應(yīng)資源,會(huì)與服務(wù)器最后修改時(shí)間對(duì)比,一致則返回304;
8、瀏覽器開(kāi)始下載html文檔(響應(yīng)報(bào)頭,狀態(tài)碼200),同時(shí)使用緩存;
9、文檔樹(shù)建立,根據(jù)標(biāo)記請(qǐng)求所需指定MIME類(lèi)型的文件(比如css、js),同時(shí)設(shè)置了cookie;
10、頁(yè)面開(kāi)始渲染DOM,JS根據(jù)DOM API操作DOM,執(zhí)行事件綁定等,頁(yè)面顯示完成。
瀏覽器根據(jù)請(qǐng)求的URL交給DNS域名解析,找到真實(shí)IP,向服務(wù)器發(fā)起請(qǐng)求;
服務(wù)器交給后臺(tái)處理完成后返回?cái)?shù)據(jù),瀏覽器接收文件(HTML、JS、CSS、圖象等);
瀏覽器對(duì)加載到的資源(HTML、JS、CSS等)進(jìn)行語(yǔ)法解析,建立相應(yīng)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如HTML的DOM);
載入解析到的資源文件,渲染頁(yè)面,完成。
于安全和隱私的原因,web 應(yīng)用程序不能直接訪問(wèn)用戶設(shè)備上的文件。如果需要讀取一個(gè)或多個(gè)本地文件,可以通過(guò)使用input file和FileReader來(lái)實(shí)現(xiàn)。在這篇文章中,我們將通過(guò)一些例子來(lái)看看它是如何工作的。
由于瀏覽器中的 JS 無(wú)法從用戶的設(shè)備訪問(wèn)本地文件,我們需要為用戶提供一種方法來(lái)選擇一個(gè)或多個(gè)文件供我們使用。這可以通過(guò)文件選擇器<input type='fule' />來(lái)完成。
<input type="file" id="fileInput">
如果想允選擇多個(gè)文件,可以添加multiple屬性:
<input type="file" id="fileInput" multiple>
我們可以通過(guò)change事件來(lái)監(jiān)聽(tīng)文件的選擇,也可以添加另一個(gè) UI 元素讓用戶顯式地開(kāi)始對(duì)所選文件的處理。
input file 具有一個(gè)files屬性,該屬性是File對(duì)象的列表(可能有多個(gè)選擇的文件)。
File對(duì)象如下所示:
讀取文件,主要使用的是[FileReader][1]類(lèi)。
「該對(duì)象擁有的屬性:」
「FileReader.error」 :只讀,一個(gè)DOMException,表示在讀取文件時(shí)發(fā)生的錯(cuò)誤 。
「FileReader.readyState」:只讀 表示 FileReader 狀態(tài)的數(shù)字。取值如下:
常量名值描述EMPTY0還沒(méi)有加載任何數(shù)據(jù)LOADING1數(shù)據(jù)正在被加載DONE2已完成全部的讀取請(qǐng)求
「FileReader.result」:只讀,文件的內(nèi)容。該屬性?xún)H在讀取操作完成后才有效,數(shù)據(jù)的格式取決于使用哪個(gè)方法來(lái)啟動(dòng)讀取操作。
「該對(duì)象擁有的方法:」
readAsText(file, encoding):以純文本形式讀取文件,讀取到的文本保存在result屬性中。第二個(gè)參數(shù)代表編碼格式。
readAsDataUrl(file):讀取文件并且將文件以數(shù)據(jù)URI的形式保存在result屬性中。
readAsBinaryString(file):讀取文件并且把文件以字符串保存在result屬性中。
readAsArrayBuffer(file):讀取文件并且將一個(gè)包含文件內(nèi)容的ArrayBuffer保存咋result屬性中。
FileReader.abort():中止讀取操作。在返回時(shí),readyState屬性為DONE。
「文件讀取的過(guò)程是異步操作,在這個(gè)過(guò)程中提供了三個(gè)事件:progress、error、load事件?!?/strong>
progress:每隔50ms左右,會(huì)觸發(fā)一次progress事件。
error:在無(wú)法讀取到文件信息的條件下觸發(fā)。
load:在成功加載后就會(huì)觸發(fā)。
在下面的示例中,我們將使用readAsText和readAsDataURL方法來(lái)顯示文本和圖像文件的內(nèi)容。
為了將文件內(nèi)容顯示為文本,change需要重寫(xiě)一下:
首先,我們要確保有一個(gè)可以讀取的文件。如果用戶取消或以其他方式關(guān)閉文件選擇對(duì)話框而不選擇文件,我們就沒(méi)有什么要讀取和退出函數(shù)。
然后我們繼續(xù)創(chuàng)建一個(gè)FileReader。reader的工作是異步的,以避免阻塞主線程和 UI 更新,這在讀取大文件(如視頻)時(shí)非常重要。
reader發(fā)出一個(gè)'load'事件(例如,類(lèi)似于Image對(duì)象),告訴我們的文件已經(jīng)讀取完畢。
reader將文件內(nèi)容保存在其result屬性中。此屬性中的數(shù)據(jù)取決于我們使用的讀取文件的方法。在我們的示例中,我們使用readAsText方法讀取文件,因此result將是一個(gè)文本字符串。
如果我們想要顯示圖像,將文件讀取為字符串并不是很有用。FileReader有一個(gè)readAsDataURL方法,可以將文件讀入一個(gè)編碼的字符串,該字符串可以用作<img>元素的源。本例的代碼與前面的代碼基本相同,區(qū)別是我們使用readAsDataURL讀取文件并將結(jié)果顯示為圖像:
1)由于安全和隱私的原因,JavaScript 不能直接訪問(wèn)本地文件。
2)可以通過(guò) input 類(lèi)型為 file 來(lái)選擇文件,并對(duì)文件進(jìn)行處理。
3) file input 具有帶有所選文件的files屬性。
4) 我們可以使用FileReader來(lái)訪問(wèn)所選文件的內(nèi)容。
作者: Martin Splitt 譯者:前端小智 來(lái)源:dev
原文:https://dev.to/g33konaut/reading-local-files-with-javascript-25hn
先要安裝css的loader
npm install css-loader style-loader --save-dev
然后在webpack.config.js中配置如下代碼
意思是先用css-loader加載css文件,再用style-loader添加在頁(yè)面中
在app目錄下創(chuàng)建component.css文件
body{ background-color: red; }
在app/index.js中引入css文件
運(yùn)行npm run start命令。
可以看到我們?yōu)g覽器整個(gè)背景都變成了紅色。
webpack做了什么呢?
看到build/app.js中有如下代碼。
再看下我們生產(chǎn)的index.html文件
奇怪了,并沒(méi)有內(nèi)斂樣式也沒(méi)有引入的css文件,那瀏覽器是為什么變紅的呢?
我們?cè)跒g覽器中打開(kāi)調(diào)試工具。
原來(lái)樣式在這!
webpack動(dòng)態(tài)的添加了內(nèi)斂樣式在代碼中。
如果多人協(xié)作開(kāi)發(fā)的情況下,會(huì)有很大可能出現(xiàn)代碼命名重復(fù)的情況,如果出現(xiàn)這種情況怎么辦呢?
來(lái)讓我們?cè)囼?yàn)一下。
在app目錄下添加兩個(gè)css文件,style1.css
body{ background-color: red; }.class1{ color: green; }
和style2.css
body{ background-color: black; }.class1{ color: blue; }
在index.js中引入這兩個(gè)文件
修改component.js文件,使其給元素添加傳入的類(lèi)名
在webpack.config.js中添加如下配置
我們執(zhí)行npm run start 命令若看到
即為打包成功。
打開(kāi)瀏覽器http://localhost:8080/
可以看到同樣的類(lèi)名都正常顯示出來(lái)了,看下右邊的文檔結(jié)構(gòu),發(fā)現(xiàn)我們的類(lèi)名不是class1了。
原來(lái)CSS Modules對(duì)我們的類(lèi)名做了哈希處理,我們?cè)僖膊挥脫?dān)心同事跟我們有相同的命名了。
是不是很方便呢?
讓我們?cè)賮?lái)面對(duì)另一個(gè)問(wèn)題,現(xiàn)在這種情況下css是js動(dòng)態(tài)添加上去的,如果當(dāng)js文件有一個(gè)長(zhǎng)時(shí)間的阻塞事件,頁(yè)面將會(huì)處于長(zhǎng)時(shí)間的無(wú)樣式的狀態(tài)。
這是我們不希望看到的,怎么把css文件和js文件分離呢?
首先我們需要安裝一個(gè)插件
npm install extract-text-webpack-plugin --save-dev
安裝成功之后在webpack.config.js中添加如下配置
完成之后運(yùn)行一下npm run start
打開(kāi)瀏覽器http://localhost:8080/
可以看到我們兩個(gè)css文件合并為一個(gè)app.css文件并以外部樣式表的形式加載。
而且css文件比js文件要先請(qǐng)求,這樣就避免頁(yè)面會(huì)出現(xiàn)FOUC-Flas Of Unstyle Content無(wú)樣式內(nèi)容閃爍。
webpack關(guān)于css的加載就講到這里。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。