A. Web前端工程師如何處理Web前端的異常_
今天小編要跟大家分享的文章是關於Web前端工程師如何處理前端的異常。前端一直是距離用戶最近的一層,隨著產品的日益完善,我們會更加註重用戶體驗,而前端異常卻如鯁在喉,甚是煩人。下面我們就來看一看前端工程師該如何處理前端異常。一、為什麼要處理異常異常是不可控的,會影響最終的呈現結果,但是我們有充分的理由去做這樣的事情。
1.增強用戶體驗;
2.遠程定位問題;
3.未雨綢繆,及早發現問題;
4.無法復線問題,尤其是移動端,機型,系統都是問題;
5.完善的前端方案,前端監控系統;
對於JS而言,我們面對的僅僅只是異常,異常的出現不會直接導致JS引擎崩潰,最多隻會使當前執行的任務終止。二、需要處理哪些異常?對於前端來說,我們可做的異常捕獲還真不少。總結一下,大概如下:
·___S語法錯誤、代碼異常
·___JAX請求異常
·___蔡試醇釉匾斐
·___romise異常
·___frame異常
·___纈_cripterror
·___覽:塗ǘ
下面我會針對每種具體情況來說明如何處理這些異常。三、Try-Catch的誤區try-catch只能捕獲到同步的運行時錯誤,對語法和非同步錯誤卻無能為力,捕獲不到。
1.同步運行時錯誤:
try{
letname='jartto'
console.log(nam);
}catch(e){
console.log('捕獲到異常:',e);
}
輸出:
捕獲到異常:ReferenceError:namisnotdefined
at:3:15
2.不能捕獲到語法錯誤,我們修改一下代碼,刪掉一個單引號:
try{
letname='jartto;
console.log(nam);
}catch(e){
console.log('捕獲到異常:',e);
}
輸出:
UncaughtSyntaxError:Invalidorunexpectedtoken
不過語法錯誤在我們開發階段就可以看到,應該不會順利上到線上環境。
3.非同步錯誤
try{
setTimeout(()=>{
undefined.map(v=>v);
},1000)
}catch(e){
console.log('捕獲到異常:',e);
}
我們看看日誌:
UncaughtTypeError:Cannotreadproperty'map'of
undefined
atsetTimeout(:3:11)
並沒有捕獲到異常,這是需要我們特別注意的地方。四、window.onerror不是萬能的當JS運行時錯誤發生時,window會觸發一個ErrorEvent介面的error事件,並執行window.onerror()。/**
*@param{String}message錯誤信息
*@param{String}source出錯文件
*@param{Number}lineno行號
*@param{Number}colno列號
*@param{Object}errorError對象(對象)
*/
window.onerror=function(message,source,lineno,colno,error){
console.log('捕獲到異常:',{message,source,lineno,colno,error});
}
1.首先試試同步運行時錯誤
window.onerror=function(message,source,lineno,colno,
error){
//message:錯誤信息(字元串)。
//source:發生錯誤的腳本URL(字元串)
//lineno:發生錯誤的行號(數字)
//colno:發生錯誤的列號(數字)
//error:Error對象(對象)
console.log('捕獲到異常:',{message,source,lineno,colno,
error});
}
Jartto;
可以看到,我們捕獲到了異常:
2.再試試語法錯誤呢?
window.onerror=function(message,source,lineno,colno,
error){
console.log('捕獲到異常:',{message,source,lineno,colno,error});
}
letname='Jartto
控制台列印出了這樣的異常:
UncaughtSyntaxError:Invalidorunexpectedtoken
什麼,竟然沒有捕獲到語法錯誤?
3.懷著忐忑的心,我們最後來試試非同步運行時錯誤:
window.onerror=function(message,source,lineno,colno,
error){
console.log('捕獲到異常:',{message,source,lineno,colno,error});
}
setTimeout(()=>{
Jartto;
});
控制台輸出了:
捕獲到異常:{message:"Uncaught
ReferenceError:Jarttoisnotdefined",source:
"http://127.0.0.1:8001/",lineno:36,colno:5,error:
ReferenceError:Jarttoisnotdefined
atsetTimeout(http://127.0.0.1:8001/:36:5)}
4.接著,我們試試網路請求異常的情況:
我們發現,不論是靜態資源異常,或者介面異常,錯誤都無法捕獲到。
補充一點:window.onerror函數只有在返回true的時候,異常才不會向上拋出,否則即使是知道異常的發生控制台還是會顯示UncaughtError:xxxxx
window.onerror=function(message,source,lineno,colno,
error){
console.log('捕獲到異常:',{message,source,lineno,colno,error});
returntrue;
}
setTimeout(()=>{
Jartto;
});
控制台就不會再有這樣的錯誤了:
UncaughtReferenceError:Jarttoisnotdefined
atsetTimeout((index):36)
需要注意:onerror最好寫在所有JS腳本的前面,否則有可能捕獲不到錯誤;onerror無法捕獲語法錯誤;
到這里基本就清晰了:在實際的使用過程中,onerror主要是來捕獲預料之外的錯誤,而try-catch則是用來在可預見情況下監控特定的錯誤,兩者結合使用更加高效。
問題又來了,捕獲不到靜態資源載入異常怎麼辦?五、window.addEventListener當一項資源(如圖片或腳本)載入失敗,載入資源的元素會觸發一個Event介面的error事件,並執行該元素上的onerror()處理函數。這些error事件不會向上冒泡到window,不過(至少在Firefox中)能被單一的window.addEventListener捕獲。
window.addEventListener('error',(error)=>{
console.log('捕獲到異常:',error);
},true)
控制台輸出:
SHAPE*MERGEFORMAT
由於網路請求異常不會事件冒泡,因此必須在捕獲階段將其捕捉到才行,但是這種方式雖然可以捕捉到網路請求的異常,但是無法判斷HTTP的狀態是404還是其他比如500等等,所以還需要配合服務端日誌才進行排查分析才可以。
需要注意:
·___煌榔饗路禱氐_rror對象可能不同,需要注意兼容處理。
·___枰⒁獗苊_ddEventListener重復監聽。六、PromiseCatch在promise中使用catch可以非常方便的捕獲到非同步error,這個很簡單。
沒有寫catch的Promise中拋出的錯誤無法被onerror或try-catch捕獲到,所以我們務必要在Promise中不要忘記寫catch處理拋出的異常。
解決方案:為了防止有漏掉的Promise異常,建議在全局增加一個對unhandledrejection的監聽,用來全局監聽UncaughtPromiseError。使用方式:
window.addEventListener("unhandledrejection",
function(e){
console.log(e);
});
我們繼續來嘗試一下:
window.addEventListener("unhandledrejection",
function(e){
e.preventDefault()
console.log('捕獲到異常:',e);
returntrue;
});
Promise.reject('promiseerror');
可以看到如下輸出:
那如果對Promise不進行catch呢?
window.addEventListener("unhandledrejection",
function(e){
e.preventDefault()
console.log('捕獲到異常:',e);
returntrue;
});
ewPromise((resolve,reject)=>{
reject('jartto:promiseerror');
});
嗯,事實證明,也是會被正常捕獲到的。
所以,正如我們上面所說,為了防止有漏掉的Promise異常,建議在全局增加一個對unhandledrejection的監聽,用來全局監聽UncaughtPromiseError。
補充一點:如果去掉控制台的異常顯示,需要加上:
event.preventDefault();七、VUEerrorHandlerVue.config.errorHandler=(err,vm,info)=>{
console.error('通過vue
errorHandler捕獲的錯誤');
console.error(err);
console.error(vm);
console.error(info);
}八、React異常捕獲React16提供了一個內置函數componentDidCatch,使用它可以非常簡單的獲取到react下的錯誤信息
componentDidCatch(error,info){
console.log(error,info);
}
除此之外,我們可以了解一下:errorboundaryUI的某部分引起的JS錯誤不應該破壞整個程序,為了幫React的使用者解決這個問題,React16介紹了一種關於錯誤邊界(errorboundary)的新觀念。
需要注意的是:errorboundaries並不會捕捉下面這些錯誤。
1.事件處理器2.非同步代碼3.服務端的渲染代碼4.在errorboundaries區域內的錯誤
我們來舉一個小例子,在下面這個componentDIdCatch(error,info)里的類會變成一個errorboundary:
.Component{
constructor(props){
super(props);
this.state={hasError:false};
}
componentDidCatch(error,info){
//DisplayfallbackUI
this.setState({hasError:true});
//
logErrorToMyService(error,info);
}
render(){
if(this.state.hasError){
//
returnSomethingwentwrong.
;
}
returnthis.props.children;
}
}
然後我們像使用普通組件那樣使用它:
componentDidCatch()方法像JS的catch{}模塊一樣工作,但是對於組件,只有class類型的組件(classcomponent)可以成為一個errorboundaries。
實際上,大多數情況下我們可以在整個程序中定義一個errorboundary組件,之後就可以一直使用它了!九、iframe異常對於iframe的異常捕獲,我們還得借力window.onerror:
window.onerror=function(message,source,lineno,colno,
error){
console.log('捕獲到異常:',{message,source,lineno,colno,error});
}
一個簡單的例子可能如下:
frameborder="0">
十、Scripterror一般情況,如果出現Scripterror這樣的錯誤,基本上可以確定是出現了跨域問題。這時候,是不會有其他太多輔助信息的,但是解決思路無非如下:
跨源資源共享機制(CORS):我們為script標簽添加crossOrigin屬性。
或者動態去添加js腳本:
constscript=document.createElement('script');
script.crossOrigin='anonymous'
script.src=url;
document.body.appendChild(script);
特別注意,伺服器端需要設置:Access-Control-Allow-Origin
此外,我們也可以試試這個-解決ScriptError的另類思路:
constoriginAddEventListener=EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener=function(type,listener,options){
constwrappedListener=function(...args){
try{
returnlistener.apply(this,args);
}
catch(err){
throwerr;
}
}
returnoriginAddEventListener.call(this,type,wrappedListener,options);
}
簡單解釋一下:
·___男戳_ventTarget的addEventListener方法;
·___源氳_istener進行包裝,返回包裝過的listener,對其執行進行try-catch;
·___榔韃換岫_ry-catch起來的異常進行跨域攔截,所以catch到的時候,是有堆棧信息的;
·___匭_hrow出來異常的時候,執行的是同域代碼,所以window.onerror捕獲的時候不會丟失堆棧信息;
利用包裝addEventListener,我們還可以達到「擴展堆棧」的效果:
(()=>{
constoriginAddEventListener=EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener=function(type,listener,options){
+//捕獲添加事件時的堆棧
+constaddStack=newError(`Event(${type})`).stack;
constwrappedListener=function(...args){
try{
returnlistener.apply(this,args);
}
catch(err){
+//異常發生時,擴展堆棧
+err.stack+='
'+addStack;
throwerr;
}
}
returnoriginAddEventListener.call(this,type,wrappedListener,options);
}
})();十一、崩潰和卡頓卡頓也就是網頁暫時響應比較慢,JS可能無法及時執行。但崩潰就不一樣了,網頁都崩潰了,JS都不運行了,還有什麼辦法可以監控網頁的崩潰,並將網頁崩潰上報呢?
崩潰和卡頓也是不可忽視的,也許會導致你的用戶流失。
1.利用window對象的load和beforeunload事件實現了網頁崩潰的監控。不錯的文章,推薦閱讀:Logging
InformationonBrowserCrashes。window.addEventListener('load',function(){
sessionSt
B. 如何處理前端頁面首次載入慢的問題
這是一個ajax請求,幾秒鍾的延遲時間屬於正常范圍,它是非同步運行的,對頁面的載入速度不會造成直接影響。從圖片中可看出,它的載入時間為138ms,不算長啊,後面的4.84s是它等待伺服器返回數據的時間,在這段時間里,頁面的其他元素是繼續載入的,不會受影響。所以這個4.84s是不算在首頁載入時間內的。就好比一個體育賽事直播的網頁,它的比分一般都是通過ajax非同步方式定時刷新的,而這個刷新的時間並不算在頁面的載入時間內,因為這時候頁面早就載入完畢了。
當然,這個4.84s的時間長短,是由多種因素造成的,比如電腦性能、網路狀態等,但最大的影響因素通常都是後台資料庫的查詢速度,通過優化可以大大縮短這個查詢時間。
C. list列表界面滑動有卡頓現象怎麼優化
主要由以下幾種原因造成。
一、手機配置過低
盡管,如今的智能手機配置越來越高,但也有不少入門低配置機型,入門手機由於本身性能不佳,後期安裝的應用一多,內存或者CPU就會出現不夠用情況,因此很容易出現手機越來越慢。
二、安裝的應用過多,內存佔用嚴重
如今很多應用軟體在手機中安裝後,都會在後台運行,每個應用安裝後,都會佔用系統內存,安裝的應用越來越多,佔用的內存就越來越大,就會開始出現卡頓了。
三、手機垃圾和緩存文件過多
手機使用久了會產生各種緩存文件,它們佔用手機內存以及存儲空間,另外應用軟體、游戲的安裝包、升級包,也會產生各種緩存文件,如果長時間沒有清理,它們佔用的體積容量越來越大。
四、其他原因
安卓手機應用商店,五花八門、手機病毒、惡意插件泛濫,如果手機中運行了一些惡意循環的病毒、插件,那麼就容易讓手機進行死循環運行,可以用騰訊手機管家查殺病毒或惡意插件。
D. web前端編程開發都需要注意哪些問題
隨著互聯網的不斷發展,越來越多的程序員都從後台開發轉型到前端開發設計領域。今天,我們就一起來了解一下,在使用web編程開發語言進行前端開發的時候都有哪些問題是需要注意的。
1.路由變化頁面數據不刷新問題
出現這種情況是因為依賴路由的params參數獲取寫在created生命周期裡面,因為相同路由二次甚至多次載入的關系沒有達到,退出頁面再進入另一個文章頁面並不會運行created組件生命周期,導致文章數據還是一次進入的數據。
解決方法:watch路由是否變化。
2.setInterval路由跳轉繼續運行並沒有及時進行銷毀
比如一些彈幕,走馬燈文字,這類需要定時調用的,路由跳轉之後,因為組件已經銷毀了,但是setInterval還沒有銷毀,還在繼續後台調用,控制台會不斷報錯,如果運算量大的話,無法及時清除,會導致嚴重的頁面卡頓。
解決辦法:在組件生命周期beforeDestroy停止setInterval
//組件銷毀前執行的鉤子函數,跟其他生命周期鉤子函數的用法相同。
beforeDestroy(){
//我通常是把setInterval()定時器賦值給this實例,然後就可以像下面這么停止。
clearInterval(this.intervalId);
},
3.vue滾動行為用法,進入路由需要滾動到瀏覽器底部、頭部等等
使用前端路由,當切換到新路由時,想要頁面滾到頂部,或者是保持原先的滾動位置,就像重新載入頁面那樣。vue-router能做到,而且更好,它讓你可以自定義路由切換時頁面如何滾動。
注意:這個功能只在支持history.pushState的瀏覽器中可用。
4.v-once只渲染元素和組件一次,優化更新渲染性能
v-once這個指令相信大家用的很少,不過個人感覺還是挺實用的!
只渲染元素和組件一次。昆明北大青鳥http://www.kmbdqn.cn/建議隨後的重新渲染,元素/組件及其所有的子節點將被視為靜態內容並跳過。這可以用於優化更新性能。
E. 給前端傳了1萬條數據,前端怎麼處理才不至於頁面卡頓
前端只有「玩命」處理才能不卡頓……
這個負擔是由後端造成的,什麼要前端去承擔呢?用戶不可能一次瀏覽一萬條數據,那麼就完全應該分頁處理。每次只返回幾十條數據,大家是不是都輕鬆了?
F. Web前端學習新手的常見疑問匯總
今天小編要跟大家分享的文章是關於Web前端學習新手的常見疑問匯總。正在學習web前端工作的小夥伴們來和小編一起看一看吧,希望本篇文章能夠對小夥伴們有所幫助。
1、Vue.js是什麼?
漸進式框架
自底向上增量開發的設計
易學習
易整合
Vue.js(讀音/vju_/,類似於view)是一套構建用戶界面的漸進式框架。與其他重量級框架不同的是,Vue
採用自底向上增量開發的設計。Vue的核心庫只關注視圖層,並且非常容易學習,非常容易與其它庫或已有項目整合。另一方面,Vue完全有能力驅動採用單文件組件和
Vue生態系統支持的庫開發的復雜單頁應用。
2、vue.js到底適合做哪種類型的界面?
a、表單項繁多
b、內容需要根據用戶的操作進行修改
Vue.js就是一個用於搭建類似於網頁版知乎這種表單項繁多,且內容需要根據用戶的操作進行修改的網頁版應用。
3、單頁應用程序(SPA)是什麼?
一個頁面就是應用(子應用)
顧名思義,單頁應用一般指的就是一個頁面就是應用,當然也可以是一個子應用,比如說知乎的一個頁面就可以視為一個子應用。單頁應用程序中一般交互處理非常多,而且頁面中的內容需要根據用戶的操作動態變化。
4、前面說的網頁版知乎我也可以用JQuery寫啊,為什麼要用Vue.js呢?
a、產品是絕對需要反復修改的
b、修改可能會導致DOM的關聯與嵌套層次要發生改變從而使jquery結構相關代碼變的異常復雜
c、vue.js可以解決這個問題
你是否還記得你當初寫JQuery的時候,有寫過('#xxx').parent().parent().parent()這種代碼呢?當你第一次寫的時候,你覺得頁面元素不多,不就是找這個元素的爸爸的爸爸的爸爸嗎,我大不了在注釋裡面寫清楚這個元素的爸爸的爸爸的爸爸不就好了。但是萬一過幾天之後你的項目組長或者你的產品經理突然對你做的網頁提出修改要求,這個修改要求將會影響頁面的結構,也就是DOM的關聯與嵌套層次要發生改變,那麼(『#xxx』).parent().parent().parent()可能就會變成$(『#xxx』).parent().parent().parent().parent().parent()了。
這還不算什麼,等以後產品迭代越來越快,修改越來越多,而且頁面中類似的關聯和嵌套DOM元素不止一個,那麼修改起來將非常費勁。而且JQuery選擇器查找頁面元素以及DOM操作本身也是有性能損失的,可能到時候打開這個頁面,會變得越來越卡,而你卻無從下手。
這個時候如果你學過Vue.js,那麼這些抱怨將不復存在。
5、前端裡面常說的視圖層是什麼?
我們把HTML中的DOM就可以與其他的部分獨立開來劃分出一個層次,這個層次就叫做視圖層。
Vue的核心庫只關注視圖層
6、使用jquery開發完整頁面的流程?
a、html寫構架
b、css裝飾
c、js交互
講到JQuery,就不得不說到JavaScript的DOM操作了。如果你用JQuery來開發一個知乎,那麼你就需要用JQuery中的各種DOM操作方法去操作HTML的DOM結構了。
現在我們把一個網頁應用抽象一下,那麼HTML中的DOM其實就是視圖,一個網頁就是通過DOM的組合與嵌套,形成了最基本的視圖結構,再通過CSS的修飾,在基本的視圖結構上「化妝」讓他們看起來更加美觀。最後涉及到交互部分,就需要用到JavaScript來接受用戶的交互請求,並且通過事件機制來響應用戶的交互操作,並且在事件的處理函數中進行各種數據的修改,比如說修改某個DOM中的innerHTML或者innerText部分。
7、Vue.js為什麼能讓基於網頁的前端應用程序開發起來這么方便?
a、有聲明式
b、響應式的數據綁定
c、組件化的開發
d、VirtualDOM
因為Vue.js有聲明式,響應式的數據綁定,與組件化的開發,並且還使用了VirtualDOM這個看名字就覺得高大上的技術。
8、vue.js中常說的數據動態綁定是什麼?
就是vue.js會自動響應數據的變化情況,並且根據用戶在代碼中預先寫好的綁定關系,對所有綁定在一起的數據和視圖內容都進行修改。而這種綁定關系,在圖上是以input
標簽的v-model屬性來聲明的,因此你在別的地方可能也會看到有人粗略的稱vue.js為聲明式渲染的模版引擎。
9、前端中為什麼要組件化開發?
a、非組件化開發代碼和工作量都非常大
b、修改起來生不如死
但是現在我們做單頁應用,頁面交互和結構十分復雜,一個頁面上就有許許多多的模塊需要編寫,而且往往一個模塊的代碼量和工作量就非常龐大,如果還按照原先的方法來開發,那麼會累死人。而且遇到以後的產品需求變更,修改起來也非常麻煩,生怕動了其中一個div之後,其他div跟著雪崩,整個頁面全部亂套,或者由於JavaScript的事件冒泡機制,導致修改一些內層的DOM事件處理函數之後,出現各種莫名其妙的詭異BUG。
10、前端中如何進行組件化開發?
a、借用的後端的面向對象中的模塊化思想(把一些大功能拆分成許多函數,然後分配給不同的人來開發)
b、把一個單頁應用中的各種模塊拆分到一個一個單獨的組件(component)中,我們只要先在父級應用中寫好各種組件標簽(占坑),並且在組件標簽中寫好要傳入組件的參數(就像給函數傳入參數一樣,這個參數叫做組件的屬性),然後再分別寫好各種組件的實現(填坑)
在面向對象編程中,我們可以使用面向對象的思想將各種模塊打包成類或者把一個大的業務模塊拆分成更多更小的幾個類。在面向過程編程中,我們也可以把一些大功能拆分成許多函數,然後分配給不同的人來開發。
在前端應用,我們是否也可以像編程一樣把模塊封裝呢?這就引入了組件化開發的思想。
Vue.js通過組件,把一個單頁應用中的各種模塊拆分到一個一個單獨的組件(component)中,我們只要先在父級應用中寫好各種組件標簽(占坑),並且在組件標簽中寫好要傳入組件的參數(就像給函數傳入參數一樣,這個參數叫做組件的屬性),然後再分別寫好各種組件的實現(填坑),然後整個應用就算做完了。
11、為什麼有VirtualDOM技術?
a、問題
現在的網速越來越快了,很多人家裡都是幾十甚至上百M的光纖,手機也是4G起步了,按道理一個網頁才幾百K,而且瀏覽器本身還會緩存很多資源文件,那麼幾十M的光纖為什麼打開一個之前已經打開過,已經有緩存的頁面還是感覺很慢呢?
b、原因
(1)、瀏覽器本身處理DOM也是有性能瓶頸的
(2)、用JQuery或者原生的JavaScriptDOM操作函數對DOM進行頻繁操作的時候,瀏覽器要不停的渲染新的DOM樹
這就是因為瀏覽器本身處理DOM也是有性能瓶頸的,尤其是在傳統開發中,用JQuery或者原生的JavaScript
DOM操作函數對DOM進行頻繁操作的時候,瀏覽器要不停的渲染新的DOM樹,導致頁面看起來非常卡頓。
12、VirtualDOM如何實現?
a、預計算dom的各種操作,把最後一次的結果渲染出來(減少dom的渲染次數)
而Virtual
DOM則是虛擬DOM的英文,簡單來說,他就是一種可以預先通過JavaScript進行各種計算,把最終的DOM操作計算出來並優化,由於這個DOM操作屬於預處理操作,並沒有真實的操作DOM,所以叫做虛擬DOM。最後在計算完畢才真正將DOM操作提交,將DOM操作變化反映到DOM樹上。
13、到底該怎麼用Vue.js做單頁應用開發?
其實可以直接看學習視頻開始干,應該是最好的
a、介紹-vue.js官方文檔的基礎部分硬著頭皮看一遍
我的建議是,先把介紹-
vue.js官方文檔的基礎部分硬著頭皮看一遍。除了組件這個小節涉及到了很多晦澀難懂的名詞以外,前面幾章完全就是把Vue.js當作一個模版引擎來用。
b、ECMAScript6,Webpack,NPM以及Vue-Cli的基本用法,最好對Node.js也要有所了解
然後開始學習ECMAScript6,Webpack,NPM以及Vue-Cli的基本用法,最好對Node.js也要有所了解。
c、看網上各種實戰視頻以及文章還有別人開源的源代碼
最後組件部分先大致看一遍,了解組件裡面都有哪些概念之後,開始看網上各種實戰視頻以及文章還有別人開源的源代碼。
14、ECMAScript是啥?
ECMAScript和JavaScript的關系是,前者是後者的規格,後者是前者的一種實現(另外的ECMAScript方言還有
Jscript和ActionScript)。日常場合,這兩個詞是可以互換的。
而ECMAScript6就是新一代的JavaScript語言。
15、Webpack是啥?
a、前端打包工具
Webpack是一個前端打包和構建工具。如果你之前一直是手寫HTML,CSS,JavaScript,並且通過link標簽將CSS引入你的HTML文件,以及通過Script標簽的src屬性引入外部的JS腳本,那麼你肯定會對這個工具感到陌生。不要緊,我們先來了解一下為什麼要用Webpack,然後帶著原因去學習就好了。
16、為什麼要用Webpack?
a、方便管理各種素材
b、打包以便減少瀏覽器的訪問次數
前面說了,做一個單頁應用程序本身就相當復雜,而且在做的時候肯定會使用到很多素材和別的第三方庫,我們該如何去管理這些東西呢?
還有前面講到了Webpack是一個前端打包工具,前端代碼為什麼要打包呢?因為單頁應用程序中用到很多素材,如果每一個素材都通過在HTML中以src屬性或者link來引入,那麼請求一個頁面的時候,可能瀏覽器就要發起十多次請求,往往請求的這些資源都是一些腳本代碼或者很小的圖片,這些資源本身才幾k,下載連1秒都不需要,但是由於HTTP是應用層協議,它的下層是TCP這個運輸層協議,TCP的握手和揮手過程消耗的時間可能比下載資源本身還要長,所以需要把這些小文件全部打包成一個文件,這樣只要一次TCP握手和揮手的過程,就把多個資源給下載下來了,並且多個資源由於都是共享一個HTTP請求,所以head等部分也是共享的,相當於形成了規模效應,讓網頁展現更快,用戶體驗更好。
17、NPM和Node.js又是什麼?它們是什麼關系?
a、Node.js是一個服務端的JavaScript運行環境
Node.js是一個服務端的JavaScript運行環境,通過Node.js可以實現用JavaScript寫獨立程序。
b、Node.js可以寫獨立程序(Webpack就是Node.js寫的)
像我們之前提到的Webpack就是Node.js寫的,所以作為一個前端開發,即使你不用Node.js寫獨立程序,也得配一個Node.js運行環境,畢竟很多前端工具都是使用它寫的。
c、NPM是一個node.js的包管理器(類似java的maven(包的依賴管理),php也有一個類似的)。
NPM是一個node.js的包管理器。我們在傳統開發的時候,JQuery.js大多都是網路搜索,然後去官網下載,或者直接引入CDN資源,這種方法太過於麻煩。如果以後遇到其他的包,這個包的代碼本身可能還調用了其他的包(也稱這個包和其他的那幾個包存在依賴關系),那麼我們要在自己的項目中引入一個包將變得十分困難。現在我們有了NPM這個包管理器,直接可以通過
npminstallxxx包名稱
的方式引入它,比如說
npminstallvue
18、Vue-CLi是啥?
它是一個vue.js的腳手架工具。說白了就是一個自動幫你生成好項目目錄,配置好Webpack,以及各種依賴包的工具,它可以通過
npminstallvue-cli-g
的方式安裝,後面的-g表示全局安裝的意思,意味著你可以打開命令行之後直接通過vue命令調用它。
19、Vuex和Vue-route是什麼(暫時了解即可)?
Vuex是vue的一個狀態管理器。用於集中管理一個單頁應用程序中的各種狀態。
Vue-route是vue的一個前端路由器,這個路由器不是我們上網用的路由器,而是一個管理請求入口和頁面映射關系的東西。它可以實現對頁面局部進行無刷新的替換,讓用戶感覺就像切換到了網頁一樣。
要講清楚這兩個東西,又得花費大量篇幅,所以這里只是簡單提一下,先學好vue.js本身才是最重要的。
以上就是小編今天為大家分享的關於Web前端學習新手的常見疑問匯總的文章,希望本篇文章能夠對正在學習web前端知識的小夥伴們有所幫助,想要了解更多web前端相關知識記得關注北大青鳥web前端培訓官網,最後祝願小夥伴們學習成功,成為一名優秀的web前端工程師。
來源:原創小才君軟體編程網站開發
G. 卡頓或者性能差的情況,前端該如何去debug和優化
可騰訊手機管家清理加速,手機管家會智能選擇並關閉後台運行的進程,快速清理手機內存。同時會全面搜索手機中的垃圾文件,並將其刪除,從而迅速優化提升手機運行速度。定時給手機加速,就能讓你的手機快速許多,而操作就是如此簡單。
H. 前端數據多谷歌瀏覽器卡
內存不足,谷歌打開窗口太多、單個頁面卡死或長時間沒清理瀏覽器緩存。
調出「清除瀏覽數據」的對話框,選中「清空緩存」,開谷歌瀏覽器的任務管理器,關閉卡頓的標簽頁(進程)。
谷歌公司成立於1998年9月4日,由拉里·佩奇和謝爾蓋·布林共同創建,被公認為全球最大的搜索引擎公司。谷歌是一家位於美國的跨國科技企業,業務包括互聯網搜索、雲計算、廣告技術等,同時開發並提供大量基於互聯網的產品與服務。
I. 發現網站載入卡頓或者性能差的情況,前端該如何去debug和優化
載入卡頓和性能差的情況,多數出在程序方面。前段的話影響不會那麼大。前段要用壓縮的圖片,壓縮的JS,css文件。保持頁面適當的大小。