我觉得你真的不需要学习 Alpine.js

1,166 阅读4分钟

Alpine.js 号称是轻量级的前端框架,但是笔者学习和使用一段时间后,发现 Alpine.js 相比成熟的 React/Vue 等前端框架存在很很多问题,所以断言真的没必要学习 Alpine.js。

你真的不需要学习 Alpine.js 主要原因如下

组件复用度低

组件是指将 UI 拆分成独立且可复用的代码块,每个组件都可以管理自己的状态和属性。以 React 为例

形如下面的代码组织形式是 React 组件

import "./App.css";

function App() {
  return <p>hello, world!</p>;
}

export default App;

创建一个 App 组件,该组件会在页面上显示一行文本,文本内容为 hello,world!,该组件的使用方式如下

<App/>

直接在要使用的组件里按照 <App/> 的方式使用,如此简单的使用方式实现组件复用。

下面跟随笔者看一下 Alpine.js 的组件复用方式,在此之前,我们先来看一下 Alpine.js 的简单使用

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>hello Alpine.js</title>
    <script src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.0/dist/cdn.min.js"></script>
  </head>
  <body>
    <div x-data="{ count: 0 }">
      <button x-on:click="count++">Increment</button>

      <span x-text="count"></span>
    </div>
  </body>
</html>

从代码可以看出,Alpine.js 的语法设计与 Vue 非常像,简洁清晰,基于直观的声明式语法,使得学习曲线非常平缓。并且可以直接在 HTML 文件中使用。

缺少 UI 组件库

React/Vue 等前端框架之所以流行离不开社区提供的 UI 组件库。像 Ant Design 这类 UI 组件库可以满足后台管理系统所涉及的全部组件,非常利于开发人员快速完成后台系统的开发

反观 Alpine.js,笔者目前只发现 alpinejs.dev/components#… 这一个 UI 组件库,并且该 UI 组件库还是收费的

前端的 UI 组件库旨在简化和加速前端开发过程。如果社区里没有提供足够的 UI 组件库,那么前端开发人员可能会面临以下问题:

  1. 重复造轮子:开发人员需要重复编写常见的界面组件,增加了开发时间和工作量。
  2. 风格不统一:不同开发人员设计的界面元素可能风格不一致,导致应用的整体风格杂乱。
  3. 维护困难:没有统一的组件库,可能导致代码结构混乱,难以维护和更新。
  4. 可复用性差:缺乏可重用的组件,导致在不同项目之间难以共享和重用代码。

使用 Alpine.js 开发产品,由于产品特性需要定制化 UI 时,开发人员需要花费大量精力在样式上,反而降低开发效率,从这个角度看,Alpine.js 并不是最佳选择

难以管理复杂状态

使用 React/Vue 开发大型后台管理系统时,需要处理跨组件的状态共享,社区先后涌现出很多状态管理库,诸如 Redux。翻遍 Alpine.js 社区没有发现适用的状态管理库

缺少调试工具

前面说到 Alpine.js 缺少 UI 组件库,说明 Alpine.js 的生态并不完善,与 Alpine.js 配套的工具也缺失。

由于 Alpine.js 提供独特的指令,所以在使用 VSCode 编辑器开发时,需要编辑器提供 Alpine.js IntelliSense 功能,笔者在 VSCode 拓展商店找到了 Alpine.js IntelliSense 拓展,但是该拓展最新的更新时间在几年前

image.png

更新不及时的拓展在遇到新问题时或许不能马上解决

像成熟的 React/Vue 前端框架都提供对应的 React DevTool/Vue DevTool,笔者在 GitHub 上找到了 Alpine.js devtools ,它提供类似 React DevTool 的功能帮助开发人员查看各种状态

但是该工具上次的更新时间是 3 年前

image.png

框架运行时过大

image.png

Alpine.js 的官方网站上宣称是轻量级的前端框架,但是笔者发现它并不轻量

下面是框架运行时加载大小对比

image.png

Alpine.js 经过压缩后的大小有 30.2kB,gzip 后还有 9.9kB

image.png

而 Preact 经过压缩后的大小只有 11.5kB,gzip 后仅仅 4.6kB。结合 Alpine.js 的使用场景,如果产品需要更佳的加载性能,选择 Alpine.js 不是最佳的选择

前端框架设计思考

前端框架的本质是如何设计优雅的 DOM 表达。这是笔者的总结。

拿 React 中来说,React 采用 JSX 语法来表达 DOM,请看下面的小例子

const App = () => <div>Hello,JSX!</div>

形如 <div>Hello,JSX!</div> 就是 JSX 语法,JSX 语法结构清晰,易于阅读和理解

而在 Alpine.js 中,DOM 片段的表达方式如下

<div x-data="{ count: 0 }">
  <button x-on:click="count++">Increment</button>

  <span x-text="count"></span>
</div>

相比 JSX 语法,上面的代码片段属于 HTML 结构不容易复用,并且大量的字符串解析不利于做复杂的逻辑处理