使用webpack的动态模块功能实现类似包扫描来简化配置
来源:互联网 发布:sql添加默认值约束 编辑:程序博客网 时间:2024/05/16 11:38
昨天在浏览几个react项目的源码,发现当项目较大时,会有个很蛋疼的地方:
大型项目会根据模块来分拆reducer,因此会有大量的 <业务包名>/reducer/reducer.js 这样的结构,然后在createStore时又得合并起来。
因此需要写一个类似这样的代码来进行合并:
将我路径下的所有redux目录下的reducer.js的default export全部都变成export导出,然后:
好了,大功告成,再也不用维护rootReducer.js了。
这里只是抛砖引玉,同样的原理,使用webpack动态导出的特性,你还可以对其它的文件进行合并导出,例如actionType,等等,不限于redux。
大型项目会根据模块来分拆reducer,因此会有大量的 <业务包名>/reducer/reducer.js 这样的结构,然后在createStore时又得合并起来。
因此需要写一个类似这样的代码来进行合并:
rootReducer.js
import aTodos from '../../xxxxx/reducers/xxxxxTodos'import bTodos from '../../yyyyy/reducers/yyyyyTodos'import cTodos from '../../zzzzz/reducers/zzzzzTodos'const rootReducer = combineReducers({ aTodos : aTodos , bTodos : bTodos , cTodos : cTodos})随着模块的增加,该文件需要不断修改和调整。即使简化写成
export aTodos from '../../xxxxx/reducers/xxxxxTodos'export bTodos from '../../yyyyy/reducers/yyyyyTodos'export cTodos from '../../zzzzz/reducers/zzzzzTodos'
然后sotre文件去import * as ABC这样引入,也免不了写一些繁琐的格式化代码。
当时先想是不是可以做一些预处理根据格式来生成文件,但是觉得还是比较麻烦,版本管理器里还得保存这些版本。在翻阅webpack资料时,看到动态模块这块突然灵光乍现:是否可以实现自动扫描我的源码结构来动态生成呢?
于是翻阅了一些资料,发现我的想法是可以的,因为:
1)require.context 能够使用正则遍历你的文件结构,这个正是包扫描需要的
2)exports是一个对象结构,也就意味着你可以通过exports[key]=value的形式动态来导出你的export
3)combineReducers需要的是一个对象结构,我只需要通过 import * 导入我的文件,就能够作为一个对象导入
说干就干,于是有了这样的一个文件:
autoRecucers.js
/** * 基于路径扫描的配置模式. * @Author JIM on 2017/2/21. * * 等效语句: * export aaa from './../module/aaa/reducer/reducer' * export bbb from './../module/bbb/reducer/reducer' * export ccc from './../module/ccc/reducer/reducer' * .... */let contexts = require.context("../module", true, /^\.\/.*\/redux\/reducer\.js$/);contexts.keys().forEach((key) => { let name = /\.\/([^/]+)\//g.exec(key); //把包路径名变成导出名 let func = contexts(key).default; if(typeof(func)!="undefined"){ exports[name[1]] = func; }});
将我路径下的所有redux目录下的reducer.js的default export全部都变成export导出,然后:
import * as reducers from './auto/autoReducers';
store = createStore( combineReducers(reducers), applyMiddleware(thunk) );
好了,大功告成,再也不用维护rootReducer.js了。
这里只是抛砖引玉,同样的原理,使用webpack动态导出的特性,你还可以对其它的文件进行合并导出,例如actionType,等等,不限于redux。
0 0
- 使用webpack的动态模块功能实现类似包扫描来简化配置
- Android 使用GridView来实现类似RadioButton的多行单选功能
- Android 使用GridView来实现类似RadioButton的多行单选功能
- 使用 easypermission 来简化代码,实现Android动态权限申请
- 用actionbar tab来实现类似Tabhost的功能
- 动态方法调用和使用通配符实现类似struts1.x的dispatchAction功能
- 使用zxing实现二维码的扫描功能
- 实现类似listView中动态添加Item的功能
- 用继承来简化调用不同子类的类似方法
- Tip15 使用dynamic来简化反射实现
- mysql使用federated_实现类似oracle的dblink的功能
- 实现类似“另存为”的功能
- 使用jquery autocomplete实现类似搜索引擎的自动填充功能
- 可编辑div的使用,实现类似textarea功能
- MUI扫描功能的实现
- Webpack的配置与使用
- 模块打包工具webpack的使用
- 使用criteria来实现动态的查询
- 扯犊子的CPI
- Matlab之repmat和reshape函数
- Appium(7)appium server日志分析
- 删除svn check out的文件
- CF 776E 欧拉函数
- 使用webpack的动态模块功能实现类似包扫描来简化配置
- Altium Designer 10中pin properties选项卡里Electrical Type各选项的意思
- 深圳和广州的培训机构名单(不定期更新)
- openfire4.2 配置fastpath、webchat、spark实现客服系统
- 在idea中利用Spring进行面向切面编程(AOP)的一个例子
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- jQuery 属性
- 三个OpenStack自动化部署工具:Devstack,OSA,Kolla对比
- 微信开放平台开发(3) 移动应用微信登录