app/
kapost/
routes.jsx (holds and rolls up all other app routes dynamically)
reducer.js (holds all reducers dynamically)
studio/
studioEntry.jsx
app/
routes.jsx (rolls up all application routes)
reducers.jsx (rolls up all studio reducers across all the feature folders)
...
...
studio/
app/
comments/
components/
commentsContainer.jsx
specs/
components/ (unit tests of sorts)
integration/ (testing entire comment feature)
commentsContainerSpec.jsx (container could even be the main integration test)
...
...
基于 NPM 的大型 React 单页应用探索(多场景多方案)
本文目标构建基于 NPM 的大型 React 单页应用(以及多页面),支持多模块协同开发、分布式构建与发布。
JavaScript 规划
首先初始化顶层目录结构:
按文件类型组织 File-Type First (FTF)
按功能组织 Feature First (Pods)
可以像这样按功能分组:
那么通用文件如何放置呢?一个方案是将他们放入框架文件夹:
多 App 模式 Multiple Apps
依然有很多通用代码,可以放入通用文件夹:
到目前为止,按功能组织模式仍然可以 hold 住,我们可以在每个 App 使用按文件类型组织模式,但是依然有缺点,仅仅适合单 App 模式。
面对疯狂增长的 routes 或者 reducers,还有一种优雅的方式是使用代码分包(code-splitting),例如动态加载 React Router 和动态增加 Redux reducers,那么我们如何组织这些文件呢?我们可以定义一个顶级文件夹
boot/
,一个项目文件夹例如kapost/
。……
Application Organization
API
同构 Universal Rendering
Domains and Authentication
App Configuration
Assets
Styles
CSS 方案:
构建工具:
本文基于 SASS 实现模块化方案。
Without webpack and inlining
每个项目的样式文件目录:
每个样式文件通过命名空间来实现模块化,根据组件确定前缀:
共享的样式可以放入
shared/
目录,全局样式可以放入类似stylesheets/app/
的目录(使用命名空间)。每个 app 都负责引入所有功能模块的样式文件,顶层 app 负责引入所有子 app 的样式文件。如果分离一些 apps 到分离的代码仓库,可以共享相同的构建流程,只需要维护相同的构建配置。
With webpack and inlining
Why You Shouldn’t Style React Components With JavaScript
Testing
基于 NPM 的协同开发方案
私有 NPM 方案:
NPM 分包:
……
分布式编译
参考: