话说目前工作所参与的项目前端就是大量用 React 编写的,自己还一直没有去认真学习过,主要原因是我认为 JavaScript 社区出的东西很容易过时,同时手上掌握了一套复杂前端的实现方案 Backbone.js,感觉各类场景都够用了。
某天看到 Rails 的某处文档上有 rails new myapp --webpack=react
的 例子 了,我一看,不行啊,得学学 React 看看了。
同时也可以顺便提前试试 webpacker
于是基于 Ruby China 的 API 做了个简单的应用。
类似的东西,最近已经有好多人发布过了:
反正这些项目最后都会半途而废的
这个项目基本实现了话题列表、查看话题、赞、回帖(比较初级)、查看用户 Profile 等主要功能,还比较粗糙,做下来发现要完成整个 Ruby China 的功能还需要花非常多的时间,同时本以为纯前端渲染可能会提升一些打开的速度,但发现没多大变化(而且目前功能量实现还不多),暂时不会继续搞了。
单纯来说 React 还是挺简单,实现出来的效果(代码质量、效率)也很好,或许下次我新作项目会考虑用它开始。
什么时候 React 的版本会比目前 Ruby China 的速度快?
答:在网络不佳的情况下,React 的版本只需下载 API 的数据内容,而目前版本的 Ruby China 需要下载完整 HTML。
什么时候 React 的版本会比 Ruby China 目前的方式慢?
答:在网络质量好,服务器带宽足的场景下,大多数时候 Ruby China 这种 HTML 结果直接返回 + Turbolinks 的优化,打开的速度是更快的,因为前端几乎是无运算的,本身 Rails 做好了,单个页面 Response Time 在 100ms 左右,剩下的时间都是网络传输了(大篇幅 HTML 代码)。同时 React 应用典型的问题是首次打开慢。
当然以上都得要求 Server Render 的部分要做的足够的好,Turbolinks 这种方式才能有足够快的响应速度。然而,这部分是 Rails 比较弱的,Views 渲染几乎占据了整个 Request 周期的 40% 以上甚至更多(以之前的一些应用的情况来看),而如果 Rails 写成 JSON 的 API,响应时间能缩短许多,并且都不用再像 Views 那样做大量的 Fragment Cache 增加 Views 里面的逻辑复杂度(其实复杂度最后都到前端去了... 结果是一样的)。
以上仅是正对两个 Ruby China 的实现版本多对比...
Webpacker 由于还处于开发阶段,有些小细节还自己补了几刀才顺利搞起来,背后是基于 Webpack。
说真的,长期用惯了 Assets Pipeline 那套机制,我非常不喜欢 Webpack,感觉简简单单的前端代码被它搞得好复杂,我也讨厌 import { XXX } from 'xxx';'
这种显式引用的写法,每个 JS 的文件顶部一对重复代码,严重违反了 DRY 的原则。
这个项目就没用用 react_on_rails 之类的 Gem 了,直接使用 npm 的包,前端是完整前端那套体系。刚开始做准备的时候花了好多时间...
由于水土不服,CoffeeScript 也用不上了,直接用 es2015 的语法写的 (是吧?)
Bootstrap 用了,但 JS 部分没发跑,这也是我不喜欢 React 的原因,以前的各类组建需要用 React 重写的才行。
如果你也想提前了解一下如何使用 Webpacker,以及如何在 Rails 里面编写 React 应用,这个项目或许能给你一些参考。
https://github.com/huacnlee/react-rails-example