做者:Jogis
原文连接:https://github.com/yesvods/Blog/issues/4
转载请注明原文连接以及做者信息html
事情通过是这样的,某个阳光明媚的晚上,跟大多数人同样,在MacBook前静静地写着redux/flux“优美”的诗句。剧情急转直下:react
└── constants ├── comA.js ├── comB.js ├── comC.js ├── comD.js ├── comE.js └── index.js
index.js看起来是这样的:webpack
import * from './a'; import * from './b'; ...
好像没什么不对劲,而后看了一下a.js和b.js..git
//a.js export const OPEN_SIDEBAR = "OPEN_SIDEBAR"; export const CLOSE_SIDEBAR = "CLOSE_SIDEBAR"; export const HIDE_ITEM = "HIDE_ITEM"; //b.js export const TOGGLE_LIST = "TOGGLE_LIST"; export const CHANGE_WIDTH = "CHANGE_WIDTH"; export const HIDE_ITEM = "HIDE_ITEM";
。。
。。。
。。。。github
喵的,不一样组件的constant又写重复了。因而开始漫长的改constant之旅:web
名字改为 COMB_HIDE_ITEM
npm
reducers/comB.js改几个store/reducerredux
actions/comB.js改几个actionreact-router
慢着....
好像comC,comD,comE都有这个constantapp
咳咳,膝盖中箭的有木有,站出来!其实constant这个常量在react界最早被flux框架采用,再后来著名的redux(star数已经超过flux),也采用一样方式定义action与reducer之间的事件分发机制。引入constant,有效解决事件分发时,事件类型的一致性以及清晰逻辑性。
其实一直以来,业界津津乐道的是react的vm
,flux/redux的状态管理机制
,webpack开发技巧以及插件使用
,react-router入门
etc.
constant如此重要的事件结构机制由于可将性过低,每每被你们忽略。其实,细心思考,不难发现,随着项目增大。constants目录将会随着数据处理事件迅速膨胀。你们一直维护着这个事件命名机制,身心疲惫有木有。
export KeyMirror({ ADD_TODO: null, COMPLETE_TODO: null, SET_VISIBILITY_FILTER: null })
export const ADD_TODO = 'ADD_TODO' export const COMPLETE_TODO = 'COMPLETE_TODO' export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER'
引用redux文档的原话:
Types should typically be defined as string constants. Once your app is large enough, you may want to move them into a separate module.
看到刚刚LZ的经历,你们能够发现。其实,constant随着项目增大,独立出来的constants也会致使很是麻烦的维护问题。
相似constant-mirror、flux-constants的库都耐不住寂寞了,站出来声张正义。
可是,这些库其中一个致命共同点:
咱们都依旧须要维护一套constants
不一样组件使用的constants依旧有可能会由于重复致使不可预知的问题
就一句话:
Fuck Off constants.js
咱们不再须要去维护任何的与constant有关的文件,也不须要处处去找constants/comA.js
、reducer/comA.js
、action/comA.js
一个个去改命名。
把全部constant相关文件去掉,react-constant为您打理得层次分明
自定义命名空间的constant,comA的HIDE_ITEM
和comB的HIDE_ITEM
可不同,自家用自家的,互不侵犯。
自动生成伪uuid格式的constant,不用再为生成格式打个null
2kb大小(minified),任何地方的贴心小助手
单元测试,100% coverage
npm install react-constant --save
//ES5 version var Constant = require('react-constant').Constant; var constants = Constant('mynamespace'); //ES6 version import { Constant } from 'react-constant'; let constants = Constant('mynamespace');
<script src="dist/constant.min.js"></script>
reducer.js
function reducer(state, action){ switch(action.type){ case constants.of('ON'): //TODO break; case constants.of('OFF'): //TODO break; default: return state; } }
action.js
function toggleLight(flag){ return { type: constants.ON, flag: flag } }