React / Vue 一类的框架对于 Rails 这种 不甘于 View 端表达能力的,一下子就感觉是把一个人的手给剁了,感觉挺难受的。React / Vue 野心挺大,而 ActionView / ActionController 又配合也挺好的,这搞的挺分裂的。而 react_on_rails 、react-rails解决不了根本的问题,它们服务端渲染的本质是另搞一个 js 环境来解释执行 JS 代码,传送到浏览器端。
Hotwired / Stimulus 这种写写一般的页面逻辑还是挺方便的,但是对于组件抽象化的能力还是欠缺一些,不能形成生态气候,相对来说是一个封闭的环境。
github 搞的 view_component ,基本来说是不错的,https://ruby-china.org/topics/42030,但是缺少前端的能力,希望能强化一下。
直到我看到 Alpine.js 我眼前一亮,这不就是我想要的吗? 轻量级,表达能力不弱,HTML 片段和 数据状态管理搭配的挺好,同时又没有像其它框架发明很多概念和词汇,就算以后换 JS 框架(经常干的事)也不是很费脑力。它的 Hello world 是这样的:
script src="//unpkg.com/alpinejs" defer></script>
<div x-data="{ open: false }">
<button @click="open = true">Expand</button>
<span x-show="open">
Content...
</span>
</div>
再来一个看起来组件化一点的例子:
<div x-data="dropdown">
<button @click="toggle">...</button>
<div x-show="open">...</div>
</div>
<script>
document.addEventListener('alpine:init', () => {
Alpine.data('dropdown', () => ({
open: false,
toggle() {
this.open = ! this.open
}
}))
})
</script>
Alpine.js 通过很低的成本提供了与 Vue 或 React 这类大型框架相近的响应式和声明式特性,没有为了解决某某问题,给你再整个什么概念(说的就是你 React JS),它的文档里就这么点东西,看一会儿就可以上手了。
Alpine.js 中关于数据状态的 Reactivity 这部分,是直接基于 Vue 项目中的一个模块 @vue/reactivity,再没有其它依赖,整体代码很少,14KB,就这么点:https://unpkg.com/[email protected]/dist/cdn.min.js
我感觉是可以尝试一下了。大家觉得怎么样?