数据分析平台-前端实践(三)
本章讲解项目目录结构的搭建,路由模式选择和代码分割
目录结构
目前前端项目结构的划分如图
由于项目并非十分庞大,因此按照功能划分。(涉及Redux
的文章会后期写)
1 | | -- api # 后台接口 |
目前开发保证几个原则:
- 页面开发。目前项目页面并不算多,仅有接近二十个页面。在
containers
文件夹中前期区分好容器组件及展示组件。当写到一定程度,拆分出项目的公共组件,放入components
文件夹中。 - 状态管理。在
Redux
文件夹中,直接对应了每个container
。在store.js
中使用combineReducers
整合所有页面的reducer
。其后每个页面引用其的action
就可以了,对于所有的数据处理,全在action.js
中进行。 - 路由管理。由于使用的为
React Router 4
,其不推荐集中路由,组件在哪里匹配就在哪里渲染。因此只定义了一个项目一级路由。
然而由于前期未对项目的复杂度进行合理估计。这套目录结构随着业务发展,已经渐渐有些不够合理。后期项目对于目录结构需要进行重构,不以功能划分,需混合,以业务划分。
建立modules
目录,按照业务指定其的container
,component
,router
,service
等。且遵从就近依赖,将action
,reducer
置于对应的container
中。
路由模式
页面为单页面应用,因此所有路由是由前端控制。路由使用的是React Router
,有两种路由可以选择:hashHistory
以及browserHistory
。
hashHistory
是根据#
后的路径进行处理,而browserHistory
则是我们同常情况下的页面访问路径。如使用hashHistory
,路径为www.abc.com/#/helloWorld
,browserHistory
为www.abc.com/helloWorld
。
一般下,两种模式都可以,但是由于个人十分介意多了个#
符号,因此选用browserHistory
。使用browserHistory
需要后端进行配合,因为如果后台没有进行正确配置,如果直接访问www.abc.com/helloWorld
会像后台发起请求,返回404。
配置例子在Vue Router中有几个例子。而该项目,后台在开发环境下使用Tomcat
,需要修改web.xml
文件。
1 | ... |
代码分割
代码分割是webpack
最引人注目的功能之一,它可以让我们实现代码的按需加载。其最多的使用情况是基于路由的分割。使用import()
语法可实现动态加载js,实现代码按需加载。import()
返回的为Promise
,我们定义一个高阶组件。
1 | function asyncComponent(importComponent) { |
实现按需加载
1 | const Hello = asyncComponent(() => import('../Hello')); |
当访问/hello
时,打开network
,可看到动态加载了一个javascript
文件。若对其原理感兴趣,可看这篇文章,其最根本的原理就是动态添加script
标签。