日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

How-to-quick-getting-started-for-Frontend

發布時間:2023/12/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 How-to-quick-getting-started-for-Frontend 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一轉眼已一年多不專注前端方面的開發工作,這一年前端方面的技術又是新天地,偶然接到內部團隊邀請我給他們做一個前端的講座,希望能幫助他們快速、且深刻了解前端這個行業以及行業內的知識,這可真有點讓我為難,由于不愛寫PPT,遂成此文。

亂花漸欲迷人眼

2015年前端界可謂熱鬧非凡

  • Google的Angularjs2正式版遲遲未出,牽動著無數前端工程師的心。
  • Facebook的Reactjs像一記猛藥,讓前端工程師High得不能自已。
  • 同時Facebook的ReactNative讓眾多iOS,Android工程師畏懼。
  • Web Components 也要跟前面兩位一爭高下。
  • 國內的Vue.js 這顆新星也是裊裊升起。
  • 微信也在最近強勢推出應用號,種種跡象表明,Web前端,特別是移動端的Web前端開發將迎來另一番天地。

    近幾年前端發展概況

    2015年

  • Ecma國際大會宣布正式批準ECMA-262第6版,即ECMAScript 2015。ECMAScript6對Web開發的影響
  • 隨著HTML5的標準在14年10月由W3C發布為正式推薦標準,15年HTML5的發展也是飛速向前,2015年有80%的App基于HTML5
  • Flash在HTML5的沖擊下,各大廠商和瀏覽器商都陸續聲明不再使用這一技術。參考
  • Nodejs和io.js正式合并。
  • 多年前的JQuery,Extjs,Dojo,Requirejs,Seajs如火如荼,現如今也是不溫不火,技術迭代如此之快,一不小心就迷失了。

    萬變不離其中

    不論這個行業發展有多迷人,新出的技術又是多么的牛逼,三板斧CSS+HTML+Javascript永遠是鐵打的基石,當然隨著行業發展,三板斧本身也是在發展中,所以對前端新技術的追求基本上都是在這三者身上,像如日中天的HTML5,CSS3以及JS語言本身的發展。還有瀏覽器以及Webview這兩個也非常重要,他們就好比后端工程師要熟悉Unix環境一個道理。當然大部分前端工程師在還不需要過多去琢磨這兩者。

    其他的各種吊炸天的技術框架都是淺嘗,嘗多了發現他們要解決的核心問題是

  • 前后端分離
  • Web工程化
  • Web性能
  • 再抽象就是兩個問題

  • 工程化
  • 產品性能
  • 因為前后端分離的目的是為了提升開發效率和維護效率這應該屬于工程的范疇,而引入工程化的概念核心目的就是提升效率,為達目的過程中會去解耦合,減依賴,管理依賴,組件化,即插即用等概念。

    當然這類問題不僅僅是前端,很大程度上后端很多技術做很多工作都是致力于去解決這兩類問題。

    所以當你對這三板斧非常熟悉的時候,就能很好的去駕馭前端的亂花漸欲迷人眼,否則就是空談。

    桃園三結義

    大哥HTML:網頁的骨架
    二哥CSS:網頁多彩的源泉
    三弟Javascript:靈魂,沒有他只是一副空皮囊

    下面就簡單的來介紹這三個好兄弟

    大哥HTML

    超文本標記語言(英文:HyperText Markup Language,HTML)是為“網頁創建和其它可在網頁瀏覽器中看到的信息”設計的一種標記語言。HTML被用來結構化信息——例如標題、段落和列表等等,也可用來在一定程度上描述文檔的外觀和語義。1982年由蒂姆·伯納斯-李創建,由IETF用簡化的SGML(標準通用標記語言)語法進行進一步發展的HTML,后來成為國際標準,由萬維網聯盟(W3C)維護。

    1980年起源于一個物理學家的項目,當時只有少量的標簽,直到1993年的時候還是大學生馬克·安德森在他的Mosaic瀏覽器加入<img>標記,至此HTML添加了越來越多的標簽。更加豐富起來。

    維基百科-HTML

    HTML到底是什么

    HTML就是標記語言,換句話說就是 普通 文本,只不過 瀏覽器 賦予了它神奇力量。

    就像Markdown一樣,也是標記語言,他會被Markdown編輯器賦予優美的樣式,同時在特定網頁或者編輯器上打開的時候展示出來而已。

    瀏覽器如何解析HTML

    當我們在瀏覽器地址欄輸入網址按下Enter時候,瀏覽器會發出一個HTTP請求,然后DNS解析找到對應的服務器IP地址,等一系列過程,最終這個請求會響應帶有標記語言的文檔,可能是.html后綴,也可能是其他,反正在Respoonse的頭部會是content-type:text/html; charset=UTF-8

    這個過程還可以很細化,也有很多策略。感興趣戳這里

    然后瀏覽器會解析該特定文本內的內容,第一句話是類似<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">這句話是告訴瀏覽器該文檔使用的HTML是哪個版本,瀏覽器會用對應的方式來渲染,這就是過去IE等瀏覽器會有諸如

  • 標準模式
  • 怪異模式
  • 準標準模式
  • 現代瀏覽器都采用HTML5的標準頭部<!DOCTYPE html><html lang="zh">就這一步省去了好多瀏覽器兼容的麻煩。當然了,互聯網產品目前Web前端在PC端的兼容性少很多了,我們可以很大膽的說不兼容IE8及以下,傳統的企業Web產品就不評論,很多還在支持陳舊的IE6等,這類不與時俱進的暫不討論。

    然后遇到script標簽會再次發起HTTP下載對應的Javascript,遇到link會再次發起http請求css文件,最終將這三者水乳交融的產物呈現給大家就是非常nice的頁面。

    這個過程可能涉及到瀏覽器重繪和重新渲染。感興趣戳這里

    HTML核心

    HTML核心就是各類TAG俗稱標簽或者元素,HTML5的標簽總覽

    分類標簽
    文檔類型宣告<!DOCTYPE html>
    根元素元素html
    META元素head、 title、base、link、meta、style
    部件元素body、section、nav、article、aside、h1、 h2、 h3、h4、 h5、 h6、hgroup、header、footer、address
    分組內容元素p、hr、br、pre、blockquote、ol、ul、li、dl、dt、dd、figure、figcaption、div
    文本層次語義元素a、em、strong、small、cite、q、dfn、abbr、time、code、var、samp、kbd、sub、sups、i、b、mark、ruby、rt、rp、bdo、span
    編輯元素ins、del
    嵌入內容元素img、iframe、embed、object、param、video、audio、source、canvas、map、area
    表格元素table、caption、colgroup、col、tbody、thread、tfoot、tr、td、th
    表單元素form、fieldset、legend、label、button、select、datalist、optgroup、option、textarea、keygen、output、progress、meter
    互動元素details、summary、command、menu
    腳本元素script、noscript

    參考文章

    HTML很多新的標簽以及標簽屬性比如audio,vedio,nav,footer等元素都能極大的加快開發效率。
    參考文章

    HTML展現分類

    HTML元素按照展現分為塊元素(block element)和內聯元素(inline element)也叫行內元素。當然還有inline-block

    塊級元素

    一般是其他元素的容器,能容納其他塊元素和行內元素,塊元素好比個四方塊,里邊用來放其他元素,默認情況下

    主要特點

  • 獨占瀏覽器一行
  • 總是在新行上開始
  • 高度、行高以及內外邊距都是可控制的。
  • 寬度默認100%,除非設定寬度。
  • 它可以容納內聯元素和其他塊元素
  • 常見的塊級元素有

  • div
  • p
  • h1~h6
  • hr
  • form
  • 行內元素

    一般都是基于語義級(semantic)的基本元素。內聯元素只能容納文本或者其他內聯元素,常見內聯元素有a和span。

    主要特點

  • 和其他元素都在一行上
  • 高,行高及外邊距和內邊距不可改變
  • 寬度就是它的文字或圖片的寬度,不可改變
  • 內聯元素只能容納文本或者其他內聯元素
  • 元素類型可以通過display屬性指定。

    inline-block

    inline-block 的元素既具有 block 元素可以設置寬高的特性,同時又具有 inline 元素默認不換行的特性。當然不僅僅是這些特性,比如 inline-block 元素也可以設置 vertical-align 屬性。

    簡而言之:inline-block 后的元素就是一個格式化為行內元素的塊容器( Block container )

    inline-block前世今生

    文檔流和浮動

    瀏覽器窗體自上而下分成一行行每行按照從左到右的順序排放,這就是文檔流的排列形式。

  • 如果不對元素做任何定位相關的樣式,非浮動塊級元素會按照從上而下,行內元素從左到右排列,很顯然我們需要去改變它們,這就需要利用浮動或者定位
  • 浮動塊級元素則按規定浮在行的一端。 若當前行容不下, 則另起新行再浮動。
  • 內聯元素也不會獨占一行。 幾乎所有元素(包括塊級,內聯和列表元素)均可生成子行, 用于擺放子元素。
  • 有三種情況將使得元素脫離文檔流而存在

  • 浮動(IE中浮動元素也存在于文檔流)
  • 絕對定位
  • 固定定位。
  • 浮動元素不占任何正常文檔流空間,而浮動元素的定位還是基于正常的文檔流,然后從文檔流中抽出并盡可能遠的移動至左側或者右側。文字內容會圍繞在浮動元素周圍。當一個元素從正常文檔流中抽出后,仍然在文檔流中的其他元素將忽略該元素并填補他原先的空間。

    基于文檔流,有以下定位模式

  • 相對定位,即相對于元素在文檔流中位置進行偏移,但保留原占位。
  • 絕對定位,即完全脫離文檔流,相對于position屬性非static值的最近父級元素進行偏移。
  • 固定定位,即完全脫離文檔流,相對于視區進行偏移。
  • HTML和CSS以及Javascript的關系

    HTML就是web頁面的骨架結構,CSS層級表賦予其多彩的樣式,Javascript賦予其豐富行為能力,讓其能動起來。

    二哥CSS

    CSS是什么

    層疊樣式表(英語:Cascading Style Sheets,簡寫CSS),又稱串樣式列表、級聯樣式表、串接樣式表、層疊樣式表、階層式樣式表,一種用來為結構化文檔(如HTML文檔或XML應用)添加樣式(字體、間距和顏色等)的計算機語言,由W3C定義和維護。目前最新版本是CSS2.1,為W3C的推薦標準。CSS3現在已被大部分現代瀏覽器支持,而下一版的CSS4仍在開發過程中

    來自維基百科

    CSS核心

    CSS核心由多組規則組成,每組規則由selector,property,value即選擇器、屬性、值三者組成 如:

    p.tips { // 選擇器font-size: 12px; // property: valuefont-family: sans-serif; }

    這句話的意思就是所有class為tips的p元素,即<p class="tips">Hello</p>,應用字體為sans-serif,字體大小為12px。

    其中class屬性是html元素應用css樣式鏈接屬性。

    selector

    CSS的選擇器類型非常多,共分為以下幾類

    基本選擇器
  • ID選擇器
  • 類選擇器
  • 元素類型選擇器
  • 萬用選擇器
  • 屬性選擇器
  • 其中屬性選擇器又有

    代碼備注
    [attribute]元素有attribute的屬性
    [attribute="value"]屬性attribute里是value
    [attribute~="value"]屬性attribute里使用空白分開的字符串里其中一個是value
    [attribute|="value"]屬性attribute里是value或者以value-開頭的字符串
    [attribute^="value"]屬性attribute里最前的是value
    [attribute$="value"]屬性attribute里最后的是value
    [attribute*="value"]屬性attribute里有value出現過至少一次

    基本選擇器

    #btnSave {font-size: 14px;color: #ff8a01; } .btnSave {font-size: 14px; } button {font-size: 14px; } * {font-size: 12px; } a[class="button"] {color: #ff8a01; }
    偽元素選擇器

    偽元素可以選擇不在Document結構中的信息。

  • :after或者::after 元素之后[常用]
  • :before或者::before 元素之前[常用]
  • :first-letter 或 ::first-letter[不常用]
  • :first-line 或 ::first-line[不常用]
  • 例如

    p::after { content:" ";background-color:yellow;color:red; }
    偽類選擇器

    虛擬類選擇器指的是為不同的狀態、性質的元素。

    主要有以下幾類

  • :link 超鏈接未被訪問[常用]
  • :visited 超鏈接被訪問過[常用]
  • :hover 鼠標(鼠標)在元素上面[常用]
  • :active 鼠標(鼠標)在元素上按著[常用]
  • :focus 焦點在元素上[常用]
  • :target 元素被URL標記(CSS 3新增的類)[不常用]
  • :lang 向帶有指定lang屬性的元素添加樣式。[不常用]
  • 例如

    a:hover {backgroud-color: #ff8a01; }
    組合選擇器
  • A > B 選擇A下一層的元素B
  • A ~ B 選擇與A同父層的元素B
  • A + B 選擇與A相鄰的元素B(不能被任何元素相隔)
  • A B 包含選擇符
  • 還有常見的逗號, 逗號作用是將多個選擇器應用同一組屬性和值,

    比如

    p, a, span {font-size: 12px; }

    新的CSS3新支持的選擇器可以戳這里

    CSS的選擇器優先級

    當同一元素匹配多個選擇器的時候,那么該元素應該應用哪一個樣式呢?優先級如下

  • 通用選擇器(*)
  • 元素(類型)選擇器
  • 類選擇器
  • 屬性選擇器
  • 偽類
  • ID 選擇器
  • 內聯樣式
  • !important 規則例外
  • 來自MDN

    盒子模型


    區別就在于計算width和height的時候是否加上了padding和border.

    CSS支持的屬性

    CSS支持的屬性很多,包括背景、顏色、字體、定位、動畫等屬性

    詳情參考

    三弟Javascript

    1995年出生的Javascript最初只用在瀏覽器上做簡單的表單驗證,能在客戶端把不符合規范的邏輯去掉,節省網絡請求和用戶等待時間一下子就廣為流行,與此同時微軟推出JScript,當時的管理者希望這門語言跟同年出來的的Java一樣火,所以取名為Javascript,直到今日還真不負所望,幾乎跟Java一樣火,甚至有過之。

    回歸正題

    Javascript到底是什么

    盡管對這門語言我有著比較深入的琢磨,可想了好久還是不知道該如何向未接觸過它的人來介紹它,想了想還是分兩種人盡量來解釋清楚

    • 無編程經驗

    • 腳本語言,可以運行在服務器端和瀏覽器端
    • 能做網頁動畫效果
    • 有編程經驗

    • 類C語言
    • 弱類型
    • 面向對象
    • 無所不能
    Javascript語言特色
    純粹的面向對象

    javascript一切皆對象,哪怕

    console.log(true.toString()); // true console.log("2".length); // 1

    你可以直接創建一個對象

    var obj = {name: "liujiangbei",sayHi: function(name) {console.log("Hello, " + name);} }

    值得一讀

    弱類型
    console.log([] == ![]); // true

    []==![]相當于[]==false(沒有異議了吧因為![]就是false)

    []==false又是怎么轉化的呢,對于Object類型先轉化成基礎類型Number 0
    0==false又將false轉化為Number也是為0

    概括就是

    • 對于基本類型Boolean,Number,String,三者之間做比較時,總是向 Number進行類型轉換,然后再比較;
    • 如果有Object,那么將Object轉化成這三種基本類型(PS:到底轉換成哪一種呢?我猜測會轉化成Number),再進行基本類型比較;
    • 對于null和undefined,只有 x,y分別是它們時才相同,其他都為false。

    對于類型相同那么==操作符就會直接比較值,不會再進行轉換了!
    建議總是使用===而不是用==

    函數作用域
    var testFn = function() {var abc = "abc";if (abc) {var str = "hello";}console.log(str); }testFn();

    運行完輸出hello。

    說明Javascript是函數級作用域名,跟php一樣,而靜態語言如Java,Golang,C,C++都是塊級作用域。

    閉包
    /** 閉包:是指有權訪問另一個函數作用域中的變量的【函數!!!】* 創建閉包的常見方式就是在一個函數內部創建另一個函數(通常是匿名函數)*/function createComparisonFun(propertyName){return function(object1,object2){//這兩行代碼是匿名函數的內部代碼,卻訪問了外部函數中的變量propertyName//即使這個內部函數被返回了,而且是在其他地方被調用了,但它仍然可以訪問變量propertyName//之所以還能訪問這個變量,是因為內部函數的作用域鏈包含外部函數如createComparisonFun()的作用域鏈var value1 = object1[propertyName];var value2 = object2[propertyName];if(value1<value2){return -1;}else if(value1>value2){return 1;}else{return 0;}}; };
    基于prototype繼承

    原型和原型繼承

    多變的上下文對象

    上下文this是初階javascript程序員最容易混淆的地方,總結下來

    # 方法調用模式
    /*** 方法調用Function* 1、當一個function被保存為一個對象的屬性時,我們稱為method* 2、this綁定到該對象*/ var obj = {val: 0,getVal: function() {console.log(this); //{ value: 0, getVal: [Function] },充分體現this指的就是obj這個對象console.log(this.toString()); //[object Object]return this.val;} }; console.log(obj.getVal()); //prototype只能用在類型上!!!不能用于對象上!!!
    # 函數調用模式
    /*** 函數調用模式* 1、當一個函數并非一個對象的屬性時,那么就是當一個函數來調用的* 2、this指向全局對象(大膽猜想這種方案是錯的)* 3、解決此方法的方案就是定義一個變量存儲this對象*/ var add = function(a, b) {console.log(this.toString()); //[object global]全局變量啊return a + b; }; console.log(add(2, 4));
    # 解決函數調用模式中this會指向全局變量的方法
    /*** 解決函數調用模式中this會指向全局變量的方法*/ var obj = {val: 4,getVal: function() {return this.val;} }; obj.double = function() { //方法模式,double是obj對象的方法var that = this; //this指的就是obj對象var helper = function() { //函數模式that.val = that.val * 2;};helper(); }; obj.double(); //方法模式調用double console.log(obj.val); //
    # 構造器調用模式
    /*** 構造器調用模式* 1、如果一個函數前面帶上一個new來調用,那么就是構造器調用模式*/ var Person = function(name) {console.log(this.constructor);this.name = name; }; Person.prototype.getName = function() {return this.name; }; var person = new Person('ALLEN'); console.log(person.getName());
    # apply/call調用模式
    /*** Apply調用模式(apply/call)* 1、apply讓我們構建一個參數數組傳遞給調用函數,也允許我們選擇this的值*/ var func = function() {console.log(Object.prototype.toString.apply(this));console.log(this.value); //this本來指向全局變量,因為是函數調用模式 };var obj1 = {value: 'This is the first object\'s value' }; var obj2 = {value: 'This is the second object\'s value' }; func.apply(obj1); //This is the first object's value func.apply(obj2); //This is the second object's value
    Function也是普通類型

    Javascript中function也是一個普通數據類型,支持

  • 作為參數傳遞給另一個函數。
  • 作為函數的返回值。
  • 參數傳遞方式

    Javascript中參數的傳遞是值傳遞。

    對于基本類型string, boolean, number, undefied, null一眼就看出是安置傳遞

    function test(num) {num += 10;return num; }var num = 10; console.log(num); //10 外部變量并未受到影響 console.log(test(num)); //20

    而對于object, array, function

    var testFn = function(abc) {if (typeof abc === "object") {abc.name = "liujiangbei";abc.age = 26;}}var obj = {name: "liujb",age: 25 }testFn(obj); console.log(obj) // { name: 'liujiangbei', age: 26 }

    乍一看,怎么變了?難道是引用傳遞?請看下邊

    function setName(obj) {obj.name = "James";obj = new Object();obj.name = "Leon" } var person = new Object(); person.name = "Jeremy"; setName(person); console.log(person.name);//James

    以上代碼輸出的是James,如果是按引用傳遞,那么以上代碼輸出的是Leon。實際上,當執行obj.name = James的時候,引用所指向的對象的值已經發生了改變,當在對obj進行覆蓋的時候,obj的值是一個指向局部對象的引用,而這個引用無法對外部的對象產生影響,并且此對象會在函數執行結束之后銷毀。

    通俗地理解,傳遞不是引用,而是引用的副本。

    Javascript最佳實踐

    最佳實踐

    一個好漢三個幫

    HTML是頁面的骨架,CSS賦予頁面姿彩,JS給頁面注入靈魂。但是她們具體是如何協作的呢?比如最常見的功能,點擊加載更多。

    要實現該功能的主要步驟有

  • JS獲取用戶點擊事件
  • 夾雜著動畫效果
  • JS發送http請求到對應的server端
  • JS接收HTTP請求返回的數據(json、txt、xml等格式)
  • 將數據展現
  • 那么問題來了

    JS如何獲取用戶點擊事件?

    用戶點擊的是一個按鈕,翻譯過來就是HTML元素,JS是如何跟HTML他的大哥溝通的呢?這里要接住它們共同的溫床(瀏覽器)提供的一個叫做DOM的東西

    什么是DOM?

    Document Object Model的歷史可以追溯至1990年代后期微軟與Netscape的“瀏覽器大戰”(browser wars),雙方為了在JavaScript與JScript一決生死,于是大規模的賦予瀏覽器強大的功能。微軟在網頁技術上加入了不少專屬事物,既有VBScript、ActiveX、以及微軟自家的DHTML格式等,使不少網頁使用非微軟平臺及瀏覽器無法正常顯示。DOM即是當時蘊釀出來的杰作。

    維基百科

    The Document Object Model (DOM) is a programming interface for HTML, XML and SVG documents. It provides a structured representation of the document (a tree) and it defines a way that the structure can be accessed from programs so that they can change the document structure, style and content. The DOM provides a representation of the document as a structured group of nodes and objects that have properties and methods. Nodes can also have event handlers attached to them, and once that event is triggered the event handlers get executed. Essentially, it connects web pages to scripts or programming languages.

    Document Object Model (DOM)

  • 通俗理解,就是瀏覽器給JS提供了獲取HTML元素的功能,獲取到的DOM元素跟HTML元素能對應起來
  • 再通俗一點,DOM元素就是HTML元素(雖不對,但無妨)
  • HTML DOM定義了所有 HTML元素的對象和屬性,以及訪問它們的方法。
  • DOM節點包括XML DOM、HTML DOM、核心DOM

    DOM樹如下

    DOM具備的屬性和能力

    HTML DOM節點
    HTML DOM方法
    HTML DOM訪問
    HTML DOM Event

    其中左邊菜單的內容都需要看一看!

    JS獲取按鈕并提前給按鈕綁定單擊事件的代碼如下

    var btnLoadMore = document.getElementById("btnLoadMore");btnLoadMore.addEventListen("click", function(e) {// do somethings.. });

    JS通過獲取HTML DOM元素,可以對HTML DOM元素進行屬性的訪問和更改(CSS樣式只是HTML元素的屬性之一),同時還可以對元素本身作各種更改。還可以提前監聽某DOM元素的各類事件,如

  • click
  • dbclick
  • mouseover
  • JS如何發起HTTP請求并處理響應數據?

    傳說中的Ajax

    XMLHttpRequest對象

    XMLHTTP是一組API函數集,可被JavaScript、JScript、VBScript以及其它web瀏覽器內嵌的腳本語言調用,通過HTTP在瀏覽器和web服務器之間收發XML或其它數據。XMLHTTP最大的好處在于可以動態地更新網頁,它無需重新從服務器讀取整個網頁,也不需要安裝額外的插件。該技術被許多網站使用,以實現快速響應的動態網頁應用。例如:Google的Gmail服務、Google Suggest動態查找界面以及Google Map地理信息服務。

    特意查了一下,以前都只知道用這個對象,但是沒有分清這到底是javascript對象還是瀏覽器接口,現在看來很清晰了,這就是一個瀏覽器接口,用于跟后臺交換數據。

    發起請求和處理請求數據

    var xhr = createXHR(); if (!xhr) {return "create XMLHttpRequest failed."; } xhr.open(obj.method, obj.url, true); //true表示異步// 監聽statechange事件 xhr.onreadystatechange = function() {if (xhr.readyState === 4) {if (xhr.status === 200) {obj.succFn(xhr.responseText);} else {obj.failFn(xhr.responseText);}} else if (xhr.readyState === 3) {} else {} };// send request if (obj.method.toUpperCase() === 'GET') {xhr.send(null); } else if (method.toUpperCase() === 'POST') {var body = objToBody(obj.data);xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");xhr.send(body); }

    XMLHttpRequest狀態值

  • 0: 請求未初始化 create
  • 1: 服務器連接已建立 open
  • 2: 請求已接收 send
  • 3: 請求處理中 比如數據比較大,這個時候就可以開始提示用戶
  • 4: 請求已完成,且響應已就緒
  • Ajax入門推薦

    動畫又是如何實現的?

    動畫實現的本質在于不斷的變化元素的屬性,1000ms內變化60次肉眼基本就看不出卡頓,大概一幀16.6s

    基于此前端動畫的實質都是通過

  • Javascript本身或
  • CSS3本身帶的屬性去
  • 更改DOM元素的屬性來達到動畫的目的。當然了還有一些動畫是通過動態的gif圖實現的。

    通過JS去改變按鈕的顏色

    var btnMore = document.getElementById('btnMore'); var colorNum = 0;setInterval(function(){btnMore.style.backgroundColor = "#ff8a0" + colorNum; }, 16);

    這部分代碼只是偽代碼

    或者還可以把setInterval改成setTimeout里邊嵌套setTimeout 兩者區別

    通過CSS3去改變屬性
    div {width: 100px;height: 100px;background: yellow;transition: width 2s;-moz-transition: width 2s; /* Firefox 4 */-webkit-transition: width 2s; /* Safari and Chrome */-o-transition: width 2s; /* Opera */ }div:hover {width: 300px; }

    該樣式就是當鼠標放到div上的時候,在兩秒內寬度增長到300px

    建議使用CSS3的動畫屬性來實現動畫,因為CSS3本身對GPU加速做了很多優化,比原生JS使用最質樸的方式實現效果要佳一些。當然這只是相對而言。

    如果實現的功能要跟瀏覽器交互呢?

    比如做完某某操作之后要關閉瀏覽器或者實現后退功能呢?這個時候又該如何?

    BOM對象隆重登場

    BOM是browser object model的縮寫,簡稱瀏覽器對象模型
    BOM提供了獨立于內容而與瀏覽器窗口進行交互的對象
    由于BOM主要用于管理窗口與窗口之間的通訊,因此其核心對象是window
    BOM由一系列相關的對象構成,并且每個對象都提供了很多方法與屬性
    BOM缺乏標準,JavaScript語法的標準化組織是ECMA,DOM的標準化組織是W3C
    BOM最初是Netscape瀏覽器標準的一部分

    通俗理解就是提供JS訪問瀏覽器對象的能力,跟XMLHttpRequest類似。

    其中

  • frames就是常見的iframe嵌套別的網頁的
  • history有返回上一頁功能
  • location獲得網頁URL
  • navigator訪問者瀏覽器信息
  • screen屏幕相關信息
  • 推薦閱讀

    至此這三者是如何協作的就大概講了一下。

    H5和CSS3

    再來簡單的講講如日中天的HTML5和CSS3。

    CSS3

    CSS3的核心在我的理解中就是提供了

  • 多樣化的css選擇器
  • 支持動畫的能力
  • 說起來雖然容易,但是其實還是很實用,也不是那么容易掌握的。

    HTML5

    HTML5提供的核心功能非常實用,主要有

  • 新的語義化的標簽和屬性并且淘汰過時和冗余的元素和屬性
  • Geolocation
  • localStorage
  • FileApi
  • Canvas
  • 離線存儲Mainfest
  • 本地數據庫
  • 多媒體av
  • XMLHttpRequest2
  • Can-I-use-html5-css3

    Geolocation

    就是網頁定位,通過Geolocation提供的功能,使得H5頁面可以跟Native功能一樣的定位。

    /*** H5定位*/ geo.h5 = function(opt) {if (!opt) return;var timeObj = opt.timeout || {};//H5定位成功回調函數var succ = function(pos) {var d = {lat: pos.coords.latitude,lng: pos.coords.longitude,maptype: opt.maptype || "wgs"};if (isFunc(opt.success)) opt.success(d);};//h5定位失敗回調--失敗包括超時、或者用戶不允許var error = function(err) {var st = "";switch (err.code) {case err.TIMEOUT:st = "timeout";if (isFunc(timeObj.CB)) timeObj.CB(geoFailObj.timeout);break;case err.POSITION_UNAVAILABLE:if (isFunc(opt.error)) opt.error(geoFailObj.position_unavailable);st = "position_unavailable";break;case err.PERMISSION_DENIED:if (isFunc(opt.denied)) opt.denied(geoFailObj.permission_denied);st = 'permission_denied';break;case err.UNKNOWN_ERROR:if (isFunc(opt.error)) opt.error(geoFailObj.unknow_error);st = "unknow_error";break;default:break;};};if (navigator.geolocation) {navigator.geolocation.getCurrentPosition(succ, error, {enableHighAccuracy: true,timeout: timeObj.cnt || 5000,maximumAge: 2000});} };

    公司的webapp第一版就是我做的,當時用的就是H5定位,微信的定位接口開放還在這之后。

    LocalStorage

    LocalStorage經常會使用,說白了就是在本地存儲一些字符串,用于在不同的網頁之間共享數據,相比cookie沒有時間限制,大小限制在每個域4M左右,完全溝通。另外cookies會在每次發出HTTP請求的時候帶在header上,不僅影響性能,嚴重的有些server端會限制cookie的大小。LocalStorage簡直就是救命稻草

    具體使用

    Canvas

    動畫工程師和網頁游戲工程師的救命稻草。能夠通過JS畫出流暢和高清的動畫效果,不再需要去學習陳舊的flash或者還不成熟的webgl

    Avdio和Vedio

    一個在網頁上放視頻一個放音樂,目前市面上吊炸天的H5頁面哪個不得來點音樂和視頻。

    以上幾個H5新功能是實際產品中運用過并且表現良好。

    開發工具

    Sublime text 3

    Sublime text 是一款輕量級的全平臺文本編輯器,突出的功能就是支持海量插件

    官方網站

    Plugins

  • 安裝Package Control Sublime的包管理器[必裝]
  • HTML-CSS-JS Prettify 代碼格式化工具[必裝]
  • Trimmer 移除代碼中的空格[必裝]
  • Emmet html代碼利器,比如在Mac輸入html:5然后按ctrl+E就會出現[必裝]

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Document</title> </head> <body></body> </html>
  • JSLint 靜態JS代碼檢測[必裝]

  • CssLint CSS樣式檢測[必裝]

  • MarkdownEditing Markdown編輯工具

  • MarkdownPreview Markdown文檔預覽工具

  • CSS3 寫CSS3屬性時提示功能

  • DocBlockr 添加XML形式的備注信息

  • 好文推薦

    Sublime快捷鍵

  • Command+D 選詞
  • Command+L 選中一行
  • Command+Shift+P 進入控制中心
  • Command+P 搜索頁面和頁面中的方法
  • 其他編輯器如

  • Atom
  • Webstrom
  • VIM/Emacs流請自行查詢
  • 都是非常優秀的前端編輯器和IDE

    Chrome Devtools

    最強大的網頁調試工具 Chrome Developer Tools,諸君一定要好好琢磨


    同時Chrome還支持移動端調試,有很多模擬器,包括屏幕類型,等。

    調試和調試工具

    Charles

    主界面

    主要設置和注意項目

  • 保證手機和電腦在同一局域網內。
  • 設置Charles的代理端口為8888或者其他都可以。
  • 查看本機IP地址ifconfig en0找到IP地址
  • 在iOS手機的設置界面如

    設置完了之后點左上角的WiFi返回,然后Charles會彈出是否允許你的手機IP訪問的窗口,然后點擊允許,這樣Charles就能抓包了。

    詳細設置參考

    支持的主要功能

  • 抓包 – 看HTTP請求的明細,如果是HTTPS需要導入密鑰也是可以的,自行折騰。
  • DNS反向解析 – 支持從特定域名出發,將請求跳轉到特定IP的機器,Pre上線使用以及當時微信支付使用。
  • 代理本地文件 – 支持某個請求響應到本地文件。
  • Charles是抓包工具,不支持像Chrome那樣子實時選中元素。
  • Fiddler

    Filder設置和Charles有類似的地方,請點這里

    Mac電腦和iPhone手機

  • iPhone手機一部
  • Mac電腦一臺
  • 請看神圖

    設置Safari的Develop屬性可見,然后用USB連接線鏈接iPhone手機,然后在手機上打開你的站點,然后點擊一下Develop->iPhone6->www.baidu.com就會出現Safari的開發者工具面板

    而此時,你的iPhone上的頁面就變成了

    就像你用Chrome瀏覽器調試PC端網頁一樣。

    神器weire

    有人說了我沒有Mac和iPhone怎么辦,不用著急,我已經為你準備好一切,請戳這里

    工程和性能

    洋洋灑灑寫了好大一篇,為了本文能夠首尾呼應,讓我們還是專注到Web最核心的兩個問題上

  • 工程化
  • 產品性能
  • 工程化

    前端開發的工程化要解決的幾個問題

    開發階段前后端分離

    目前國內在前后端協作上主要的幾類方式

    • 前端工程師切好頁面,交給所謂的后端工程師(其實是業務邏輯處理層并非后端服務)然后這些工程師將HTML標簽和樣式要么換成對應的web框架所需要的模版,要么就直接輸出,再結合html中的樣式和js達到想要的效果。

      在整個頁面出來之前需要雙方不停的溝通協作,才能完成。

    • 前后端工程師完全通過resetful接口形式進行對接,前端工程師訪問靜態頁面,然后通過ajax去請求resetful接口解析json,然后展現看起來這種方式前后端分離做得比較干凈,但是這種方式弊端也不少

      會無端增加比較多的請求,本來原來有很多數據可以直接輸出到html頁面上,或者使用模版而現在需要通過http請求后再次處理。

    • 前后端工程師在完成靜態部分開發工作后,將page放到web項目的views下,第一頁數據通過業務邏輯處理層將數據通過模版形式輸出到頁面,而后在頁面中的操作如果有跳頁面的話過程如第一頁,否則都是通過ajax來交互。

      雖然這種方式耦合還是沒完全解開。溝通成本上較第一種少性能上較第二種好,“后端工程師”可以專注寫他們的邏輯,多數交互都是通過resetful接口進行,少部分需要加載模版和頁面的請求另外溝通一下,需要組織哪些數據需要哪些邏輯溝通成本不大,前端工程師也可以focus在前端工作上。性能也不知發起很多無謂的請求。屬于在目前的方式下比較理性的方式。

    • 在第三種的基礎上,將業務邏輯處理成這部分的工作都交給“前端工程師”來做,這部分工程師需要掌握Nodejs開發,HTML5+CSS3+Javascript常規前端開發,可以簡單地理解為全棧工程師,這樣前端(主要是指業務邏輯層面目前的API)可以實現大部分功能,只需要跟真正的后端服務去做通信即可。

      這是最理想的前后端分離方式,目前阿里巴巴有技術團隊在嘗試,溝通成本低,開發統一,都是Javascript為主,唯一的缺陷就是這類人才太少。

    綜合看來,目前第三種方案是比較常規的方案。

    前端分離

    前面講到前后端分離,其實就是在想各種辦法去提升開發效率,而前端本身的一些分離原則則主要是為了后續的維護性著想。

    表現和結構分離

    意思就是不要再html中使用內嵌樣式<div style="backgroud-color: #ff8a01"></div>這是一個bad case,因為這會給后續維護帶來不便,為什么呢?因為假如這是一個很多地方都用到的樣式,那么后續如果相統一變更一些樣式的時候需要單獨找到這一行,而且在html中夾雜css代碼的整體美感也會打折扣。

    行為和表現分離

    盡量不要用Javascript去控制元素的樣式,這會導致用戶在修改的時候,通過樣式表無法找到對應的屬性,這樣的話就需要去人肉review你的Javascript代碼來更改。

    CSS的編程

    傳統的如果頁面有一個統一的桔色按鈕,我們都是通過class來控制,讓所有的地方的button都是用這一種樣式從而來統一控制樣式,每當這個時候你都在想這需要一個變量啊,很遺憾CSS本身并不提供這種編程能力。

    那么

    sass
    less

    邊應運而生了,他讓css代碼的維護性也變成可能。

    Javascript包管理

    傳統的Javascript并沒有包管理的概念,所有的js文件都是放在服務器上某個文件夾,然后通過人肉引入到html之后,所以的依賴其實是認為在維護。

    bower
    npm
    requirejs
    seajs

    等包管理器以及模塊化管理工具都出現了,以及AMD和CMD規范都出來了。

    前端構建

    前端構建的工作主要包括
  • 壓縮代碼
  • css+js+html代碼壓縮
  • 圖片壓縮
  • 字體壓縮
  • 代碼編譯如less,sass之類的或者typescript+coffeescript
  • 合并代碼
  • 環境替換
  • 主流的構建工具
  • gulp
  • grunt
  • fis
  • gulp基于流式的構建工具,構建過程中支持效率快,同時
    grunt老牌的構建工具,
    fis百度fex團隊出品,文檔比較齊全且是中文,國內很多人在使用。

    推薦使用gulp,本人寫的對static項目進行的構建庫static-gulp,配對的還有對web項目進行的views-gulp 這兩個項目目前可用。

    性能

    web產品的性能集中體現在三個方面

  • 網絡開銷方面
  • 瀏覽器渲染DOM
  • 代碼執行效率
  • 傳統前端優化大部分的工作還是集中在網絡開銷上邊,比如 Yahoo 第一條規則就是減少網絡請求。而后起之秀們如Reactjs,Angularjs2,WebComponents等都加入了虛擬DOM的概念,試圖讓Webapp具備媲美原生native應用的體驗。而代碼執行效率方面有大量的最佳實踐,無時無刻不在進行中,但是這個方面除非前人犯錯,否則對一個產品很難一下子明顯優化,另一方面硬件設備在不斷變好。

    大家好才是真的好

    傳統的對web性能優化的點還非常受用,大概分為

    網絡方面
    減少請求個數
  • 代碼合并
  • 圖片sprite
  • 字體合并
  • icon少用圖片,多用矢量圖組合字體
  • 減少請求過程中傳輸的
  • 代碼壓縮
  • 圖片壓縮
  • 字體壓縮
  • 啟用gzip
  • 減少cookie大小
  • 提升響應速度
  • 使用CDN
  • 添加expire
  • 添加Etag
  • Ajax緩存
  • Ajax用GET
  • 請求策略
  • 組件預加載(提前加載)
  • 延遲加載(純粹的懶加載,條件加載)
  • 在網頁全部加在之前,把圖片等資源通過指定src或者backgroud或者
    這兩個策略在做SPA的時候經常用到。

    網絡方面還有諸如避免404,減少DNS查詢,瀏覽器HTTP請求并發限制等

    內容和代碼經驗方面
  • 減少DOM元素數量
  • 樣式表放頁面頂部
  • JS放頁面底部
  • 少用濾鏡和陰影毛玻璃等效果
  • 保證所有組件都小于25K
  • 不要使用html縮放圖片
  • Yahoo
    Webapp優化
    優化篇

    體驗方面
  • 使用touch事件
  • 觸碰區域盡量足夠大
  • 盡量使用CSS3動畫
  • 使用GPU加速
  • 代碼最佳實踐
  • http://coderlmn.github.io/code-standards/
  • https://yuguo.us/weblog/15-best-javascript-practice/
  • https://leohxj.gitbooks.io/front-end-database/content/preference/javascript-best-practise.html
  • 天下武功唯快不破

    yeoman
    看這里看這里

    推薦書籍和框架

  • 《Javascript高級程序設計》值得多次回味的書籍。
  • 《JavaScript語言精粹》
  • 《Javascript DOM編程藝術》
  • 《CSS權威指南(第三版)》
  • HTML暫時就不需要推薦書籍了,跟他最相近的就是DOM編程藝術了,其余的屬性和相關的方法查看網頁即可

    寫在最后

    洋洋灑灑寫了好幾千字,一時間竟不知道該說點啥了,前端是一個涉及面非常廣的工種,不像后端程序環境運行在比較統一的*nix系統,專注到項目本身的工程、性能、可維護等方面即可。而前端不僅僅程序執行環境多樣化,工程、性能同樣是要抓,更多的還要關注交互、展示等體驗甚至要求對美感都有要求。更重要的是前端工程師必須要有一個追求極致的心態,不妥協否則優秀無從談起。

    轉載于:https://www.cnblogs.com/liujb/p/How-to-quick-getting-started-for-Frontend.html

    總結

    以上是生活随笔為你收集整理的How-to-quick-getting-started-for-Frontend的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。