前端工程化包含一系列規(guī)范和流程,其可提升前端工程師的工作效率,加快Web開(kāi)發(fā)迭代速度,是現(xiàn)在前端開(kāi)發(fā)領(lǐng)域中非常重要的一環(huán)。前端工程化:體系設(shè)計(jì)與實(shí)踐》系統(tǒng)、全面地介紹了前端工程體系的各個(gè)環(huán)節(jié),包括設(shè)計(jì)要點(diǎn)和實(shí)踐經(jīng)驗(yàn)。全書分為7章,分別是前端工程簡(jiǎn)史、腳手架、構(gòu)建、本地開(kāi)發(fā)服務(wù)器、部署、工作流、前端工程化的未來(lái)。
前端工程化:體系設(shè)計(jì)與實(shí)踐》適合對(duì)前端工程化有一定理解和實(shí)踐的中高級(jí)前端工程師閱讀,同樣適合對(duì)前端工程化感興趣的服務(wù)器端開(kāi)發(fā)者以及運(yùn)維人員閱讀。
1.本書由周愛(ài)民老師傾情作序,美團(tuán)技術(shù)總監(jiān)趙強(qiáng)、搜狐高級(jí)技術(shù)經(jīng)理邵充、Facebook軟件工程師鄧凌飛、ofo前端架構(gòu)師代學(xué)輝聯(lián)袂力薦。
2.本書系統(tǒng)、全面地介紹了前端工程體系的各個(gè)環(huán)節(jié),包括設(shè)計(jì)要點(diǎn)和實(shí)踐經(jīng)驗(yàn)。全書分為7章,分別包括緒論、腳手架、構(gòu)建、本地開(kāi)發(fā)服務(wù)器、部署、工作流、前端工程化的未來(lái)。
3.本書以本地工具鏈形態(tài)的前端工程化方案Boi為例,以Yeoman為內(nèi)核的腳手架、以Express承載本地服務(wù)器、以webpack為內(nèi)核的構(gòu)建系統(tǒng)、基于SFTP協(xié)議的遠(yuǎn)程部署功能,這個(gè)方案的很多理念可以作為論證本書觀點(diǎn)的參考。
4.前端工程化現(xiàn)在正處于不斷探索的初級(jí)階段,這本書提供了大量的前端工程師可借鑒、參考并投之于生產(chǎn)實(shí)作的實(shí)踐,適合前端工程師進(jìn)階學(xué)習(xí)和參考。
前端工程師這一崗位最初被獨(dú)立分化出來(lái)專注于網(wǎng)頁(yè)樣式(CSS)的制作,目的是為了令Web開(kāi)發(fā)者將更多的精力投入負(fù)責(zé)的業(yè)務(wù)邏輯中。然而隨著Web技術(shù)的發(fā)展以及PC、移動(dòng)智能終端設(shè)備性能和功能的提升,用戶對(duì)于網(wǎng)站的需求也不斷增加。市場(chǎng)的需求促進(jìn)技術(shù)的革新,對(duì)于前端工程師的要求早已不僅僅是編寫CSS了。資源的多樣性和邏輯的復(fù)雜性一度令前端開(kāi)發(fā)工作異常煩瑣且難以維護(hù),工作效率的降低直接導(dǎo)致Web產(chǎn)品的迭代速度變慢,前端工程化便是在此時(shí)代背景下應(yīng)運(yùn)而生的。
事實(shí)上,前端工程化目前的形態(tài)和生態(tài)仍然處于非常原始的階段。每個(gè)團(tuán)隊(duì)甚至每個(gè)人由于存在研究領(lǐng)域(比如業(yè)務(wù)層和框架層)和業(yè)務(wù)類型(比如Google Map與淘寶)的差異,從而對(duì)前端工程化有不同的需求和定位。本書將前端工程化解讀為一系列規(guī)范和流程的集合,它不是一個(gè)框架或者工具,聚焦的不是某個(gè)垂直的研究領(lǐng)域或者特殊的業(yè)務(wù)類型,而是一種可演化、可擴(kuò)展的服務(wù),服務(wù)的目標(biāo)是解決前端開(kāi)發(fā)以及前后端協(xié)作開(kāi)發(fā)過(guò)程中的難點(diǎn)和痛點(diǎn)問(wèn)題,涵蓋項(xiàng)目的起始、開(kāi)發(fā)、測(cè)試以及部署環(huán)節(jié)。工具是前端工程化的實(shí)現(xiàn)媒介,規(guī)范是工程化的指導(dǎo)方針,工作流程是工程化的外在表現(xiàn)形式以及約束規(guī)范的載體。
本書通過(guò)解析一個(gè)Web項(xiàng)目迭代過(guò)程中前端開(kāi)發(fā)者面臨的諸多問(wèn)題,從工程化的角度給出對(duì)應(yīng)的解決方案,最終將各個(gè)環(huán)節(jié)串聯(lián)為完整的工作流。希望讀者通過(guò)閱讀本書可以對(duì)前端工程化要解決的問(wèn)題有大致的了解,從而能夠?qū)ψx者自行實(shí)現(xiàn)工程化方案有所幫助。
目標(biāo)讀者
本書的主要目標(biāo)讀者是對(duì)前端工程化有一定理解和實(shí)踐的中高級(jí)前端工程師,同樣適用于對(duì)前端工程化感興趣的服務(wù)器端開(kāi)發(fā)者以及運(yùn)維人員。本書假設(shè)讀者熟悉Web站點(diǎn)的基本工作原理,尤其是前端與服務(wù)器端之間的協(xié)作流程,并且對(duì)HTTP協(xié)議、異步通信、模塊化等知識(shí)有深入的理解。
示例代碼
本書選取了一個(gè)簡(jiǎn)易的前端工程化解決方案Boi作為示例,這并不是一個(gè)完整形態(tài)的解決方案,但是它的許多理念可以作為論證本書觀點(diǎn)的參考。讀者可以從GitHub上獲取其源碼:https://github.com/boijs/boi。
內(nèi)容概覽
本書第1章以前端工程師從無(wú)到有直至發(fā)展至今的歷程作為后續(xù)內(nèi)容的起始。從歷史中我們提煉出前端開(kāi)發(fā)人員在一個(gè)Web項(xiàng)目迭代周期各個(gè)階段面臨的諸多問(wèn)題,這些問(wèn)題是前端工程化誕生的催化劑,也是指導(dǎo)工程方案設(shè)計(jì)的本源。之后,我們會(huì)按照Web項(xiàng)目從起始到發(fā)布的流程分別介紹前端工程化在各個(gè)階段的需求和功能設(shè)計(jì),比如腳手架在項(xiàng)目初期減少了重復(fù)的體力操作并且降低了業(yè)務(wù)框架學(xué)習(xí)成本;構(gòu)建系統(tǒng)從編程語(yǔ)言、優(yōu)化和部署 3 個(gè)角度解決了前端開(kāi)發(fā)語(yǔ)言內(nèi)在的缺陷以及由宿主客戶端特性引起的開(kāi)發(fā)和生產(chǎn)環(huán)境之間的差異性;本地開(kāi)發(fā)服務(wù)器提供了前后端并行開(kāi)發(fā)的平臺(tái);部署功能權(quán)衡速度、協(xié)作和安全,把控著Web產(chǎn)品上線前的最后一道關(guān)卡。最后將這些功能模塊合理地串聯(lián)為完整的工作流,便是前端工程化的完整外在形態(tài)。
前端工程師的定位在不同的年代甚至不同的團(tuán)隊(duì)中存在著巨大的差異,即使僅以目前的時(shí)間節(jié)點(diǎn)為標(biāo)準(zhǔn)也難以給前端工程師一個(gè)絕對(duì)明確的定義。崗位職責(zé)的變化促進(jìn)了工程體系的演進(jìn),所以本書在最后的章節(jié)中闡述了一些對(duì)前端工程師未來(lái)定位的思考,同時(shí)探討了與之對(duì)應(yīng)的前端工程體系的演進(jìn)形式。
以下是分章節(jié)介紹:
第1章 前端工程簡(jiǎn)史 講述前端工程師的發(fā)展史、在團(tuán)隊(duì)中的定位,以及前后端分離和前端工程化的進(jìn)化歷程與基本形態(tài)。
第2章 腳手架 講述作為前端項(xiàng)目起始階段取代煩瑣人工操作的腳手架必須具備的要素以及本質(zhì),通過(guò)剖析目前市面上的經(jīng)典案例講解實(shí)現(xiàn)腳手架過(guò)程中需要考慮的要點(diǎn)以及如何集成Yeoman到工程化方案中。
第3章 構(gòu)建 講述構(gòu)建系統(tǒng)面臨的問(wèn)題以及對(duì)應(yīng)的解決方案。構(gòu)建是前端工程體系中功能最多、最復(fù)雜的模塊,也是串聯(lián)本地開(kāi)發(fā)服務(wù)器、部署的關(guān)鍵,是實(shí)現(xiàn)工作流的核心模塊。
第4章 本地開(kāi)發(fā)服務(wù)器 講述如何以Mock服務(wù)實(shí)現(xiàn)前后端并行開(kāi)發(fā),以及配合動(dòng)態(tài)構(gòu)建進(jìn)一步提升前端工程師的開(kāi)發(fā)效率。
第5章 部署 講述部署功能如何權(quán)衡速度、協(xié)作和安全3個(gè)重要原則,以及前端靜態(tài)資源特殊的部署策略。
第6章 工作流 講述如何將既有的功能串聯(lián)成完整的工作流。以速度見(jiàn)長(zhǎng)的本地工作流和注重嚴(yán)謹(jǐn)?shù)脑破脚_(tái)工作流,兩者各有優(yōu)劣,適用于不同需求和不同規(guī)模的團(tuán)隊(duì)。
第7章 前端工程化的未來(lái) 講述前端工程師如何選擇進(jìn)階的方向以便適應(yīng)未來(lái)的變化。前端工程化是服務(wù)于前端開(kāi)發(fā)的,前端工程師定位的改變必然會(huì)引起工程化方案的調(diào)整。本章通過(guò)分析未來(lái)工程化不變和可變的方面,探討前端工程化未來(lái)的表現(xiàn)形式。
前端工程化系列叢書
本書是前端工程化系列叢書之一,著重講述輔助性質(zhì)的工程體系設(shè)計(jì)和實(shí)踐過(guò)程。前端工程化可以簡(jiǎn)單地理解為前端架構(gòu)與工程體系的綜合體,兩者相輔相成。本系列叢書的后續(xù)作品將從綜合的角度深層剖析架構(gòu)與體系之間的關(guān)聯(lián)及融合,講述如何從宏觀的角度打造合理的前端工程化生態(tài)。感興趣的讀者可以關(guān)注本系列叢書的相關(guān)動(dòng)態(tài)。
聯(lián)系作者
如果您在閱讀過(guò)程中有任何問(wèn)題,可以發(fā)送郵件到作者的個(gè)人郵箱:zjp0432@163.com。
致謝
感謝我的同事和領(lǐng)導(dǎo)在我創(chuàng)作本書期間給予的建議和支持。特別感謝我曾經(jīng)的技術(shù)領(lǐng)導(dǎo)元亮,在與他共事期間我于前端工程領(lǐng)域的探索和研究得到了充分的空間和資源。
感謝電子工業(yè)出版社博文視點(diǎn)的編輯付睿,她在編輯和審校本書期間提出了寶貴的意見(jiàn)。
最后,感謝我的朋友、父母以及妻子劉女士在我創(chuàng)作本書期間給予的空間和支持。
周俊鵬
1987年生人,天蝎座,5只貓和1只狗的鏟屎官,大前端(客戶端 Web
Service)踐行者。主要研究方向?yàn)榍岸斯こ袒蚖eb應(yīng)用層架構(gòu),好于研究事物的本質(zhì),并且樂(lè)于從宏觀的角度解決問(wèn)題。時(shí)任搜狗地圖Web前端開(kāi)發(fā)主管。
第1章 前端工程簡(jiǎn)史 1
1.1 前端工程師的基本素養(yǎng)
2
1.1.1 前端工程師的發(fā)展歷史
2
1.1.2 前端工程師的技能棧
3
1.2 Node.js帶給前端的改革
7
1.2.1 前端的兩次新生
7
1.2.2 Node.js帶來(lái)的改革
9
1.3 前后端分離
12
1.3.1 原始的前后端開(kāi)發(fā)模式
13
1.3.2 前后端分離的基本模式
14
1.3.3 前后端分離與前端工程化
19
1.4 前端工程化
19
1.4.1 前端工程化的衡量準(zhǔn)則
20
1.4.2 前端工程化的進(jìn)化歷程
21
1.4.3 前端工程化的3個(gè)階段 32
1.5 工程化方案架構(gòu)
34
1.5.1 webpack 34
1.5.2 工程化方案的整體架構(gòu)
36
1.5.3 功能規(guī)劃
37
1.5.4 設(shè)計(jì)原則
41
1.6 總結(jié)
42
第2章 腳手架 43
2.1 腳手架的功能和本質(zhì)
44
2.2 腳手架在前端工程中的角色和特征
45
2.2.1 用完即棄的發(fā)起者角色
45
2.2.2 局限于本地的執(zhí)行環(huán)境
47
2.2.3 多樣性的實(shí)現(xiàn)模式
49
2.3 開(kāi)源腳手架案例剖析
51
2.4 集成Yeoman封裝腳手架方案 56
2.4.1 封裝腳手架方案
57
2.4.2 集成到工程化體系中
63
2.5 總結(jié) 66
第3章 構(gòu)建 68
3.1 構(gòu)建功能解決的問(wèn)題
68
3.2 配置API設(shè)計(jì)原則和編程范式約束 71
3.2.1 配置API設(shè)計(jì) 71
3.2.2 編程范式約束
75
3.3 ECMAScript與Babel 76
3.3.1 ECMAScript發(fā)展史
76
3.3.2 ES6的跨時(shí)代意義
78
3.3.3 Babel真正意義的JavaScript編譯 80
3.3.4 結(jié)合webpack與Babel實(shí)現(xiàn)JavaScript構(gòu)建 84
3.4 CSS預(yù)編譯與PostCSS 89
3.4.1 CSS的缺陷
90
3.4.2 CSS預(yù)編譯器
90
3.4.3 PostCSS 91
3.4.4 webpack結(jié)合預(yù)編譯與PostCSS實(shí)現(xiàn)CSS構(gòu)建
93
3.4.5 案例:自動(dòng)生成CSS Sprites功能實(shí)現(xiàn) 95
3.5 模塊化開(kāi)發(fā)
101
3.5.1 模塊化與組件化
101
3.5.2 模塊化與工程化
102
3.5.3 模塊化開(kāi)發(fā)的價(jià)值
103
3.5.4 前端模塊化發(fā)展史
107
3.5.5 webpack模塊化構(gòu)建
109
3.6 增量更新與緩存
112
3.6.1 HTTP緩存策略
113
3.6.2 覆蓋更新與增量更新
117
3.6.3 按需加載與多模塊架構(gòu)場(chǎng)景下的增量更新
120
3.6.4 webpack實(shí)現(xiàn)增量更新構(gòu)建方案
122
3.7 資源定位
128
3.7.1 資源定位的歷史變遷
128
3.7.2 常規(guī)的資源定位思維
132
3.7.3 webpack的逆向注入模式
132
3.8 總結(jié)
147
第4章 本地開(kāi)發(fā)服務(wù)器 149
4.1 本地開(kāi)發(fā)服務(wù)器解決的問(wèn)題
150
4.2 動(dòng)態(tài)構(gòu)建
152
4.2.1 webpack-dev-middleware 152
4.2.2 Livereload和HMR 157
4.3 Mock服務(wù)
161
4.3.1 Mock的必要前提和發(fā)展進(jìn)程
162
4.3.2 異步數(shù)據(jù)接口
166
4.3.3 SSR 172
4.4 總結(jié)
174
第5章 部署 175
5.1 部署流程的設(shè)計(jì)原則
175
5.1.1 速度化繁為簡(jiǎn)
177
5.1.2 協(xié)作代碼審查和部署隊(duì)列
181
5.1.3 安全嚴(yán)格審查和權(quán)限控制
184
5.2 流程之外:前端靜態(tài)資源的部署策略
186
5.2.1 協(xié)商緩存與強(qiáng)制緩存
186
5.2.2 Apache設(shè)置緩存策略
186
5.3 總結(jié)
190
第6章 工作流 191
6.1 本地工作流
192
6.1.1 二次構(gòu)建的隱患
193
6.1.2 代碼分離與測(cè)試沙箱
194
6.2 云平臺(tái)工作流
197
6.2.1 GitFlow與版本管理
199
6.2.2 WebHook與自動(dòng)構(gòu)建
201
6.3 持續(xù)集成與持續(xù)交付
203
6.4 總結(jié)
205
第7章 前端工程化的未來(lái) 206
7.1 前端工程師未來(lái)的定位
206
7.1.1 不只是瀏覽器
207
7.1.2 也不只是Web 208
7.2 前端工程化是一張藍(lán)圖
209
7.3 總結(jié)
212