redux源码解析-redux的架构

redux很小的一个框架,是从flux演变过来的,尽管只有775行,但是它的功能很重要。react要应用于生成环境必须要用flux或者redux,redux是flux的进化产物,优于flux。

而且redux还很小。那么redux是怎么做到单项数据流和一些让人惊奇的特性的呢。我们来看一下他的源码,从而学一些东西。

redux里面都是一个一个的模块,一共9个模块,都导出了一些redux的方法,比如这个9,一个匿名函数,然后导出他写的方法。9里面就这一个方法。英文注释也蛮清楚的,检测类对象的方法。

然后redux开始呢,定义了一个导出模块和缓存模块的方法:

上面这个函数用模块id缓存一个模块,然后每个模块都传入3个参数,module, exports, __webpack_require__,__webpack_require__传入了就可以用了,然后就用这个加载别的模块导出的方法用。就像这样:

需要的方法就这样加载就行。

然后把模块等一些信息和缓存信息都放到这个函数上,返回一个module.exports。

整体架构就是这样的。重点写在模块1-9里面。包含redux的方法。

 (function webpackUniversalModuleDefinition(root, factory) {
  //...
  //这里是判断amd和cmd环境
})(this,function(){
  return (function(modules) {
      function __webpack_require__(moduleId) {} //这是那个加载函数
      //...
    })
    ([function(){
      //..模块0
    },function(){
      //...模块1
    }])
})

开始的webpackUniversalModuleDefinition是这样。

if(typeof exports === ‘object‘ && typeof module === ‘object‘)
        module.exports = factory();
    else if(typeof define === ‘function‘ && define.amd)
        define([], factory);
    else if(typeof exports === ‘object‘)
        exports["Redux"] = factory();
    else
        root["Redux"] = factory();

redux会检测使用环境是amd环境还是cmd环境。实在不行就把方法放到window上。

redux把它所有的匿名函数(里面包含redux的所有方法)都写在一个数组里,就像这样

[function(){},function(){},...]

大家也看到了,每一个函数都是一个模块,比如刚才的模块9,匿名函数,加载就导出自身的方法。

这是0号函数

 function(module, exports, __webpack_require__) {

    ‘use strict‘;

    exports.__esModule = true;
    exports.compose = exports.applyMiddleware = exports.bindActionCreators = exports.combineReducers = exports.createStore = undefined;

    var _createStore = __webpack_require__(2);

    var _createStore2 = _interopRequireDefault(_createStore);

    var _combineReducers = __webpack_require__(7);

    var _combineReducers2 = _interopRequireDefault(_combineReducers);

    var _bindActionCreators = __webpack_require__(6);

    var _bindActionCreators2 = _interopRequireDefault(_bindActionCreators);

    var _applyMiddleware = __webpack_require__(5);

    var _applyMiddleware2 = _interopRequireDefault(_applyMiddleware);

    var _compose = __webpack_require__(1);

    var _compose2 = _interopRequireDefault(_compose);

    var _warning = __webpack_require__(3);

    var _warning2 = _interopRequireDefault(_warning);

    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

    /*
    * This is a dummy function to check if the function name has been altered by minification.
    * If the function has been minified and NODE_ENV !== ‘production‘, warn the user.
    */
    function isCrushed() {}

    if (("development") !== ‘production‘ && typeof isCrushed.name === ‘string‘ && isCrushed.name !== ‘isCrushed‘) {
      (0, _warning2["default"])(‘You are currently using minified code outside of NODE_ENV === \‘production\‘. ‘ + ‘This means that you are running a slower development build of Redux. ‘ + ‘You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ‘ + ‘or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ‘ + ‘to ensure you have the correct code for your production build.‘);
    }

    exports.createStore = _createStore2["default"];
    exports.combineReducers = _combineReducers2["default"];
    exports.bindActionCreators = _bindActionCreators2["default"];
    exports.applyMiddleware = _applyMiddleware2["default"];
    exports.compose = _compose2["default"];

/***/ },

这个0号模块基本没干什么事,就是加载了一些其他模块的重要方法导出,还有个isCrushed方法,在生产环境下,如果函数名缩小或被改变就会发出警告。主要用于压缩的时候。

接下来就是1-9号模块,主要写了redux的各种函数,那下一篇博客再说吧~

时间: 2024-08-25 10:44:57

redux源码解析-redux的架构的相关文章

redux源码解析,函数式编程

提到redux,会想到函数式编程.什么是函数式编程?是一种很奇妙的函数式的编程方法.你会感觉函数式编程这么简单,但是用起来却很方便很神奇. 在<functional javascript>中,作者批评了java那种任何东西都用对象来写程序的方式,提倡了这种函数式编程. 之前看过一些函数式编程的例子(以下简称fp).提到fp会想到underscore和lodash,你会看到lodash的包中,唯一一个文件夹就是fp,里面是fp相关的函数. 在redux中,也是运用了很多fp的函数.其实在写js中

6、redux源码解析 - 中间件源码剖析

//源码使用方法 import {createStore, applyMiddleWare} from 'redux'; //createStore.js的源码 export default function createStore(reducer, preloadState, enhancer) { //... if(typeof enhancer !== 'undefined'){ if(typeof enhancer !== 'function'){ throw new Error('..

Tensorflow源码解析1 -- 内核架构和源码结构

1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android Framework.深度学习也不例外,框架层为上层模型开发提供了强大的多语言接口.稳定的运行时.高效的算子,以及完备的通信层和设备层管理层.因此,各大公司早早的就开始了深度学习框架的研发,以便能占领市场.当前的框架有数十种之多,主流的如下(截止到2018年11月) 显然TensorFlow是独一无

一.jQuery源码解析之总体架构

1 (function (window, undefined) { 2 //构建jQuery对象 3 var document = window.document, 4 navigator = window.navigator, 5 location = window.location; 6 var jQuery = (function () { 7 var jQuery = function (selector, context) { 8 return new jQuery.fn.init(s

4、redux源码解析 - 糅合多种dispatch

在开发时,也许需要更多地包装dispatch以实现更加完善的功能.比如包装 dispatch来打印日志,包装dispatch以支持Promise,各种包装需要密切配合. 之前两篇代码的汇总: //包装dispatch来打印日志 const addLoggingToDispatch = (store) => { const rawDispatch = store.dispatch; if(!console.group){ return rawDispatch; } return (action)

Redux系列x:源码解析

写在前面 redux的源码很简洁,除了applyMiddleware比较绕难以理解外,大部分还是 这里假设读者对redux有一定了解,就不科普redux的概念和API啥的啦,这部分建议直接看官方文档. 此外,源码解析的中文批注版已上传至github,可点击查看.本文相关示例代码,可点击查看. 源码解析概览 将redux下载下来,然后看下他的目录结构. npm install redux 这里我们需要关心的主要是src目录,源码解析需要关心的文件都在这里面了 index.js:redux主文件,主

redux教程之源码解析createStore

redux源码 redux的源码很简单,分为以下几部分 createStore combineReducers applyMiddleware compose bindActionCreators createStore即入口函数生成store,将reducer和middleware关联起来 combineReducers即将分散的reducer最终合并成一个统一的reducer applyMiddleware即将多个中间件一次合并到reducer中,生成一个最终的reducer compose

带着问题看redux源码

前言 作为前端状态管理器,这个比较跨时代的工具库redux有很多实现和思想值得我们思考.在深入源码之前,我们可以相关注下一些常见问题,这样带着问题去看实现,也能更加清晰的了解. 常见问题 大概看了下主要有这么几个: redux三大原则 这个可以直接参考官方文档 redux 的优缺点. 关于优缺点,太主观了大家见仁见智. redux中间件相关,洋葱模型是什么,常见中间件. 背景 有关acton,reducer相关的部分可以看我前面的文章.我们主要关注针对store和中间件相关的部分来解读. sto

Redux源码分析之compose

Redux源码分析之基本概念 Redux源码分析之createStore Redux源码分析之bindActionCreators Redux源码分析之combineReducers Redux源码分析之compose      解读之前先了准备一下基本知识 rest参数  形式为...变量名,用于获取函数的多余参数 ,该变量将多余的参数放入数组中, 只能是参数的最后一个. 扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序