前言
前端技術發(fā)展很快,很多項目面臨前端部分重構,很開心可以讓我進行這次項目前端的重構方案編寫,在思考的同時參考了網(wǎng)上很多資料,希望本篇重構方案有一定的完整性,可以帶給大家一些在面臨重構時有用的東西,同時希望路過的大牛小牛不領賜教,能給我略微指點下重構相關的點,在下感激不盡~
一、原項目梳理
首先對原來項目做一個大概的梳理,既然是重構,當然很多東西是可以繼續(xù)拿來使用的。
1.1頁面結構
我這邊負責的PC端的重構,所以先把頁面結構及之間的關系梳理了一遍,并用xmind畫好結構圖,重點功能做上標記,因為vue是漸進式框架,所以我會優(yōu)先重構重要的部分
xmind結構圖我就不上了,職業(yè)操守還是要的
1.2項目結構
項目結構是針對代碼組織結構的,梳理了項目各重要的文件夾及文件并注明對應的內容或者作用。同樣的,使用xmind畫出結構圖,xmind圖略。
1.3前端框架、模板
使用公司內部人員自創(chuàng)框架C.F.F,自定義build文件,內嵌Smarty模板獲取后臺數(shù)據(jù),利用{$xxx}獲取后臺數(shù)據(jù),但是定義了很多全局變量存儲模板數(shù)據(jù),造成占用更多內存、污染命名空間等問題。
定義公共組件供各模塊或特定場景調用,復用度高
1.4第三方庫、組件、插件
jquery: JavaScript庫
html5shiv:用于解決IE9以下版本瀏 覽器對HTML5新增標簽不識別,并導致CSS不起作用的問題。
Dialog : jquery彈窗插件
jCarousel : jquery 輪播插件 (重構版舍棄,原因不復雜的場景能原生實現(xiàn)盡量原生實現(xiàn))
respond:為 IE6-8 以及其它不支持 CSS3 Media Queries 的瀏覽器提供媒體查詢的 min-width 和 max-width 特性,實現(xiàn)響應式網(wǎng)頁設計
sideToolbar:導航工具
echarts: 圖形工具
...
二、重構方案
2.1開發(fā)規(guī)范
命名規(guī)范
html/css/less/sass/scss/javascript編碼規(guī)范
代碼檢查工具 eslint
規(guī)范這個東西沒有絕對的對錯,只有同公司或者同部門來制定規(guī)范大家都保持一致,同事之間能很快讀懂相互的代碼,提高開發(fā)效率
2.2技術選型
2.2.1 開發(fā)模式:前后端分離
前后端分離開發(fā)早已成為趨勢,到現(xiàn)在新項目大多采用這種模式進行開發(fā),項目完全重構的話當然首選此模式
好處:以前沒有前端這一職位之說,都是后端兼顧開發(fā),數(shù)據(jù)庫、底層服務、接口,頁面一把梭,壓力大,而且精力有限不能在每個領域都做的出色。后來有切圖這一職,可以把頁面寫的更精美一些,通過模板和請求接口配合進行數(shù)據(jù)交互,前端都是緊緊耦合于后端,這種情況下開發(fā),溝通成本,開發(fā)過程中進度依賴成本都是較高的。前后端分離后,分工更明確,各自專注做好自己領域的事,同時開工,不相互依賴,效率高
原理:(此圖來自某博客,地址忘記。 望博主看到能聯(lián)系我加上轉載出處,在此抱歉~)
開啟一個本地的服務器來運行自己的前端代碼,以此來模擬真實的線上環(huán)境;
利用nodejs的express框架來開啟一個本地的服務器,然后利用nodejs的一個http-proxy-middleware插件將客戶端發(fā)往nodejs的請求轉發(fā)給真正的服務器,讓nodejs作為一個中間層。
然后就是數(shù)據(jù)問題了,后端接口在開發(fā)中,前端需要數(shù)據(jù)怎么辦呢?mockjs了解一下,
API地址https://github.com/nuysoft/Mo... ,當后端設計出AP接口文檔后,我們就可以利用mockjs模擬出對應格式的假數(shù)據(jù)進行開發(fā),等到接口完全完成之后,再進行接口聯(lián)調
2.2.2 MVVM框架:vue
Vue是一個漸進式框架,容易入手、容易協(xié)同,能夠快速靈活的開發(fā)迭代。同時也是目前主流三大框架里學習成本最低的,目前,公司也在主推vue作為首選框架,進行相關技術的培訓。
Vue社區(qū)相對熱度高,組件、庫、輪子多,資源整合鏈接(https://segmentfault.com/p/1210000008583242/read?from=timeline#UI%E7%BB%84%E4%BB%B6)
體積小、自由度高、腳手架創(chuàng)建的項目自帶webpack打包構建工具
雖然vue是單頁應用,但是可以通過配置webpack進行多頁開發(fā)
2.2.3 css預編譯語言
使用css預編譯語言來寫css會提高編寫css效率(具體提高多少百分比效率可自行測試,我覺得找一段寫好的css,先用css寫一遍,再用less或者其他寫一遍計算耗時百分比,這里忽略寫樣式時候思考的時間進行測試)
預編譯語言可以定義變量(比如常用的顏色、字體、字號等)、嵌套寫法、可以繼承其他類的屬性、計算、內置函數(shù)等
2.2.4 常用類庫
圖形工具—echarts (對應場景 – xxx)
適配插件—flexible taobaoH5終端適配方案 (對應場景—xxx)
Lodash – JS函數(shù)庫 (對應場景—xxx)
ElementUI – UI庫 (對應場景—xxx)
One-Page-Nav – 導航插件 (對應場景—xxx)
具體場景我就不寫了,根據(jù)你們不同的業(yè)務需求去判斷需要哪些類庫插件之類的,預先決定好,以免半途做什么都要去花時間思考
2.3構建工具
既然選擇了vue框架,構建工具當然選擇vue自帶的webpack了,對于webpack有人說會配置項目就行,有人說要深入研究,這個看個人需求我覺得
2.4開發(fā)效率
PS一鍵切圖功能
emmet快速編寫HTML
#page>div.logo+ul#navigation>li*5>a{Item $}
按下tab鍵,上述代碼 等于
<div id="page"> <div class="logo"></div> <ul id="navigation"> <li><a href="">Item 1</a></li> <li><a href="">Item 2</a></li> <li><a href="">Item 3</a></li> <li><a href="">Item 4</a></li> <li><a href="">Item 5</a></li> </ul></div>
背景:原項目寫的純css
less/sass/scss 快速編寫css
比如
@base-size: 40px;@theme-color: #ccc;@my-selector: title;.aa { font-weight: bold;}.@{my-selector} { font-size: @base-size; color: @theme-color; margin: 100/2px 200/10px; &-ok { color: green; } &-no { color: yellow; } > li{ &:extend(.aa); &:hover { color: #fff; } }}
編譯后為:
.aa,.title > li { font-weight: bold;}.title { font-size: 40px; color: #ccc; margin: 50px 20px;}.title-ok { color: green;}.title-no { color: yellow;}.title > li:hover { color: #fff;}
這里只寫了一點點,功能還有很多的
less官網(wǎng)(https://less.bootcss.com/features/)
sass官網(wǎng)(https://www.sass.hk/)
webpack:壓縮代碼、圖片,合并JS,檢測文件更新等自動進行
webstorm自帶取色器(其他IDE應該都有,自行找下)
寫顏色色值的地方可以點擊調出取色板(不限于css),可以選顏色也可以利用吸管取色(屏幕任意處 不限于IDE內部),也有取色的網(wǎng)站可以收藏到書簽工具文件夾里
Mockjs:上面有介紹mockjs,這里不再贅述,由于本人有過手寫假數(shù)據(jù)的悲慘經(jīng)歷,故把mockjs列入可以提高開發(fā)效率行列,因為前后端分離后前后端同時開發(fā),假數(shù)據(jù)已成必須
比如:
let template = { 'anchorList|3-6':[{ 'id|1-100': 1, 'name': '@cname', 'date': '@date(yyyy-MM-dd)', biubiubiu: () => Mock.Random.string('abcdefghijklmnopqrstuvwxyz', 5), 'arr|2-5': [{ 'age|10-20': 0 }] }] } console.log(Mock.mock(template))
輸出:

模塊化、組件化開發(fā):前后端解耦后,前端之間配合也可以解耦,各自負責不同的模塊開發(fā),寫自己的組件,最后通信部分再協(xié)同
2.5性能優(yōu)化
2.5.1 數(shù)據(jù)存取
☆ 盡量使用局部變量
☆ 對象成員的嵌套深度與讀取時間成正比,嵌套過深要進行優(yōu)化
2.5.2 DOM
☆ 盡量減少DOM操作(訪問和修改都算)的次數(shù)
☆ 訪問元素時使用最快的API
☆ 使用事件委托來減少事件處理器的數(shù)量
☆ 減少重繪和重排的次數(shù)
2.5.3 算法和流程
☆ for循環(huán)、while循環(huán)、do-whild循環(huán)比for in 要快
☆ 優(yōu)化循環(huán)體的復雜度
☆ 最小化屬性查找:
for(let i = 0, len = arr.length; i < len; i++){...}
☆ 當條件較少時 使用if-else更易讀,而當條件較多時if-else性能負擔比switch大,易讀性也沒switch好。
☆ 對于if else 概率越大的條件越靠前判斷 比如:
☆ 當計算量很大且重復的時候,用Memoization緩存計算結果
2.5.4 字符串拼接
比較下四中字符串拼接方法的性能:
A:str = str + 'a'+'b'
B:str += 'a' + 'b'
C: arr.join('')
D:str.concat('b','c')
☆ Chrome65上測試的是A優(yōu)于B優(yōu)于C優(yōu)于D
其他瀏覽器不確定
2.5.5 Ajax
☆ 服務端設置HTTP頭信息確保響應會被瀏覽器緩存
☆ 客戶端講獲取的信息存到本地避免再次請求(localstorage sessionstorage cookice)
☆ 設置HTTP頭信息,expiresgaosu告訴瀏覽器緩存多久
☆ 減少HTTP請求,合并css、js、圖片資源文件等或使用MXHR
☆ 通過次要文件用Ajax獲取可縮短頁面加載時間
這里只列了比較重要的一部分,安利一下我之前寫的性能優(yōu)化總結傳送門
2.6模塊化組件化
模塊化:以前由CommonJs、AMD、CMD等實現(xiàn),現(xiàn)在ES6的Module(原生模塊化)完全可以取而代之,靈活、高效是模塊化開發(fā)的好處,對于某個模塊我想輸出就輸出,想引入就引入,輸出引入也只需一個關鍵詞(export/import),而且ES6模塊語法支持暴露常量、單一接口、所有接口、混合暴露、取別名等等靈活高效是毋庸置疑的
配合webpack在構建的時候把資源整合打包壓縮自動處理了一些以前需要手動進行的性能優(yōu)化問題了
組件化:解決復雜業(yè)務的痛點,把復雜的業(yè)務分為很多個組件分開開發(fā)管理以降低開發(fā)難度和維護成本。一個5000行的頁面和十個500行命名規(guī)范的組件哪個開發(fā)、維護簡單?
組件靈活隨加隨用,可復用避免重復開發(fā),可組合使用
2.7前端安全
2.7.1 XSS
XSS是指瀏覽器錯誤的將攻擊者提供的用戶輸入數(shù)據(jù)當做JavaScript腳本給執(zhí)行了
解決辦法:校驗用戶輸入,特殊字符進行轉義
Vue 雙花括號自帶過濾功能
2.7.2 本地存儲數(shù)據(jù)泄露
本地存儲的所有數(shù)據(jù)就都可能被攻擊者的JS腳本讀取到,所以敏感、機密信息都不建議在前端存儲
const常量 let 塊級作用域避免代碼習慣不佳導致的作用域混亂問題