@@ -60,6 +60,7 @@ react-router,react,redux,react-redux,redux-async-connect,redux-thunk等一系列
60
60
}
61
61
}])
62
62
```
63
+
63
64
其中helpers方法来自于其服务端渲染的loadOnServer方法:
64
65
``` js
65
66
loadOnServer ({... renderProps, store, helpers: {client}}).then (() => {
@@ -256,6 +257,8 @@ const BookList = connectPromise({
256
257
257
258
[ react-redux服务端渲染的一个完整例子] ( https://github.com/liangklfang/universal-react-demo )
258
259
260
+ [ React动画之react-transition-group使用] ( https://github.com/liangklfangl/react-animation-demo )
261
+
259
262
#### 3.2 webpack相关
260
263
261
264
[ webpack-dev-server原理分析] ( https://github.com/liangklfangl/webpack-dev-server )
@@ -282,6 +285,8 @@ const BookList = connectPromise({
282
285
283
286
[ webpack-dev-middleware原理分析] ( https://github.com/liangklfang/webpack-dev-middleware )
284
287
288
+ [ atool-build打包工具分析] ( https://github.com/liangklfangl/atool-build-source )
289
+
285
290
#### 3.3 Babel相关
286
291
287
292
[ Babel编译class继承与源码打包结果分析] ( https://github.com/liangklfangl/babel-compiler-extends )
@@ -322,6 +327,7 @@ const BookList = connectPromise({
322
327
react- router- redux
323
328
react- tap- event - plugin
324
329
react- transform- hmr
330
+ webpack- isomorphic- tools
325
331
redux
326
332
redux- async - connect
327
333
redux- devtools
@@ -335,6 +341,108 @@ const BookList = connectPromise({
335
341
```
336
342
如果你有不懂的地方,也可以通过github上的邮箱联系我。希望我们能够共同进步。同时,我的这些文章也发表到了CSDN上,您可以[ 点击这里查看] ( http://blog.csdn.net/liangklfang )
337
343
344
+ ### 5.你可能会遇到的问题
345
+ #### 5.1 集成webpackcc的问题
346
+ 我们的"React全家桶实例"是使用了webpackcc作为打包工具,该工具集成了很多常见的loader,并保证loader和plugin都只会被添加一次,这样能够有效的减少bug数量,同时该工具对于开发环境和生产环境都有不同的处理,这和我们的平时开发流程非常契合。但是当你和webpack-isomorphic-tools集成起来的时候,你可能会遇到问题。比如对于png/jpg等图片的处理loader,我们的webpackcc已经默认添加进去了,但是为了配合服务端渲染webpack-isomorphic-tools需要通过自己的方式添加:
347
+ ``` js
348
+ assets: {
349
+ // 处理图片
350
+ images: {
351
+ extensions: [
352
+ ' jpeg' ,
353
+ ' jpg' ,
354
+ ' png' ,
355
+ ' gif'
356
+ ],
357
+ // 这里指定了那些文件类型属于我们的images这种类型,如果只有一种文件类型那么可以使用extension配置
358
+ // 这里的images这种类型在webpack配置为regular_expression('images')
359
+ parser: WebpackIsomorphicToolsPlugin .url_loader_parser
360
+ },
361
+ }
362
+ ```
363
+ 这样就产生了重复添加loader的情况,这个问题我[ 在这个文章中已经详细解释了] ( http://blog.csdn.net/liangklfang/article/details/53694994 ) 。这也是为什么我们会在[ webpack/webpack.dev.expand.config.js] ( ./webpack/webpack.dev.expand.config.js ) 文件中做如下处理:
364
+ ``` js
365
+ const program = {
366
+ onlyCf : true ,
367
+ cwd : process .cwd (),
368
+ dev : true ,
369
+ hook : function (webpackConfig ){
370
+ webpackConfig .plugins = webpackConfig .plugins .filter ((plugin )=> {
371
+ return omitPlugins .indexOf (plugin .constructor .name )== - 1
372
+ });
373
+ webpackConfig .module .rules .splice (9 ,1 );
374
+ // 剔除默认png/jpg类loader
375
+ return webpackConfig;
376
+ }
377
+ };
378
+ ```
379
+ #### 5.2 redux-form的新的API
380
+ redux-form在以前的版本中如要实现可以编辑的表格,是通过设置formKey来完成的。但是,最新版本的redux-form已经无法通过formKey来完成该效果。而要[ 使用我们的form来指定] ( http://blog.csdn.net/liangklfang/article/details/53694994 ) ,所以你要写出下面的代码:
381
+ ``` js
382
+ {
383
+ widgets .map ((widget )=>
384
+ editing[widget .id ] ? < WidgetForm form= {widget .id + " " } key= {String (widget .id )} initialValues= {widget}/ > :
385
+ < tr key= {widget .id }>
386
+ < td> {widget .id }< / td>
387
+ < td> {widget .color }< / td>
388
+ < td> {widget .sprocketCount }< / td>
389
+ < td> {widget .owner }< / td>
390
+ < td>
391
+ < button className= " btn btn-primary" onClick= {this .handleEdit (widget)}>
392
+ < i className= " fa fa-pencil" / > 编辑
393
+ < / button>
394
+ < MaterialUiDialog/ >
395
+ < / td>
396
+ < / tr>
397
+ )
398
+ }
399
+ ```
400
+ #### 5.3 React抛出错误
401
+ 在React全家桶开发中一个很常见的问题就是React已经抛出错误,但是Chrome控制台和shell控制台没有任何消息。比如下面遇到的三个问题:
402
+
403
+ (1)处理表单提交的问题
404
+ ``` js
405
+ handleSubmit = (event ) => {
406
+ event .preventDefault ();
407
+ const input = this .refs .username ;
408
+ this .props .login (input .value );
409
+ }
410
+ < form onSubmit= {this .handleSubmit }>
411
+ < input ref= " username" placeholder= " 请输入用户名" / >
412
+ < button className= " submit" onClick= {this .handleSubmit } value= " 登陆" > 登录< / button>
413
+ < / form>
414
+ ```
415
+ 当时将event写成了envnt,里面继续调用的是event.preventDefault,但是并没有抛出任何错误。
416
+
417
+ (2)bindActionCreators问题
418
+ ``` js
419
+ @connect ((state ,{as})=> ({
420
+ counter: state .multireducer [as]
421
+ // 该组件会有自己的as属性作为ownProp,我们根据as来从store中获取到我们需要的数据
422
+ }),(dispatch ,{as})=> {
423
+ return bindActionCreators ({increment},dispatch,as)
424
+ // 这里是告诉我们的bindActionCreators的reducerKey
425
+ })
426
+ ```
427
+ 当时我将bindActionCreators写成了bindActionCreator,但是因为我们调用mapDispatchToProps是异步的,如点击某一个按钮后才会触发,所以抛出错误。但是在shell/chrome控制台都是看不到的。
428
+
429
+ (3)dispatch问题
430
+ ``` js
431
+ export default function fetchRecipes (pageInfo ) {
432
+ return dispatch =>
433
+ api .recipes .index (pageInfo .query ).then (resp => {
434
+ try {
435
+ dispatch ({ type: actionTypes .CONNECTED });
436
+ }catch (e){
437
+ console .log (" fetchRecipes===" ,e);
438
+ // 报错信息state.set is not a function
439
+ }
440
+ console .log (" fetchRecipes,resp" ,resp);
441
+ return resp
442
+ })
443
+ }
444
+ ```
445
+ 在分页组件中我们依然是dispatch一个action,但是实际上已经报错,却没有打印任何报错信息。但是通过try..catch确实是可以看到的。对于这类问题,我目前还没有找到合适的方法解决,后续会关注这部分内容并及时更新。。。
338
446
339
- ### 5 .结语
340
- 该项目还有些功能在开发过程中,如果您有什么需求,欢迎您给我issue。我希望能够通过这个项目对React初学者,或者Babel/webpack初学者都有一定的帮助。我再此再强调一下 ,在我写的这些文章末尾都附加了很多参考文献,而这些参考文献的作用对我的帮助真的很大,在此表示感谢!!!!!
447
+ ### 6 .结语
448
+ 该项目还有些功能在开发过程中,如果您有什么需求,欢迎您给我issue。我希望能够通过这个项目对React初学者,或者Babel/webpack初学者都有一定的帮助。我在此再强调一下 ,在我写的这些文章末尾都附加了很多参考文献,而这些参考文献的作用对我的帮助真的很大,在此表示感谢!!!!!
0 commit comments