大面积使用 Vue/React 还是适合 SPA,本以为 Rails 后端渲染也没问题的,结果带来了太多不必要的麻烦。
谢谢。Rails 渲染和 SPA 都有自己的合适的场景,不拘泥于框架、找到适合自己的解决方式才是最实际的。
是的,我所遇到的问题是如果想要后端渲染,就不应当过度依赖 Vue。但是有的时候还是略无奈啊,现在很多开箱即用的 UI 库(material、element、ant-design)几乎都是基于 Vue/React/Angular 实现的。既然选择重度依赖前端框架,其实就不该再强行依赖 Rails 在前端方面的传统优势了。
最近做过 webpacker 搭配 vue 的尝试。可以给点简单的建议。先简单比对下后端渲染和前后端分离。
开启了 turbolinks 的情况,需要在 turbolinks 相应的 callback 中销毁和重新注册相关组件。但是如果你使用了基于 Vue/React 这些前端框架的第三方 UI 库,某些第三方组件在 turbolinks 开启的情况下会出现一些意想不到的的问题。
表单操作方面,Vue/React 不能直接在 Rails 原生的表单中使用。如果还是使用 ujs 的方式去处理表单,遇到需要 Vue/React 去处理某些数据绑定的操作,也还是不方便。如果使用 Vue/React 去构建 Form,提交表单只能发起异步请求,不会有 Rails 原生表单的行为,一些本来交给 Rails 处理的行为(例如在 controller 中 redirect)需要交给前端处理。而且这样的行为在一个非前后端分离的项目中可能会显得比较怪异。
例:如果使用了 Vue 去提交一个表单,想在提交成功之后做 redirect。由于是一个异步请求,Rails 并不能帮助我们进行 redirect,只能在前端使用window.location
这样类似的方式进行 redirect。这个行为既不 Rails 也不 SPA。(SPA 中通常使用 Router 进行跳转)
前后端数据命名格式不一致。在 js 中,命名的规范是camelCase
,在 Rails 中是下划线的形式。如果你有过 SPA 的开发经验,在写前端逻辑时应该会倾向于camelCase
,所以我们还是需要对 Rails 的数据做一道转换。
可能你看到这里会觉得我更加倾向于 SPA。但事实上我所提到的在使用后端渲染 + 前端框架的这些缺点,都是因为在开始项目之前我不希望使用 SPA,所以还是想像使用 jQuery 一样使用 Vue,所以还是采用了后端渲染的方式之后发现的。我在项目中为了能快速搭建 UI,使用了一个 Vue 的第三方组件库,开始时并没有觉得有什么问题,但是随着项目深入之后便发现了我之前提到的这些问题。为了解决这些问题反而花了更多的时间。
但是这并不代表 SPA 就一定是更好的选择。技术选型不能脱离我们的业务和环境。关于究竟是 SPA 还是后端渲染,我想给出我自己的一些建议:
关于前后端分离的问题,社区里曾有过不少讨论。其实无论是前后端分离还是后端渲染,我们的目的都是为了解决问题,二者没有孰好孰坏之分。你不必因为现在很多项目都选择了前后端分离就一定要去跟这个潮流,放弃后端渲染。同时,也不必像我一样,在场景过于依赖前端框架的时候硬要上后端渲染(这里也有我个人的原因,最近一年的工作很多是和前端相关,对一些单页应用中的业务场景更加熟悉一些)。找到最适合自己和团队的方式,高效高质量地进行开发才是我们的最终目的。
用 Rails 的话,Action Cable http://edgeguides.rubyonrails.org/action_cable_overview.html
赞一下。我最近也在学习 vue,也是拿 ruby china 练的手。发现 vue 中没有比较好用的分页组件(类似于 react-paginate 这样的),楼主 demo 中也是自己做了简单的处理。所以我就自己参考 react-paginate 写了一个简单的 pagination 组件,做了一个 npm 包,还算好用。楼主可以试试。
github: https://github.com/lokyoung/vuejs-paginate
#5 楼 @42thcoder 谢谢推荐,之前没有尝试过 gitlab,准备深入了解下!
Getting Started 第一行
$ npm install -g yarn
Ruby on Rails tutorial http://railstutorial-china.org/
这个是两次请求。你看每次 request 的最后一行 Complete OK in ..ms。第一次是 84ms,第二次 70ms。
#18 楼 @u1450154824 很久以前写的,很多代码和配置都不能用了。最近抽个时间更新下。谢谢提醒。
#15 楼 @mingyuan0715 Thank you very much!
#9 楼 @xiaoronglv 谢谢,得到认可很开心,个人感觉 Upstart 和 Inspeqtor(二者都不仅仅局限于 Sidekiq)还是挺实用的~