探索React源码的全局模块系统
也可以在这里看:https://leozdgao.me/react-global-module-system/ 扫了几眼react的源代码(0.14-stable分支),发现一个有趣的现象,比如如下这段代码: var ReactDOM = require('ReactDOM'); var ReactDOMServer = require('ReactDOMServer'); var ReactIsomorphic = require('ReactIsomorphic'); var assign = require('Object.assign'); var deprecated = require('deprecated'); 熟悉 node.js 的 CommonJS 模块系统的话,我们知道有如下3种情况:
根据以上规则,例子中的代码显然属于第三种情况,然而实际上 引用 google groups 上一个回答,这是它们的 全局模块系统。出于好奇,决定探索一番,看看这是如何实现的。 工作流首先的一点是,由于它的模块依赖方式和我们熟悉的方式并不吻合,所以我们需要探索这个部分的工作流,看这个全局模块系统是如何融入整个开发过程中的。 从源代码里知道到了这部分任务,是定义在
也就是说,本来这样的目录: - src - lib - ReactElement.js - ReactDOM.js - index.js 变成了这样: - build - index.js - ReactElement.js - ReactDOM.js 如果 正是有这样的一个步骤,让这个全局模块系统得以工作,再思考下其中的细节,这个编译过程需要做哪些东西:
好的,顺着这个思路在来看看代码,我们发现主要是 在
而fbjs这个项目在编译的时候会生成一个 从 * @providesModule areEqual 并且有一个 require('areEqual') 则会被编译成: require('fbjs/lib/areEqual') 不过奇怪的是,在React的源代码中也可以发现 require('ReactElement') 直接变成: require('./ReactElement') 我也尝试修改 React 源代码中的 很清楚了,开始的时候也说过了,那个负责编译源代码的 gulp task 中,有扁平化这个源代码的目录结构的任务,那么所有本地模块,也都可以被正确引用到了。 Commoner我还发现一个工具,就是这个 Commoner 了,它可以编译你的代码,解析你注释中的 一些思考大致考虑了一下,为什么FB的团队会整出这个所谓的『全局模块系统』,我觉得还是和它巨大的 codebase 是有关的,什么 React、RN、Flow、Relay 等等,那么必然会有一些公共的工具库,而且像 React 一个项目本身的 codebase 也很大了,所以要维护各种相对路径,很吃力,但有利有弊吧: 好处:
缺点:
其实还是挺有意思的,在探索的过程也顺便了解了babel插件的编写,过了元旦要开始新的项目了,准备尝试尝试,把它加进工作流中去。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |