OkCu188bet金宝搏官网pid如何组织它的多页React应用程序

通过莫利志

在撰写本博文章时,我注意到我没有看到许多关于其他大型应用程序如何组织文件的文章。也许这个问题是明显的,不重要的或平凡的,但那些是我们最不想重新发明解决方案的问题的类型。在制表符和空格后,目录结构必须是下一个最大的区域毕尼克斯德.(以及什么是自行车的自行车棚,但自行车的目录结构?)

所以这是我们建造的自行车棚。我们认为我们发现了一个文件结构任何大小项目的尺度,是容易思考的,使重用代码直截了当

在我们开始之前,我们必须解释一下Javascript是如何在我们的网站上工作的。

JavaScript如何在OKCupid上工作188bet金宝搏官网

188bet金宝搏官网Okcupid的桌面和移动站点是多页应用:您加载的每个页面的HTML是生成的服务器端,当您加载新页面时,您可以要求我们的服务器生成下一页。

不,您没有意外地偶然偶然偶然地偶然地偶然地将整个网站重写为单页应用程序至少将我们承诺一年,我们必须沿途对抗未错过的边缘案例和新虫子。相反,我们选择升级网站功能逐个功能,这是尤其擅长的作品。(顺便提及,这为我们提供了在图书馆发生海洋变化时适应的房间,就像回流支持达到冗余时一样。)

无论如何,这就是我们的多页应用程序(或者,当我们称之为,网站)的工作原理。在OKCupid上加载页面时,您将下载三块Jav188bet金宝搏官网aScript:

< script src = " / / includes.okccdn.com/flat/synced/desktop/js/vendor.min.js ? v = 1 a7a5f9563d3f27 " > < /脚本>
< script src = " / / includes.okccdn.com/flat/synced/desktop/js/common.min.js ? v = e31eca8c4a82ec6 " > < /脚本>
< script src = " / / includes.okccdn.com/flat/synced/desktop/js/home.min.js ? v = 72 b30a0fad24251“异步> < /脚本>

包括很少变化的库——React、jQuery、Moment等。包含每个页面上显示的功能,但可以在主动开发下经常更改。包含只显示在主页上的功能。匹配搜索页面加载,注册加载...你知道怎么命名的。

我们生成,以及使用Webpack的各个页面入口点。源文件在它们自己的Git存储库中,,文件结构大致如下:

├──src
│├──应用
│├──鸭子
│├──页面
│├──捆绑
│└──分享
│├──跑龙套
│└──组件

└──测试

由于“鸭子”必须是该列表中最奇怪的单词,因此让我们从那里开始。

第1部分:鸭子

当Facebook首次推出Flux模式时,OkCupid上的我们立刻感到肩上的重担卸下了。188bet金宝搏官网直到我真正实现它,我才意识到我们需要编辑多少文件来保持重量。您需要为动作名称、动作创建者、商店/还原器等等找到一个家。简单的更改需要更改几个文件。这是疯狂。

鸭子模式可以帮助我们避免整天打开和关闭文件导致重复性劳损。特定特性的动作名称、动作创建者和reducer通常会一起更改,所以将它们组织在同一个文件中是有意义的。

在大多数情况下,一个鸭子文件对应于页面上的一个功能。在Ok188bet金宝搏官网cupid,我们称之为“应用程序”功能。

第2部分:应用程序

188bet金宝搏官网Okcupid的网队团队不到五个人,就像任何好小型团队一样,我们就像地狱一样懒惰。我们要尽可能重复使用东西。这就是为什么我们选择首先做出反应,对吧?

对于简单的组件(用于标记字符串的组件作为可翻译的字符串)重复使用简单:只需包括组件即可。我们存储这些类型的常用复合组件

但考虑一个成分。它需要UI进行浏览,上传和裁剪照片;它跟踪所有算仓数据;当上传成功,失败或取消时,它有时会向OkCupid的其他部分报告。188bet金宝搏官网

包括这一点,因为一个反应部件将快速变得凌乱。这就是为什么我们首先选择了Redux,对吧?

所以当一个功能变得越来越大而复杂时,我们就把它放在了

src /应用程序/ photo_upload /应用程序。jsx src /应用程序/ photo_upload /组件/ UploadButton。jsx src /应用程序/ photo_upload /组件/缩略图。jsx src /应用程序/ photo_upload /组件/状态。jsx src /应用程序/ photo_upload / util / uploadPhotoFile.js

我们尽量保持应用程序的重点,以促进重用和开发人员的健全。另一款想要使用照片上传功能的应用只需要导入即可

不幸的是,“App”是现代软件开发词典中超载最严重的流行语,但我们已经尽可能明确地定义了它。另外,它的字母比“feature”要少。告诉过你我们很懒。

如果反应组件是砖块,那么应用程序就是墙壁。但我们仍然需要一种方法来将这些墙壁结合成一个自行车棚。

第3部分:页面

OKCupid上的每个页面188bet金宝搏官网都应该只加载一个页面特定的JS捆绑,但每个页面也可以使用多个应用程序:我们的注册页面,例如导入, 和.所以Webpack列出的几乎所有入口点都是这样的文件)将指向目录:

注册:“src /页面/注册/ index.js”,

Page然后将这些应用组合到页面上:

从“apps / splash / app”导入飞溅;
从“apps/ Login /App”导入Login;
从“apps / signup / app”导入注册;

const signup =(props)=>(
< div className = "注册" >
<飞溅showSignup ={道具。navigateToSignup} showLogin ={道具。navigateToLogin} / >

{props.showsignup &&
<注册/>

{props.showlogin &&
<登录/ >


);

鸭子,应用程序和页面构成Okcupid的骨架,但在实践中,我们倾向于不经常创建它们(至少,而188bet金宝搏官网不是每天)。另一方面,我们编写文件路径很多

同样重要的:文件路径

没有什么比在React组件的顶部看到这个更糟糕的了:

在“../../shared/components/Modal”中导入Modal;

祝你好运,如果你重新组织你的应用程序(或 - ugh - 你遗漏了)。这就是为什么我们将导入分辨率root设置为原因获得直截了当的绝对路径:

从“shared/util/ClientStats”导入ClientStats;
从"shared/components/Str"中导入Str;

从"apps/onboarding/util/constants"中导入{STEP_TRANSITION_SPEED};

然后,如果你深入了,你不会真的想把这些都打出来:

在"apps/my_app/components/header/Logo"中导入Logo
在"apps/my_app/components/header/Navigation"中导入导航
在"apps/my_app/components/header/Body"中导入Body;

在应用程序中,我们使用相对路径,因为目录结构简单而浅:

import Photos from "./components/Photos";
导入“./components/fedback”的反馈;
导入“./components/instructions”的指示;

import {insertDraggingPhoto} from "./util/helpers";
从“./util/constants”导入{total_photo_counts,error_clear_time};

第4部分:包

我前面提到的文件实际上不是前面定义中的“页面”。但是它们的内容仍然需要定义,Webpack仍然需要为它们创建文件。所以我们把它们组装起来

/ / src /包/供应商/ index.js
从jQuery中导入jQuery;
导入从“反应”反应;
从"react-dom"中导入ReactDOM;
从“moment”中导入moment;
导入_来自“underscore”;

// src / bundles / common / index.js
进口“应用程序/ messages-dropdown /应用程序”;
进口“应用程序/ okmodal /应用程序”;
导入“共享/组件/假击”;
导入“共享/组件/ DisplayAd”;
导入“共享/组件/模态”;
导入“共享/组件/ str”;
导入“共享/组件/ strf”;

然后我们可以使用Webpack的要将这些包含的文件标记为常见,因此其他文件的其他导入不会导致重复的代码。我们的用户下载了更少的代码,网站加载得更快,在他们知道之前,他们在铺设的路径上。

结论

我们的文件结构并不完美,但它做了一些很好的事情。

  • 从最小的组件到最大功能的一切都有一个地方。
  • 当您向网站添加功能时,它将直接推理代码应该去的位置。
  • 重用代码很容易。
  • 导入路径是我们所能做到的最合理的。

另外,我们的文件结构也不会把我们锁定在任何东西上。我之前说过,我们是一个多页面的应用程序,但没有理由每个页面不能包含一个文件,在不同的页面之间路由。事实上,我们的一些页面已经是这样工作的。

希望本文对充满彩虹的文件和目录世界的了解对您有所帮助。如果你想在更深层次上了解更多,188bet金宝搏官网OkCupid正在招聘高级前端工程师.如果没有,请随时给我们发送意见或反馈。感谢你的阅读!

感谢Will O 'Beirne, Michael Geraci, Tom Jacques, Mike Cirello和Kelly Cooper在这篇文章中给予的注意。

最初发表在https://tech.188bet金宝搏官网okcupid.com2017年2月27日。

188bet金宝搏官网OkCupid科技博客

从每天连接数百万人的工程团队阅读故事

188bet金宝搏官网OkCupid科技博客

从每天连接数百万人的工程团队阅读故事

188bet金宝搏官网OkCupid科技博客

从每天连接数百万人的工程团队阅读故事