Skip to content

10-分析源码学架构

第十课 分析源码学架构

统计信息:字数 4671 阅读10分钟

https://study.163.com/course/courselive/1280302025.htm

如何看源码?分析 jquery 框架 express 框架(两个架构不同)

怎样看源码

不要一句一句看源码

先看架构+再找入口+按照流程读下去,看架构关键的部分

可以先缩放函数内部的细节(把函数内部折叠)

jquery 把 $ 挂载到window上面,window 入口函数,然后一步一步找(流程)

源码的特征

程序健壮性:一个函数前面是变量定义,条件判断(开始部分函数健壮性处理,if判断),后面的是函数后面的执行部分。

健壮性类似于容错性(方法错误使用下,不至于中断整个操作),有可能出错了,但是找不到问题出在哪里。

解决方法:判断参数的类型(typeof),否则抛出错误(异常)或者 try-catch 操作(后端文件操作,服务持久性)

try {
  fs.readFile();
} catch(e) {
  console.log(e);
}

模块化:模块调用模块。

模块化规范:amd cmd require import commonJS 的规范;不同的模块规范

典型架构

1、工厂模式

工厂模式:jquery zepto

新建一个工厂方法,使用者告诉工厂需要什么,工厂就提供给你要的对象

window.$ = function() {
  return new jquery.fn.init();
  // 这里没有直接返回 jquery 避免循环调用死循环
  // JS 如何查找变量?作用域从内到外查找(如果直接给出window,那么不需要一层一层查找变量,这是性能问题)
}

暴露在window上面的是一个工厂,需要什么产品,那么从工厂中返回对应的实例;jquery

直接使用 $ 然后 源码中实现 new jquery.fn...

$ 好处

例子:jquery 源码分析

复杂功能分成多个模块,不同模块调用;

Extend 方法:不同参数情况不同,一个参数和两个参数的区别

共享公共变量模式(类似的结构中,可以把公共变量提出来)享元模式

连等思想(一个方法绑定到不同对象上,那么不同对象可以调用这个方法)

2、建造者模式

express VUE 2.0

new VUE() 直接创建实例

express 框架:建造者模式

node 框架(类似的还有webpack)main.js

Require 就是入口

function createApplication() {
  var app = function(req, res, next) {
    app.handle(req, res, next);
  };
  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);

  app.request = Object.create(req, {
    app: {
      configurable: true,
      enumerable: true,
      writable: true,
      value: app,
    }
  });
  app.response = Object.create(res, {
    app: {
      configurable: true,
      enumerable: true,
      writable: true,
      value: app,
    }
  });
  app.init();
  return app;
}

工厂模式和建造者模式对立:工厂模式需要多次获取对象(需要快速获取);建造者模式需要获取少数复杂的对象(需要传多个参数);都是创建者模式。$ 频繁使用,那么使用工厂型。VUE 是单页面,那么使用创建者。

例如:如果大量的相同的简单的弹窗,工厂模式;轮播图,那么需要传参,很少,所以使用建造者模式。

多人写不同的模块;写好后混合进来(注入 mixin)建造者概念

如果直接在原型上写,会造成原型注入漏洞;

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.Vue = factory());
}(this, function() {
  'use strict';
  var emptyObject = Object.freeze({});
  function isUndef(v) {
    return v === undefined || v === null
  }
  ...
}));

3、函数式

函数式:VUE3.0 lodash 很多 function

函数式优点:

  1. 组合大于继承:如果C继承于A和B的特性,继承比较麻烦;函数式直接调用方法(C调用AB的方法)
  2. tree-shaking(摇树):我们引用2000个方法,但是我们只用了一个1个方法。使用webpack打包时候,那么可能打包2000个。最好是把1999个功能去掉,webpack 会按需加载(打包)tree-shaking 是基于 export 的文档流。jquery 会把全部的内容打包(内部的方法不能去掉)函数式可以输出很多小 exports 那么可以支持 tree-shaking 不需要的部分。很多 exports 的文档流。工厂模式和建造者模式无法生效。

例子:lodash是单独的函数

express 架构:把业务规划成不同的模块;不同的模块的通信关系(沟通组合,互相调用);


Last update: November 9, 2024