2020-03-09 分析源碼學(xué)架構(gòu)--那些源碼教我的事

PPT的開始

1

一圈膏、如何分析源碼:

分析源碼

源碼能給我們帶來什么践盼?
優(yōu)秀的架構(gòu)設(shè)計思維:

注意框架設(shè)計思維鸦采,如vue響應(yīng)式的思維,如何設(shè)計咕幻,如何模仿搭建架構(gòu)渔伯。

對于所用工具更深的理解

通過閱讀源碼,對工具理解更深肄程,幫助我們更好的使用工具锣吼。

優(yōu)秀的技巧

通過看源碼,學(xué)習(xí)優(yōu)秀的技巧绷耍,優(yōu)秀的框架,代碼的質(zhì)量必然很高鲜侥,掌握別人如何去寫的褂始,哪里寫得好。

二描函、源碼都有的特性

開始時會出現(xiàn)大量的健壯的處理:if else 的判斷崎苗,閱讀時大部分可以忽略掉狐粱。

健壯事例:
//不夠健壯的代碼
function add(a,b){
    return a+b;
}
function add(a,b){
    if(! typeof a == 'number'){
      a =0;
    }
    return a+b;
}
//健壯性最有效的保證就是在參數(shù)層面去判斷
健壯性事例:

Node中讀取文件,但是文件可能不存在胆数,如果不處理肌蜻,可能就會報錯,Node是服務(wù)必尼,那么一定是持久的蒋搜,如果不加判斷,可能這個異常會導(dǎo)致服務(wù)的停止判莉。那么我們?nèi)绾稳ピ鰪?qiáng)其健壯性豆挽?

try{//把容易出問題的代碼用 try 包裹起來
  fs.readFile('xxx');
}catch(e){
  console.log(e);
}

其他源碼的事例:


多判斷
讀源碼規(guī)則:

源碼往往是模塊調(diào)用模塊
不要試圖一句一句的讀源碼
先理架構(gòu),在看入口券盅,按流程讀下去
摒棄其他代碼帮哈,尋找核心代碼

經(jīng)典框架都是什么樣的套路

分別有工廠模式,建造者模式锰镀,函數(shù)式娘侍;

(1)工廠模式 ----> 給一個批量對象的工廠,來幫助你獲取對象
應(yīng)用場景:你的框架泳炉,插件憾筏,需要大量的產(chǎn)出對象時
舉例:jquery
如果每一次使用的話 都用new $()是不是特別繁瑣,所以 jquery沒有new,而是使用$. 或者$('xxx'). 的形式
舉例:彈窗插件
頁面中也會經(jīng)常用到,如果每次都去new PopWindow()也是很繁瑣的胡桃,最好的使用方式就是通過PopWindow.Show()的方式踩叭。

(2)建造者模式 ----> 構(gòu)造比較復(fù)雜,產(chǎn)生的東西不多翠胰,一個頁面只有一個的情況下
例如:好比建造房子容贝,不可能從頭到尾原材料加工,而是鋼筋之景,磚瓦一起拼接到一起的來建造房子的斤富。

舉例:

function banner(){
  this.htmlInit = new htmlInit();
  this.runner = new runner();
} 
function htmlInit(){}
function runner(){}

舉例:
vue 利用的建造者模式

函數(shù)式編程:
loadsh,都是函數(shù)式編程。

疑問:為什么VUE3 又變回函數(shù)式锻狗?
(1)满力、組合大于繼承,
優(yōu)點(diǎn):組合擴(kuò)展性更好,繼承的話 還要修改其他父類子類轻纪。
缺點(diǎn):需要再次調(diào)用油额,重復(fù)寫方法的名字。
?讨恪A仕弧! 重要:能用組合的不要用繼承來解決崇众。

function a(){}
function b(){}
function c(){
  a();
  b();
}

(2)掂僵、為了使用tree-shaking庫
如果這個庫有100個方法航厚,但是你只用到2個方法,那么用tree-shaking锰蓬,他只會幫你把這兩個方法打包進(jìn)去幔睬。
但是tree-shaking只會對函數(shù)有效,無法對對象進(jìn)行操作shaking芹扭。

(3)麻顶、壓縮的時候,獨(dú)立的方法壓縮的更簡單
如:

function add(){}
壓縮成
_a(){}

三冯勉、手寫jQuery澈蚌。

(function(window){
  function jquery(seletor){
    return new jquery.fn.init(seletor);
  }
  jquery.fn.init.prototype=jquery.fn;
  jquery.fn = jquery.prototype={
    init:function(){

    }
  }
  jquery.extend = jquery.fn.extend = function(){
    //前提:這個方法可能會傳1個參數(shù),也可能傳兩個灼狰,如何優(yōu)化宛瞄?
    //不規(guī)范的寫法
    if(arguments.lenght == 1){
      for(var item in arguments[0]){
        this[item] = arguments[0][item]//{a:1}  ==> a = 1
      }
    }else{
       for(var item in arguments[1]){
        arguments[0][item] = arguments[1][item]
      }
    }

    //規(guī)范寫法:享元模式的寫法:拿出不同的,保留相同的交胚。
    var target = arguments[0]||{};
    var options;
    var i = 1;
    if(arguments.length == 1){
      target = this;
      i--;
    }
    options = arguments[i];//如果只有1個份汗,那么i0,這時候拿的是第一個參數(shù)

     for(var name in options){
        target[name] = options[name]
    }
  }

  jquery.fn.extend({
      //CSS 模塊會擴(kuò)展在這里面
  })
  
 jquery.fn.extend({
      //動畫模塊擴(kuò)展
  })

//模塊化檢測的,插件蝴簇,模塊杯活,建議大家都去加入這個判斷 amd ,cmd;
  if(typeof define === "function" && define.amd && define.amd.jQuery) {
      define( "jquery",[],function(){ return jQuery });
  }

  window.jquery = window.$=jquery;
})(window)

疑問:為什么jquery每個方法都需要傳遞window?

答案:是因為減少查找,提高性能熬词,javaScript查找window對象的時候旁钧,會先從當(dāng)前層級一步步往外查詢,如果發(fā)現(xiàn)當(dāng)前層級有window互拾,那么就可以直接使用歪今,如果沒有繼續(xù)向上一層查找,直到找到最外層window為止颜矿。
我們這兒window傳進(jìn)來寄猩,則不會去向外查找,解決性能上的優(yōu)化骑疆,減少查找時間田篇。

vue 源碼初始化的模塊化的判斷
(function (global,factory){
  typeof exports === 'object' && typeof module !== 'undefined' 
          ?
           module.exports = factory()
           :
           type define === 'function' && define.amd 
                ?
                 define(factory) 
                 : 
                 (global = global || self,global.Vue = factory());
}(
  this.,function(){
    .....
  }  
))

檢測當(dāng)前使用的是什么規(guī)范,再使用當(dāng)前有的規(guī)范去初始化

四箍铭、Express 部分源碼

舉例泊柬,如果app對象上面有很多方法,應(yīng)該怎么寫最簡潔

const http = require('http');
var app = module.exports={}
app.handle = function(req,res){
  res.end('hello');
}
//錯誤寫法
app.post = {

}
app.get = {

}
app.put = {

}
......

//靠譜點(diǎn)的寫法 诈火,用橋接模式
var methods=['put','get','post','delete'];
methods.forEach((method)=>{
  app[method]=function(){
    router[method].call(this);//在通過路由去分發(fā)他們要做的事情
  }
})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兽赁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闸氮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件教沾,死亡現(xiàn)場離奇詭異蒲跨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)授翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門或悲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堪唐,你說我怎么就攤上這事巡语。” “怎么了淮菠?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵男公,是天一觀的道長。 經(jīng)常有香客問我合陵,道長枢赔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任拥知,我火速辦了婚禮踏拜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘低剔。我一直安慰自己速梗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布襟齿。 她就那樣靜靜地躺著姻锁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蕊唐。 梳的紋絲不亂的頭發(fā)上屋摔,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音替梨,去河邊找鬼钓试。 笑死,一個胖子當(dāng)著我的面吹牛副瀑,可吹牛的內(nèi)容都是我干的弓熏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼糠睡,長吁一口氣:“原來是場噩夢啊……” “哼挽鞠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤信认,失蹤者是張志新(化名)和其女友劉穎材义,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫁赏,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡其掂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了潦蝇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片款熬。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖攘乒,靈堂內(nèi)的尸體忽然破棺而出贤牛,到底是詐尸還是另有隱情,我是刑警寧澤则酝,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布殉簸,位于F島的核電站,受9級特大地震影響沽讹,放射性物質(zhì)發(fā)生泄漏喂链。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一妥泉、第九天 我趴在偏房一處隱蔽的房頂上張望椭微。 院中可真熱鬧,春花似錦盲链、人聲如沸蝇率。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽本慕。三九已至,卻和暖如春侧漓,著一層夾襖步出監(jiān)牢的瞬間锅尘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工布蔗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藤违,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓纵揍,卻偏偏與公主長得像顿乒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泽谨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,208評論 0 3
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級和職位的變化璧榄,入門級到專家級特漩,廣度和深度都會有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,587評論 0 7
  • 1,javascript 基礎(chǔ)知識 Array對象 Array對象屬性 Arrray對象方法 Date對象 Dat...
    Yuann閱讀 911評論 0 1
  • PNG 有PNG8和truecolor PNG PNG8類似GIF顏色上限為256骨杂,文件小涂身,支持alpha透明度,...
    hudaren閱讀 1,526評論 0 0
  • 今天搓蚪,我看到了幾篇關(guān)于蠶寶寶的小學(xué)生作文访得。我看后十分不解,蠶寶寶可愛嗎陕凹? 里面大量描寫蠶寶寶白嘟嘟,肥肥胖胖...
    TT說閱讀 1,083評論 0 3