今天微博看到了寒冬大神的面試題,以爲挺有意思的,這裏就作一點解答javascript
談談你對CSS佈局的理解css
講講輸入完網址按下回車,到看到網頁這個過程當中發生了什麼。html
談談你對Web前端組件化的理解,Web Component會帶來怎樣的影響前端
談談你對前端資源下載性能優化的經驗和思考java
如今有不少的MV*框架,你對它們有什麼見解jquery
iOS體驗好在哪裏,Web能遇上麼?android
網頁遊戲怎麼作?ios
Hybrid技術應當如何應用?git
你最愛的前端框架是什麼,爲何?程序員
首先老師的題目都很大,很差答,我這裏技術有缺陷,答得很差你們不要噴我,能夠好好教育我嘛
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style>
* { margin: 0; padding: 0; } div { border: 1px solid black; } #sidebar { position: absolute; left: 0; top: 0; width: 95px; } #content { margin-left: 100px; } </style> <script src="../jquery-1.7.1.js" type="text/javascript"></script> </head> <body> <div id="content"> 主體 </div> <div id="sidebar"> 導航 </div> </body> </html>
<div> <span id="span1">主體 </span><span id="span2">導航 </span> </div>
請求返回後,便進入了咱們關注的前端模塊
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style>
div { border: 1px solid black; } a { color: Red; } </style> </head> <body> <div> <a id="span1" href="http://www.baidu.com">主體 </a><span id="span2">導航 </span> </div> <link href=" http://kb.cnblogs.com/style/common.css" rel="stylesheet" /> </body> </html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style>
div { border: 1px solid black; } a { color: Red; } </style> </head> <body> <div> <a id="span1" href="http://www.baidu.com">主體 </a><span id="span2">導航 </span> </div> <script> document.getElementById('span2').innerHTML = '測試'; alert(1) </script> <script> alert(2) </script> <link href=" http://kb.cnblogs.com/style/common.css" rel="stylesheet" /> </body> </html>
① index.apsx
② index.aspx.cs
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="_00綜合_11mvc_index" %>
public partial class _00綜合_10doc_write_index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e) { } }
最終這兩個文件會和到一塊兒,兩個文件之間也可通訊,而通訊的橋樑是.net一個個被人詬病的組件,好比:
① button組件
② datalist
③ label組件
④ 偉大的gridview
各個組件在C#層面上會擁有一個ID進行約束,.cs文件即可以根據該ID爲其註冊各個事件,這個與javascript的模型便很是相似了
View分離的第一個優勢即是,用戶的界面變得乾淨了,不會有代碼混雜的現象,第二個優勢即是業務端的代碼能夠再分離,從而多了數據層、業務層等各個概念
而組件的出現讓.net變成了世界上開發最快的語言,這點誰也不能否認,而這些都是前端MVC出現或者組件出現的意義
與asp當初的狀況一致,js進行dom操做或者字符串拼接的目的事實上就是想造成一個可供展現的View,前端jser已經不再能忍受這種代碼了:
不少時候,咱們想將對應的模板單獨的放到一個地方,每次樣式如果有更改,只須要更改那個文件便可,只要與之呼應的「ID」不丟失便可,好比這樣的結構和代碼:
<div class="cui-pop-box">
<div class="cui-hd">
<%=title%> </div> <div class="cui-bd"> <div class="cui-error-tips"> <%=content%></div> <div class="cui-roller-btns"> <% for(var i = 0, len = btns.length; i < len; i++ ) {%> <div class="cui-flexbd <%=btns[i].className%>"> <%=btns[i].name%></div> <% } %> </div> </div> </div>
這樣作的道理是,這個樣子作到了表現與行爲分離,咱們分得開,而後回根據基類的一個機制,讓他們最終合到一塊,以完成功能
這裏咱們依舊須要強調一個前提:「ID」關聯不可丟失,不然「行爲」將不可表現,只要二者間關聯不丟,這裏即可輕鬆知足如下邏輯:
① CSS名修改(非標識性CSS名)
② 標籤改變
③ 描述性文字改變
......
重構一書有說,重複性或者相似重複性的代碼應該抽象爲一個方法,程序員也不傻,在重複使用須要提示框需求後便會學會造成alert組件
組件的出現是代碼抽象,代碼重用的標識,這個樣子既能夠減小工做量也能夠減小代碼容量,而組件的實現與MVC思惟的很好詮釋
好比如下代碼:
事實上,MVC的任意一塊均可以做爲單獨的模塊實現,好比會有這樣的需求:一個model實例的變化會影響兩個View的顯示,可是僅僅對UI一塊來講咱們作了以下處理:
核心點變成了幾個屬性:
① template,根據他生成UI
② datamodel,根據他生成viewModel提供給template使用
③ eventArr,業務事件註冊點
這個代碼是Blade框架的UI基類,他是一個迷你MVC框架
1 propertys: function () {
2 //模板狀態
3 this.template = ''; 4 this.datamodel = {}; 5 this.events = {}; 6 this.wrapper = $('body'); 7 this.id = _.uniqueId('ui-view-'); 8 9 //自定義事件 10 //此處須要注意mask 綁定事件先後問題,考慮scroll.radio插件類型的mask應用,考慮組件通訊 11 this.eventArr = {}; 12 13 //初始狀態爲實例化 14 this.status = 'init'; 15 16 // this.availableFn = function () { } 17 18 },
template做爲View的實現,datamodel做爲model實現,咱們會根據datamodel與template生成基本的view實體
這裏datamodel與template之間會有一個viewModel的映射關係,是爲了防止服務器端忽然將title變成Title而致使模板解析錯誤
而整個文件即是一個控制器,view有的事件行爲採用javascript委託技術所有註冊在根元素上,如此整個UI就活了,他的好處是:
① 具備繼承關係,能夠擁有統一的資源釋放,或者View通訊機制
② 代碼量也會減小
MVC對前端的意義甚大,由於jser對MVC或者分模塊的思惟的深刻理解,咱們纔會將前端代碼作分離,這樣會有效的避免多人更改一個文件的難題
這對前端的推進做用不可謂不大!
組件化是對重複工做,重複代碼的下降,固然是好東西......
前端優化的瓶頸始終在資源加載,只要加載快,不管你代碼寫的多慢(不要糾結死循環),都必定快,因此前端優化事實上一直都是一個主題:瘦身
壓縮
css sprite
延遲加載(主要針對圖片)
按需加載(主要針對首屏未用到的UI)
緩存
CDN
預加載
等詞語不斷的在前端出現,可是一個不可避免的事實是,需求愈加複雜,體驗要求越高,因此一個前端可能的事實是:
前端資源體積愈來愈大,避免此事發生不是前端說了算的,須要產品與交互一塊兒努力,清晰、體驗好、輕量級的設計誰不喜歡,可是廣告營銷也不能不考慮,總之此事路還長!
對於webapp來講,首次加載的體積會更加大,由於其要求的庫更多,而且網速更慢,這個時候能夠採起fake頁的方案
咱們應該避免頁面長時間白頁,這個時候便提出了fake頁的概念。頁面渲染只須要完整的HTML以及CSS,這個即是第一個優化點。
從數據請求數以及請求量來講,webapp首頁的響應應該比較慢,如果任由js加載完成再渲染頁面,用戶頗有可能失去耐心。
可是從DOMContentLoaded來看,首頁事實上頁面響應比較迅速,因此這個加載結束後頁面第一屏便渲染結束,而後再異步加載js,當js改變後再動態改變dom結構中的一些關鍵點
這個時候一個靜態HTML頁面,裝載首屏的基本內容,讓首頁快速顯示
而後js加載結束後會立刻從新渲染整個頁面,這個樣子,用戶就能夠很快的看到頁面響應,給用戶一個快的錯覺,給人感受快得多。
按需加載的話確實會對首屏加載有好處,可是是否按需加載卻不必定了,如下面兩個體驗爲例:
http://yexiaochai.github.io/blade/demo/dest.html
http://yexiaochai.github.io/blade/demo/debug.html
PS:我這裏debug版本點擊時候未作mask處理,你們不要瘋狂點擊了
這裏各位直觀的感覺是什麼呢?是否是,首次加載後後續操做十分流暢,而按需加載的話,每次皆會感受有點「卡」
按需加載須要加載js和模板,這個過程天然卡,因此真正是否是要按需加載,或者多少資源按需加載有個臨界值,須要不斷的測試才行
最後,要減小資源的話,代碼的質量神馬的也須要考慮的,但對容量來講效用可能不是太大
IOS的體驗好,主要好在兩點:
① 清晰、簡潔、傻瓜化設計,連我媽均可以輕巧的操做蘋果手機其簡易型可想而知
② 用戶行爲模擬,IOS體驗第二點即是其無敵的動畫效果
如果說web應用想遇上(寒冬老師這裏遇上一詞用得十分貼切,他要說超過估計沒人理他了)native開發的話仍是有可能
可是若是說web應用要遇上IOS的設計的話,那麼還有無數荊棘須要踩過!而且有兩大前提:
① 網速快,用戶沒必要關心資源大
② 手機性能好,不說超越PC,至少能「遇上」PC吧
以上兩點成立的話,web應用遇上IOS體驗才變得可能,簡單來講就動畫而言,前端有哪些問題呢?
webapp中的動畫
因此單單由簡單的webapp的切換都如此困難,web應用想遇上IOS的話還要等幾年......
應該說Ajax帶動了前端的首次革命,而移動端帶來了二次革命,而Hybrid將前端推上了風口浪尖!
原來我廠app是使用native開發的,會出現此等問題:一個應用須要養3個團隊(ios、android、winphone),並且一旦業務改變會讓開發抓狂!
而Hybrid的出現解決了此問題,一套前端代碼能夠用於四個地方:瀏覽器、ios、android、winphone,而這個倒是互聯網公司最須要的
最近兩年,移動大潮襲來,各個公司皆在搶佔移動端的份額,誰贏了這場戰鬥誰就是下一代王者,因此出現了一個事實:
市場的佔領、業務的擴展是第一位!
因此Hybrid的市場與需求比native大,可是這不是說native沒用了,由於更好的體驗咱們的追求,因此在Hybrid佔領市場結束後,可能須要改版爲native
除非那時前端的體驗能縮小與native的距離
Hybrid提升了前端開發的門檻,由於Hybrid的調試難,可是業內也出現了一些調試的方案,我這裏有一套Hybrid調試的技巧,有興趣能夠交流
Hybrid 兼容BUG多,總所周知,H5站點上看着好好的程序,一旦到了webview上就出問題了,這個調試也很痛苦
哎,其實Hybrid開發也只是須要一點熟悉度罷了,沒有什麼可說的,就此打住吧
寒冬老師喜歡出題,我喜歡答題,其中幾道題我這裏沒有什麼概念就交白卷了,不知道個人回答是否能夠及格
如果寒冬老師或者各位以爲個人回答能勉強及格,左邊微博求粉!!!尼瑪我粉絲太少了!!!