以興趣部落爲例講解面向億萬用戶的 Web 同構直出。
首先介紹了一些基本概念。
什麼是直出?javascript
以 Node 做爲後端語言實現的服務端渲染頁面並輸出的技術。複製代碼
什麼是同構?前端
客戶端與服務端能夠共享部分代碼複製代碼
而後給出了兩個二維碼,讓你們掃碼體驗哪一個是直出前頁面,哪一個是直出後頁面。java
ReactDomServer.renderToString
拼裝 HTML 字符串,返回給瀏覽器。瀏覽器端根據服務端返回的數據 ReactDom.render
出真實 DOM。`_BROWSER_`;
...
`_END_`;複製代碼
經過直出框架機來實現。react
框架集本地開發調試經過使用命令行工具包 fireDragon
,執行如下命令就能夠啦。jquery
npm link // 創建全局連接
firedragon init //初始化路由配置
firedragon // 讀取路由配置文件,啓動服務複製代碼
容災採用兩種方式,框架機進行柔性處理,以及接入層轉發。git
經過 wetest.qq.com
平臺監控各項應用數據瞭解承受能力,找出性能瓶頸。github
採用灰度發佈,逐步擴大直出頁面訪問用戶從 10 拓展到 3億,服務器從 1 臺拓展到 111 臺。web
服務器層面從 CPU 使用率,CPU 性能,內存佔用,磁盤 IO,網絡 IO 監控。
運行時數據從腳本錯誤,測試,PV/UV,直出服質量,後臺接口質量和染色日誌。面試
零腳本錯誤實戰主要從下面五個方面展開講解。ajax
客戶反饋?老闆連環奪命 call ? 經歷了這些思考採用更高效的方案。
體系組成分爲三步,監聽->上報->數據收集系統。
try-catch
,window-onerror
。ajax
請求或者直接使用 img
。上報發現遇到不少 script error
錯誤,是由瀏覽器的同源策略致使的。
如何解決呢?script
標籤添加 crossorigin
屬性,後端作 CORS 處理。
錯誤腳本分析基於 SourceMap
監控方案解決。
經過生成 SourceMap
文件維護源文件和處理後文件的映射關係,使用 VLQ
編碼來存儲映射。
或者使用開源的 sentry
。
監控、上報白名單中的前端資源。
HTML Meta
標籤<meta http-equiv="Content-Security-Policy" content="script-src 'self'" >複製代碼
HTTP Header
(響應頭帶上 CSP
的指令)使用上報(不攔截),攔截兩種方式。複製代碼
推薦了兩個插件,js-error-dialog
報錯彈窗和prettyjs
代碼格式化、高亮和錯誤展現。
分享提問開發者開發的第一個網站爲引導,引出前端工程化的議題,而且從開發環境、銜接和生產環境三個環節來說述。
開發工程化從三個主要環節進行,腳手架與命令行、組件化和接口聯調。
steamerjs
。即裝即用的插件式機制方便項目快速搭建,只須要鍵入如下幾條命令就好啦:npm i -g steamerjs
npm i -g steamer-plugin-kit
npm i -g steamer-react
steamer kit複製代碼
npm
或者 npm
私服,方便跨項目的組件複用。element
。postman
,easy-mock.com
,steamer-plugin-mock
。wetest
, 日誌監控推薦 sentry.io
。github + travis-ci
,私有項目可使用bitbucket + pipeline
or github + pipeline
。pre-Commit
檢查。生產部署推薦使用騰訊雲(此處有廣告硬植入,哈哈~)
首先介紹了什麼是 Service Worker。
Service Worker 是瀏覽器後臺運行 JS 處理網絡請求和管理緩存相應的方法。Service Worker 提供了一個 Application Cache 的替代方案。
最簡單的 Service Worker 樣例:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('./sw.js')
}
// sw.js
self.onfetch = (e) => {
e.respondWith(new Response('Hello Service Worker!'))
}複製代碼
Installing
-> Active
,出錯的話會進入 Error
。Installing
-> Waiting
-> Active
,出錯的話一樣會進入 Error
。兼容性
Service Worker 的 URL
千萬不要打版本號!!!正確的作法是保持 SW URL 不變,且與主頁在同一域名下。
xxx.com/xxx/sw.js複製代碼
Dev Tool
在 Chrome 調試工具 network
選項中,Size
欄爲 from Service Worker
就是啓用了 Service Worker
加載的資源。
自動構建
業界比較成熟的是谷歌的 sw-precache。使用也很簡單,一行命令搞定:
sw-precache —config=sw-config.js
// sw-config.js
module.exports = {
// 須要SW緩存的⽂文件,默認使⽤用緩存優先策略略
staticFileGlobs: [
'dist/cdn/**',
'dist/webserver/**'
],
// 前綴替換
stripPrefixMulti: {
'dist/cdn/': '//path/to/your/cdn/',
'dist/webserver/': '//path/to/your/webserver'
},
// 輸出路路徑
swFile: '/dist/webserver/sw.js',
// 動態內容的緩存策略略
runtimeCaching: [{
// 對於全部url中帶有 '/api/' 的請求,優先⽹網絡請求,若離線,則使⽤用以前的緩存
urlPattern: /\/api\//,
handler: 'networkFirst'
}]
};複製代碼
固然 sw-precache 也有一些缺陷,好比沒有集成的 Runtime,不支持外部 CDN 資源。
考慮到這些缺陷,基於 sw-precache 作了一些改進解決這些缺點,命名爲 create-sw。
最後還提到了 PWA 實踐,有興趣能夠詳細瞭解。
首先簡單描述了人工智能的大背景,人工智能時代背景下每一個人都須要瞭解或學習人工智能。以後推薦了一個前端深度學習庫 deeplearn.js
。
分享主要以興趣部落送禮頁面的實踐爲例,分如下幾個話題講述:
移動端的屏幕適配分爲如下幾種場景闡述:
需考慮內存消耗和幀率,推薦工具 stats.js 和 Chrome developTool。
使用 GPU 硬件加速
圖片壓縮
性能問題
性能的監控使用以前推薦的 stats.js 就好。分析發現 translate 的表現明顯優於 background。
測試過程當中發現動畫有鋸齒,卡頓明顯,有多是圖片太大致使的。
性能調試 timeline
鋸齒是如何產生的呢?
幀動畫圖片性能
幀動畫到底用不用合圖?建議不要合圖使用 HTTP2.0 便可。合圖以後的雪碧圖會有空白區域,一個動畫大概 40 - 50 幀的圖片,單張圖片要 500 500 px,合併圖後達到 4000px 3000px。
幀動畫優化方案 - zip 壓縮包
幀動畫優化方案 - indexedDB
硬件加速 will-change
兼容性問題 CSS3 動畫控制
兼容性問題 FPS 控制
限制幀率 RAF
通常建議保證 60 FPS 的幀率。若是不限制幀率的時候,使用 RAF 自由發揮,但須要注意資源包體積。
兼容性問題 canvas Retina適配
250px 250px 的原圖到 500px 500px 的畫布上發現變模糊了,緣由是設備像素比 window.devicePixelRatio 致使的。能夠畫在 500px * 500px 的 Canvas 上再 scale(0.5)。
致使性能問題的緣由多是機器性能低,內存緊張,幀率低。
性能評分的原理是頁面建立必定數量的DOM,並添加 transform 和 opacity 變化。根據幀率衡量機器性能。
fps = 1000 * n/t
@1x
圖片產品頻繁新增/更換禮物,若是每次更換都修改代碼無疑是不可取的。所以須要把動畫效果改成可配置,定義統一配置文件,動畫資源由 packageID 惟一標識,禮物配置與動畫資源分離。
Javascript 語言的執行環境是單線程的。若是一個任務耗時很長,就會阻塞後面的任務,致使頁面無響應。因而,Javascript 將任務的執行模式分爲同步和異步。
經過jQuery when
方法一樣能夠實現相似於 Promise
對象的功能。而且經過 when
可使得多個異步並行請求,而後獲取返回值進行回調處理
經過 done
或者 then
兩種方式進行回調。
promise的功能是能夠將複雜的異步處理輕鬆地進行模式化。
接着簡單介紹了 promise
的 API,就再也不詳細講述了:
Promise只能進行異步調用方式。
理論上,在promise.then 執行的時候promise對象已是肯定狀態,從程序上說對回調函數進行同步調用也是行得通的。
Promise也會以異步的方式調用該回調函數,這是在Promise設計上的規定方針。
當需求變得複雜後,多層嵌套和鏈式調用,也讓代碼看起來不那麼優雅。
經過 async/await 解決異步方式有如下幾個有優勢:
以後是下午甜點:
首先以一個 Demo 爲例判斷是否爲函數式編程。
function f(h){
return h + 1;
}
var x = 3;
f(x + 1);複製代碼
理解函數式編程意味着:
經過點擊計數任務不一樣的寫法來說述函數式編程的特色。代碼傳送門:
函數式編程是種編程範式,它將電腦運算視爲函數的計算,關注純邏輯與數學運算。
純函數只有邏輯運算和數學運算,同一個輸入總獲得同一個輸出。純函數的優勢是可緩存、可測試、可並行(web worker),可進行惰性計算。
var memoize = function(f) {
var cache = {};
return function() {
var arg_str = JSON.stringify(arguments);
cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
return cache[arg_str];
};
};複製代碼
let f = x => x + 1;
let g = x => x * 2;
g(f(1))
compose(g, f)(1)複製代碼
Container.of
把東西裝進容器中隔絕外部影響,經過 Map 來接觸、操做窗口內的值,得到包含新值的容器。var Container = function(x) {
this._value = x;
}
Container.of = function(x) {
return new Container(x);
}
Container.of(3)
// => Container(3)
Container.prototype.map = function(f){
return Container.of(f(this._value))
}
Container.of('flamethrowers').map(function(s) {
return s.toUpperCase()
}
// => Container('FLAMETHROWERS')複製代碼
上個函數輸出是下個函數函數輸入。
流式框架有 xtream 和 RxJS。
最後附上參考資料
老教授首先拋出一個經典問題,「若是你是一個大學畢業生,你會選擇大型互聯網公司仍是創業公司?」。
這個問題歷來沒有標準的答案,而且現場的回答者就很堅決的選擇小公司,而老教授的建議是選擇大公司。
以及一些綜合知識考察,好比:用戶從輸入 url 到最終頁面展現,這個過程當中發生了什麼?老闆反饋頁面打開白屏,而你手機是正常的,怎麼辦?頁面卡頓,怎麼優化?
若是你連前端基礎知識都沒掌握好,我怎麼相信你是熱愛前端的學習者?
一個字,懟!找出項目經歷的關鍵詞,而後由淺入深,一直問到答不上來爲止。暗中觀察團隊協做意識、攻克難題決心、搜索資料能力等。
大學的時候以廣度爲主,拓展視野;
工做以後以深度爲主,單點深挖;
當達到瓶頸後,再次向廣度拓展,打通知識。
————百度某總監複製代碼
基礎知識
基礎知識相比社招有更高的要求。
項目經驗
項目經驗需對比騰訊的高級前端工程師要求。
最後,樂觀自信和技術能力同樣重要!
到這裏本次 AC 大會的現場實錄就更新完了,一成天 9 場的技術分享加圓桌討論,議題也是從項目搭建、優化、監控到編程思想、前沿科技以及職業發展涵蓋各個方面,真的是幹到不能再幹的大會了。一天很短,內容很長,但願對你們有所幫助,將來幾天慢慢消化,接下來也能夠多多交流。