2020-03-09 分析源码学架构--那些源码教我的事

PPT的开始

1

一、如何分析源码:

分析源码

源码能给我们带来什么?
优秀的架构设计思维:

注意框架设计思维,如vue响应式的思维,如何设计,如何模仿搭建架构。

对于所用工具更深的理解

通过阅读源码,对工具理解更深,帮助我们更好的使用工具。

优秀的技巧

通过看源码,学习优秀的技巧,优秀的框架,代码的质量必然很高,掌握别人如何去写的,哪里写得好。

二、源码都有的特性

开始时会出现大量的健壮的处理:if else 的判断,阅读时大部分可以忽略掉。

健壮事例:
//不够健壮的代码
function add(a,b){
    return a+b;
}
function add(a,b){
    if(! typeof a == 'number'){
      a =0;
    }
    return a+b;
}
//健壮性最有效的保证就是在参数层面去判断
健壮性事例:

Node中读取文件,但是文件可能不存在,如果不处理,可能就会报错,Node是服务,那么一定是持久的,如果不加判断,可能这个异常会导致服务的停止。那么我们如何去增强其健壮性?

try{//把容易出问题的代码用 try 包裹起来
  fs.readFile('xxx');
}catch(e){
  console.log(e);
}

其他源码的事例:


多判断
读源码规则:

源码往往是模块调用模块
不要试图一句一句的读源码
先理架构,在看入口,按流程读下去
摒弃其他代码,寻找核心代码

经典框架都是什么样的套路

分别有工厂模式,建造者模式,函数式;

(1)工厂模式 ----> 给一个批量对象的工厂,来帮助你获取对象
应用场景:你的框架,插件,需要大量的产出对象时
举例:jquery
如果每一次使用的话 都用new $()是不是特别繁琐,所以 jquery没有new,而是使用$. 或者$('xxx'). 的形式
举例:弹窗插件
页面中也会经常用到,如果每次都去new PopWindow()也是很繁琐的,最好的使用方式就是通过PopWindow.Show()的方式。

(2)建造者模式 ----> 构造比较复杂,产生的东西不多,一个页面只有一个的情况下
例如:好比建造房子,不可能从头到尾原材料加工,而是钢筋,砖瓦一起拼接到一起的来建造房子的。

举例:

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

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

函数式编程:
loadsh,都是函数式编程。

疑问:为什么VUE3 又变回函数式?
(1)、组合大于继承,
优点:组合扩展性更好,继承的话 还要修改其他父类子类。
缺点:需要再次调用,重复写方法的名字。
!!! 重要:能用组合的不要用继承来解决。

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

(2)、为了使用tree-shaking库
如果这个库有100个方法,但是你只用到2个方法,那么用tree-shaking,他只会帮你把这两个方法打包进去。
但是tree-shaking只会对函数有效,无法对对象进行操作shaking。

(3)、压缩的时候,独立的方法压缩的更简单
如:

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个参数,也可能传两个,如何优化?
    //不规范的写法
    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]
      }
    }

    //规范写法:享元模式的写法:拿出不同的,保留相同的。
    var target = arguments[0]||{};
    var options;
    var i = 1;
    if(arguments.length == 1){
      target = this;
      i--;
    }
    options = arguments[i];//如果只有1个,那么i0,这时候拿的是第一个参数

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

  jquery.fn.extend({
      //CSS 模块会扩展在这里面
  })
  
 jquery.fn.extend({
      //动画模块扩展
  })

//模块化检测的,插件,模块,建议大家都去加入这个判断 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对象的时候,会先从当前层级一步步往外查询,如果发现当前层级有window,那么就可以直接使用,如果没有继续向上一层查找,直到找到最外层window为止。
我们这儿window传进来,则不会去向外查找,解决性能上的优化,减少查找时间。

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(){
    .....
  }  
))

检测当前使用的是什么规范,再使用当前有的规范去初始化

四、Express 部分源码

举例,如果app对象上面有很多方法,应该怎么写最简洁

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

}
app.get = {

}
app.put = {

}
......

//靠谱点的写法 ,用桥接模式
var methods=['put','get','post','delete'];
methods.forEach((method)=>{
  app[method]=function(){
    router[method].call(this);//在通过路由去分发他们要做的事情
  }
})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,179评论 0 3
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,577评论 0 7
  • 1,javascript 基础知识 Array对象 Array对象属性 Arrray对象方法 Date对象 Dat...
    Yuann阅读 901评论 0 1
  • PNG 有PNG8和truecolor PNG PNG8类似GIF颜色上限为256,文件小,支持alpha透明度,...
    hudaren阅读 1,515评论 0 0
  • 今天,我看到了几篇关于蚕宝宝的小学生作文。我看后十分不解,蚕宝宝可爱吗? 里面大量描写蚕宝宝白嘟嘟,肥肥胖胖...
    TT说阅读 1,081评论 0 3