滚蛋吧!constant 君
作者:Jogis 前言事情经过是这样的,某个阳光明媚的晚上,跟大多数人一样,在MacBook前静静地写着redux/flux“优美”的诗句。剧情急转直下: └── constants ├── comA.js ├── comB.js ├── comC.js ├── comD.js ├── comE.js └── index.js index.js看起来是这样的: import * from './a'; import * from './b'; ... 好像没什么不对劲,然后看了一下a.js和b.js.. //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"; 。。 喵的,不同组件的constant又写重复了。于是开始漫长的改constant之旅:
慢着....
问题由来咳咳,膝盖中箭的有木有,站出来!其实constant这个常量在react界最先被flux框架采用,再后来著名的redux(star数已经超过flux),也采用同样方式定义action与reducer之间的事件分发机制。引入constant,有效解决事件分发时,事件类型的一致性以及清晰逻辑性。 constant的悲惨经历其实一直以来,业界津津乐道的是 constant如此重要的事件结构机制因为可将性太低,往往被大家忽略。其实,细心思考,不难发现,随着项目增大。constants目录将会随着数据处理事件迅速膨胀。大家一直维护着这个事件命名机制,身心疲惫有木有。 constant发展constant由一开始的flux风格,配合facebook插件库export KeyMirror({ ADD_TODO: null,COMPLETE_TODO: null,SET_VISIBILITY_FILTER: null }) 再到小项目维护的constant,非常容易导致重复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的进化类似constant-mirror、flux-constants的库都耐不住寂寞了,站出来声张正义。
react-constant简介就一句话: Fuck Off constants.js 我们再也不需要去维护任何的与constant有关的文件,也不需要到处去找
使用过程相当简单,没有任何多余的代码UsageInstallnpm install react-constant --save Import & InstanceWebpack/Browserify//ES5 version var Constant = require('react-constant').Constant; var constants = Constant('mynamespace'); //ES6 version import { Constant } from 'react-constant'; let constants = Constant('mynamespace'); browser<script src="dist/constant.min.js"></script> Just do itreducer.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 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |