美文网首页
React 源码中的依赖注入方法

React 源码中的依赖注入方法

作者: 胡一巴 | 来源:发表于2018-11-09 09:25 被阅读0次

一、前言

依赖注入(Dependency Injection)这个概念的兴起已经有很长时间了,把这个概念融入到框架中达到出神入化境地的,非Spring莫属。然而在前端领域,似乎很少会提到这个概念,难道前端的代码就不需要解耦吗?前端的代码就没有依赖了?本文将以 React 的源码为例子,看看它是如何使用依赖注入这一设计模式的。

二、依赖注入的基本概念

在看代码之前,有必要先简单介绍一下依赖注入的基本概念。依赖注入和控制反转(Inversion of Control),这两个词经常一起出现。一句话表述他们之间的关系:依赖注入是控制反转的一种实现方式。另一种方式叫依赖查找(Dependency Lookup)。

在控制不反转的情况下,某个类如果依赖另一个类,它会自己来创建依赖:

class Person {

eat() {

const dinner = new Dinner('法国菜');

console.log('开饭啦!,今晚自己做:', dinner.name);

}

}

class Dinner {

constructor(name) {

this.name = name;

}

}

假设一个人要吃饭,如果控制不反转,就需要自己来做,像上面的代码一样要自己new Dinner。

如果使用控制反转,吃什么就不用自己费脑子了,别人给我做好放到我面前,我直接吃就好!

class Person {

eat(dinner) {

console.log('开饭啦!,今晚有大厨给我做:', dinner.name);

}

}

也就是说,不需要自己来创建依赖的对象了,由外部传入,这就是依赖注入!

三、React 中的依赖注入

众所周知,React 除了可以在浏览器运行外(ReactDOM),也可以制作 App 在手机端运行(ReactNative)。而两者有大量的代码都是可以共享的,这就是依赖注入的使用场景了。

我们来看下具体是如何注入的:

// ReactDOM.js

var ReactDefaultInjection = require('ReactDefaultInjection');

ReactDefaultInjection.inject();

// ReactNative.js

var ReactNativeDefaultInjection = require('ReactNativeDefaultInjection');

ReactNativeDefaultInjection.inject();

注入的位置都在框架代码最开始加载的位置。下面以 ReactDOM 为例子,详细讲解注入的逻辑。

先来看看需要注入的对象都有哪些,定义在 ReactInjection.js 这个文件当中:

var DOMProperty = require('DOMProperty');

var EventPluginHub = require('EventPluginHub');

var EventPluginUtils = require('EventPluginUtils');

var ReactComponentEnvironment = require('ReactComponentEnvironment');

var ReactEmptyComponent = require('ReactEmptyComponent');

var ReactBrowserEventEmitter = require('ReactBrowserEventEmitter');

var ReactHostComponent = require('ReactHostComponent');

var ReactUpdates = require('ReactUpdates');

var ReactInjection = {

Component: ReactComponentEnvironment.injection,

DOMProperty: DOMProperty.injection,

EmptyComponent: ReactEmptyComponent.injection,

EventPluginHub: EventPluginHub.injection,

EventPluginUtils: EventPluginUtils.injection,

EventEmitter: ReactBrowserEventEmitter.injection,

HostComponent: ReactHostComponent.injection,

Updates: ReactUpdates.injection,

};

module.exports = ReactInjection;

这里面每一个 injection 都是一个对象,对象内定义了一个或多个 inject 的方法来注入对应的内容。以ReactUpdates.injection为例子:

// ReactUpdates.js

var ReactUpdatesInjection = {

injectReconcileTransaction: function (ReconcileTransaction) {

...

ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;

},

injectBatchingStrategy: function (_batchingStrategy) {

...

batchingStrategy = _batchingStrategy;

},

};

var ReactUpdates = {

...

injection: ReactUpdatesInjection,

};

可以看到 ReactUpdates 依赖的ReactReconcileTransaction和batchingStrategy就是通过这 2 个方法注入进去的。

有了上面的内容,相当于定义好需要依赖的内容了。下一步就是创建具体的依赖内容,然后注入到需要的地方:

// ReactDefaultInjection.js

var ReactInjection = require('ReactInjection');

var ReactReconcileTransaction = require('ReactReconcileTransaction');

var ReactDefaultBatchingStrategy = require('ReactDefaultBatchingStrategy');

...

function inject() {

...

ReactInjection.Updates.injectReconcileTransaction(

ReactReconcileTransaction

);

ReactInjection.Updates.injectBatchingStrategy(

ReactDefaultBatchingStrategy

);

}

这里的 ReactInjection.Updates 等于 ReactUpdates.injection 这个对象。而 inject 方法,就是在前文的 ReactDOM.js 中调用的方法ReactDefaultInjection.inject()。

上述各个文件整体的调用关系如下:

四、总结

本文介绍了依赖注入的基本概念,并结合 React 的源码讲解具体的使用场景。这样做的主要目的是解耦,可以根据实际的上下文传入不同的依赖对象,优雅的实现了代码的抽象与复用。

文章同步发布: https://www.geek-share.com/detail/2752558290.html

相关文章

  • React 源码中的依赖注入方法

    一、前言 依赖注入(Dependency Injection)这个概念的兴起已经有很长时间了,把这个概念融入到框架...

  • 2018-05-05

    spring源码分析(三) 目录五、Spring 源码解读--5.4、IOC 容器的依赖注入----1、依赖注入发...

  • 依赖注入利器 - Dagger ‡

    概述 在开发过程中,为了实现解耦,我们经常使用依赖注入,常见的依赖注入方式有: 构造方法注入:在构造方法中把依赖作...

  • Java 依赖注入总结

    最近在研读Hive社区版本的源码,发现其中多处用到了Java依赖注入,这里简单总结一下依赖注入的几种实现方法。在谈...

  • Mybatis 执行Sql流程

    前言 对于mybatis之前已经讲了mybatis 中接口注入spring源码分析,mybatis 接口依赖注入源...

  • 模拟mybatis实现接口依赖注入

    一、前言 这一节基于前面两节mybatis 中Mapper注入spring源码分析与mybatis 接口依赖注入源...

  • day07 IoC/Dl

    DI(依赖注入)的两种注入方式 构造器注入(constructor-arg) 该注入方法是在bean标签中实现的 ...

  • spring源码系列-aop源码刨析

    上一篇文章spring源码系列-从@Autowired与@Resource异同中看依赖注入中,我们着重分析了依赖注...

  • ARouter 源码浅析第二篇

    服务管理 依赖注入 通过依赖注入的方式我们可以像上一篇文章中获取跳转参数一样获取服务,具体的实现我们还是通过源码来...

  • [Angular]依赖注入

    JS中的依赖注入,举个荔枝: 1.回调函数的event就是依赖对象2.回调函数有形参就是依赖注入(设置方法或者函数...

网友评论

      本文标题:React 源码中的依赖注入方法

      本文链接:https://www.haomeiwen.com/subject/drjnxqtx.html