摘要:平凡之路前端發(fā)展了十幾年,現(xiàn)在幾乎到達(dá)頂峰的速度了,近兩年推出的框架層出不窮,早已不是一統(tǒng)江湖了。模板和數(shù)據(jù)分離也好,狀態(tài)和表現(xiàn)分離也好,我越來越體會(huì)到分是為了合這條平凡之路,還會(huì)頻繁的發(fā)展和融合下去。
一直想總結(jié)下自己摸打滾爬的前端經(jīng)歷,3年,從一個(gè)極討厭前端的人,變成一個(gè)吃前端飯碗的人。沒有人帶過我,跌跌撞撞的緩慢前進(jìn),但我很喜歡分享,喜歡一起進(jìn)步,這會(huì)是我以后一直樂意做的事情。
綜述 娃娃學(xué)步w3cschool上的 html / css / javascript / 以及jquery教程,萬事開頭的第一步
小跑上路Say hello to the world!
jquery 輕松玩耍DOM和event
jquery-ui 增強(qiáng)的UI組件
Bootstrap 從此傻瓜式排版就能搞定
Bootstrap 主題模板 and 管理系統(tǒng)模板 快速搭建項(xiàng)目,簡(jiǎn)單,好看
遇上平衡木在小跑上路的過程中,做出來的東西看起來很專業(yè),注意是“看起來”。如果不理解真正的前端技能,那只能是看起來專業(yè),內(nèi)部結(jié)構(gòu)還是亂糟糟的,或者是遇到bug不知道怎么調(diào),東一句西一句,拆了東墻補(bǔ)西墻。這過程就像走在平衡木上,稍不留神就會(huì)摔下去。
首先要了解css的布局原理盒模型
定位模型
有了布局的基本理論后,嘗試去理解Boostrap里的柵格系統(tǒng) row col span2 背后的style
js最重要的三點(diǎn): 閉包、原型、作用域JS中的閉包及使用場(chǎng)合
使用閉包解決循環(huán)引用問題
閉包、原型、作用域 面試整理
關(guān)于js的原型和作用域,我沒專門寫過文章,建議去博客園搜下。如果想要完整的理解js語言機(jī)制,可以去看《Javascript模式》這本書,或者看我整理的讀書筆記
《JavaScript模式》讀書筆記系列
華麗跳躍謝幕只有把平衡木上的技能磨熟練后,我們才能真正的游刃有余,保證不從平衡木上摔下來的前提下,再有余力去設(shè)計(jì)如何華麗的跳躍和謝幕。
組件封裝還沒了解js對(duì)類(或模塊)的封裝前,我們的代碼可能是這樣的
var getData = function(){ // ...... }; function editFunc(){ // ...... }; $(".refresh-btn").on("click", function(){ var data = getData(); var $target = $($(this).attr("data-target")); $target.empty(); for(var i=0; i"); $child.append(" " + data[i]["name"] + " "); // ...... $child.append("編輯 "); $target.append($child); } $target.find(".edit-link").on("click", editFunc); });
一個(gè)點(diǎn)擊就獲取數(shù)據(jù),然后刷新表格的功能。如果一個(gè)頁面中有多個(gè)類似的異步刷新的表格,且每個(gè)表格的字段又各不相同,那么最偷懶的做法就是拷貝大段代碼,然后再調(diào)整
var table1 = new AjaxTable({ el: "#dataTable", dataUrl: "/path/to/action/" }); table1.refresh();
如果代碼變成這樣,那就爽多了,獲取數(shù)據(jù)和刷新表格的過程都封在了AjaxTable中,各個(gè)使用之處只需要傳個(gè)參數(shù)調(diào)用下refresh()即可,減少了大量重復(fù)(相似的)代碼。這就是對(duì)UI組件/功能組件的封裝。
以前為了準(zhǔn)備面試時(shí)的“手撕代碼”,寫過一個(gè)簡(jiǎn)單的輪播組件,不用jquery(面試經(jīng)常不允許使用任何庫)
原生js的Slider組件
還寫過下面一些文章
自己寫的jquery分頁插件
為Highcharts做包裝 (有點(diǎn)類似上面示例中的AjaxTable)
一步步做組件-學(xué)校選擇器(系列) (系列長(zhǎng)文,如何把一段生硬實(shí)現(xiàn)的代碼一步一步封裝和擴(kuò)展成為一個(gè)可配置的UI組件)
模塊化開發(fā)如果要在頁面上引入外部的js庫,最初學(xué)習(xí)的時(shí)候是這樣引入的
由于瀏覽器中js的執(zhí)行(非加載)過程是在單線程中的,而各js文件又會(huì)存在依賴關(guān)系,比如 jquery-ui 依賴 jquery,bootstrap 也依賴 jquery,所以標(biāo)簽的引入得滿足依賴順序。當(dāng)一個(gè)項(xiàng)目越做頁面越多時(shí),這么多頁面中會(huì)存在一堆標(biāo)簽,如果要將某個(gè)js文件升級(jí)版本,或者修改script的依賴關(guān)系時(shí),這就會(huì)成為一個(gè)很繁瑣的工作,特別是分散在項(xiàng)目的各個(gè)文件中時(shí)。
RequireJS就是出來解決這個(gè)問題的(簡(jiǎn)單來說就是用js去管理js),還有SeaJS,它們分別代表著AMD和CMD兩種風(fēng)格,關(guān)于模塊化和兩者的區(qū)別可以看這篇文章。
實(shí)戰(zhàn)案例用RequireJS包裝AjaxChart
前端模塊化開發(fā)demo之攻擊地圖
頁面繼承頁面繼承 這塊跟上面的各種具體的技術(shù)沒太大關(guān)系,頁面繼承主要是用來組織項(xiàng)目文件結(jié)構(gòu)(或頁面結(jié)構(gòu))的一些經(jīng)驗(yàn)規(guī)則。假設(shè)在一個(gè)系統(tǒng)里,每個(gè)頁面都有相同的頭和尾,還有nav,那根據(jù)上面封裝和分離的思想,我們可能會(huì)這樣寫
%{ include header.html }%%{ include footer.html }%%{ include nav.html }%
我們可以把這一段作為一個(gè)base的父頁面,命名為base.html,每個(gè)“具體業(yè)務(wù)”的頁面都繼承自它。
%{ extends "base.html" }% %{ block styles }% %{ endblock }% %{ block content }%具體業(yè)務(wù)...%{ endblock }% %{ block scripts }%
上面相當(dāng)于一個(gè)業(yè)務(wù)頁面,它由sectionA和sectionB兩個(gè)頁面組件組成,sectionA.tpl和sectionB.tpl是html模板。在應(yīng)用層(即業(yè)務(wù))頁面中初始化兩個(gè)js模塊A和B,并且把自身的App變量傳遞給模塊(new Module(App)),可以實(shí)現(xiàn)子模塊與應(yīng)用層頁面的通信,甚至是模塊之間的通信。
這樣把頁面拆成粒度更細(xì)的結(jié)構(gòu),好處是頁面模塊可以復(fù)用,也便于管理,改動(dòng)頁面中的一小塊時(shí)只需在所處的模塊中,縮小改動(dòng)的影響范圍。
還看過一種思想是,把css文件也當(dāng)做資源由requireJS動(dòng)態(tài)加載,這樣上面示例中的include xxx.css都不需要了,頁面模塊的css資源作為該模塊的依賴,寫在js模塊的define的依賴中。
define(["jquery", "sectionA.css"], function($){ // 業(yè)務(wù)模塊... });
這樣把css和js都抽象成“資源”,相當(dāng)于
組件 = 模板 + 資源
一個(gè)頁面整體的模板,相當(dāng)于多個(gè)頁面組件的拼裝而成。更進(jìn)一步,如果能讓頁面組件做到異步渲染的話(即可以由js去解析模板語法和變量,而不是交給web框架),才能真正做到頁面渲染的本質(zhì):
呈現(xiàn)給用戶的頁面 = 頁面模板 (包括組件的模板) + 數(shù)據(jù)
“渲染”就是將帶數(shù)據(jù)變量的頁面模板輸出成標(biāo)準(zhǔn)的html,同步渲染是指在服務(wù)端解析模板并輸出完整html到瀏覽器中,而異步渲染指直接在瀏覽器中通過javascript 根據(jù)傳入的數(shù)據(jù)將模板輸出成標(biāo)準(zhǔn)html。
同一模板如果既能在服務(wù)端同步渲染,又能在瀏覽器端異步渲染的話,我們就不需要關(guān)心“數(shù)據(jù)”是后端框架直接輸出到頁面的,還是ajax動(dòng)態(tài)取來的。對(duì)模板來說,數(shù)據(jù)就是個(gè)“接口”,而 模板 + 數(shù)據(jù) = 渲染。這樣我們作為前端,才能把更多精力放在模板和交互上,不用管數(shù)據(jù)的傳遞方式。
平凡之路前端發(fā)展了十幾年,現(xiàn)在幾乎到達(dá)頂峰的速度了,近兩年推出的框架層出不窮,jquery早已不是一統(tǒng)江湖了。每個(gè)人的精力都有限,不可能一個(gè)個(gè)都學(xué)過來,但是必須承認(rèn),前端是一個(gè)完整的體系(我之前整理的知識(shí)體系),有它獨(dú)特和魅力之處。不僅是框架,還有更多的工程化問題,框架都是為了解決某類相通的問題而生。模板和數(shù)據(jù)分離也好,“狀態(tài)”和“表現(xiàn)”分離也好,我越來越體會(huì)到
“分”是為了“合”
這條平凡之路,還會(huì)“頻繁”的發(fā)展和融合下去。
本文最早發(fā)表在我的個(gè)人博客上,轉(zhuǎn)載請(qǐng)保留出處 http://jsorz.cn/blog/2015/12/twisted-way-to-awesome-fe.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/78614.html
摘要:文件知識(shí)點(diǎn)修飾類不能被基礎(chǔ)修飾方法不能被重寫修改變量常量不允許進(jìn)行實(shí)例化靜態(tài)代碼塊只是加載一次加載核心配置文件失敗圖解說明加載屬性文件新建的根目錄下修改核心配置文件加載屬性文件配置數(shù)據(jù)庫的環(huán)境事務(wù)管理器保證數(shù)據(jù)的完整性 MyBatisUtils.java 文件 /** * 知識(shí)點(diǎn): * final 修飾類 : 不能被基礎(chǔ) * 修飾方法 : 不能被重寫 * 修改變量 : 常量 ...
摘要:回顧上節(jié)課我們完成了的環(huán)境搭建核心配置文件映射文件的執(zhí)行過程如何執(zhí)行定制的語句我們測(cè)試的是死的數(shù)據(jù)那么下面我們使用容器傳遞動(dòng)態(tài)的數(shù)據(jù)添加操作傳遞數(shù)據(jù)專題通過傳遞數(shù)據(jù)映射文件代碼傳遞參數(shù)數(shù)據(jù)的類型或者提供額內(nèi)置類型映射中的獲取對(duì)應(yīng)的值 回顧: 上節(jié)課我們完成了MyBatis的環(huán)境搭建核心配置文件映射文件API的執(zhí)行過程如何執(zhí)行定制的SQL語句 我們測(cè)試的是死的數(shù)據(jù),那么下面我們使用容器傳...
摘要:說在前面的話命名空間暫時(shí)約定持久化類實(shí)體的類名的全路徑一簡(jiǎn)單查詢結(jié)果集處理查詢結(jié)果集處理為類型字段作為中的值映射文件命名空間唯一的不能重復(fù)結(jié)果集處理后變成類型當(dāng)你傳遞的是一個(gè)簡(jiǎn)單的數(shù)據(jù)類型的形參的時(shí)候那么你的值 說在前面的話 : 命名空間暫時(shí)約定-持久化類(實(shí)體Bean)的類名的全路徑 com.shxt.model.Skill 一 簡(jiǎn)單查詢結(jié)果集處理 1.查詢結(jié)果集處理為Map類型 ...
摘要:并且如果使用那么必須要指明值使用簡(jiǎn)單的數(shù)據(jù)類型不好使使用接口代理模式的注解也可以 屬于MyBatis的核心之一,這里面的坑比較多,大家多多看看吧 一 模糊查詢的三種方式介紹 我會(huì)使用resultMap處理結(jié)果集數(shù)據(jù) 1.死數(shù)據(jù)的模糊查詢 映射文件 SELECT * FROM...
閱讀 1253·2023-04-25 18:57
閱讀 2138·2023-04-25 16:28
閱讀 3940·2021-11-24 09:39
閱讀 3638·2021-11-16 11:45
閱讀 1827·2021-10-13 09:40
閱讀 1267·2019-08-30 15:52
閱讀 1723·2019-08-30 10:57
閱讀 663·2019-08-29 16:55