React+redux+react-router+服务端渲染样例展示及疑问请教

#1

说明

不知不觉, 接触react已经一个月了, 真心觉得react很神奇, 也很复杂, 这一个月来, 在社区请教收获了很多 ,利用实习的空余时间, 终于捣鼓出了一个比较完整的 react实例.
react_and_redux_and_router_example

在这个实例中, 使用了 react / redux / react-router / 服务端渲染 等等的一些模块, 欢迎各位clone查看, 也可以star一下, 以后有新的学习心得也会更新上去,希望对大家有帮助 , github中有文件说明
期间参考的资源有
Redux 中文文档
React Router 中文文档
玩转 React 服务器端渲染
等等…

请教

一. 服务端打包

心里一直觉得毛毛的, 服务端到底需不需要webpack打包,应该如何打包.
如果不打包, 服务端渲染就会遇到很多问题 ES6语法(例如 import ) 或者 (jsx) 的某些语句无法实现,
打包了感觉整个文件很大, 很乱, 没有找到合适的教程, 希望有人指点

二. __dirname


感谢react中文社区的 oneapm
(已解决,在webpack配置文件上添加以下配置即可 )

module.exports = {
	node: {
		__filename: true,
		__dirname: true
	}
}

(现在已经正常使用了 ejs 视图模板引擎 和 静态文件 了)


这也是服务端使用webpack 打包遗留的问题, __dirname在服务器很常使用, 例如在 express 中,

app.use('/public',express.static(__dirname + '/public'));

用来设置静态文件路由

app.set('views', path.join(__dirname, 'views'));

用来设置视图模板路径

然而, 利用webpack 打包后,

console.log(__dirname);// 等于'/'  
console.log(__filename);// 等于'/index.js'

这对我造成很大的困扰,无法使用静态文件(css,js),也无法使用视图模板, 最终只能新开一个服务器输送静态文件, 也只能直接输出视图字符串
不知是不是我哪里造成了错误,或者有什么解决方案

三. 文件过大的问题

优化一


(已解决, 原来的配置文件添加了devtool: ‘eval’, 使得所有注释都无法删除,删掉降到了296k)
结果

Time: 6312ms
    Asset    Size  Chunks             Chunk Names
bundle.js  293 kB       0  [emitted]  bundle
    + 257 hidden modules

优化二


使用了 @wyvernnotwebpack_performance, 一篇webpack优化的文章,
利用 DefinePlugin 消除环境监测的代码 if (process.env.NODE_ENV !== ‘production’) 之类的.
在plugins 加上相应配置,如下:

plugins:[
    ...
    new webpack.DefinePlugin({
      'process.env': {
          'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
      }
    })
 ]

然后在执行webpack的时候加上NODE_ENV环境变量

NODE_ENV=production webpack --config webpack.static.config.js

结果

Time: 6738ms
    Asset    Size  Chunks             Chunk Names
bundle.js  276 kB       0  [emitted]  bundle
    + 256 hidden modules

这个时候发现减少了 10多k (一分钱也是肉 -_-)
然而, 还有更加神奇的事
运行webpack 的时候加上–optimize-minimize(就是压缩指令)

NODE_ENV=production webpack --config webpack.static.config.js --optimize-minimize

结果

Time: 9200ms
    Asset    Size  Chunks             Chunk Names
bundle.js  222 kB       0  [emitted]  bundle
    + 252 hidden modules

又节省了50多k, 加起来足足缩小了70k.
虽然明明我的配置里已经有了压缩插件, 却还是需要用 --optimize-minimize来配合DefinePlugin 去压缩, 确实很神奇呢


(原问题)
静态js资源|打包丑化完成后,足足有1M大小,不得了啊, 到底是什么原因: 引入文件过多? webpack配置有问题 ? 有什么解决方案

btw, 希望大家一起进步

1 Like
#2

服务器端打包问题:用 webpack 的 externals 来忽略 node_modules 目录

#3

Hello @zjy01 ,第三个问题可以参考这篇文章

https://github.com/wyvernnot/webpack_performance/tree/master/compress-example

还可以再减少 70 K 左右。

#4

这个有用到,多谢提议

#5

学习了,真的省下了70多k,谢谢告知 :smile:

#6

我也写了一个例子,可以互相参考。


这个项目准备模拟airbnb的效果

#7

非常感谢你的邀请 :yum:

#8

楼主有没有考虑服务端和本地数据同步的问题?

#9

数据同步有考虑过的,react的数据主要是在state上,redux在初始化store的时候,是可以传递state进去的。
一些跨页面需要保持的状态数据,可以保留在url里,登陆信息在session里,这样无论服务器端还是客户端都是可以读取到的,数据保持一致应该是没问题的。
因为没有用react来做到大型项目,所以很多细节可能没考虑到。
大家可以多交流 :grin:

#10

举个购物车例子,本来购物车数据都放在localstorage里,redux在初始化的时候把localstorage的数据取出来传进state里。
如果要在服务端渲染的话,redux在初始化的时候取不到这些数据了,要把这些数据也保存在session里?

#11

我是觉得加入购物车的操作是要保存到数据库,同时放进state里面,
而不是localstorage的,这样子服务端渲染是能够拿下来的