Preact简介 #

一、什么是Preact #

Preact 是一个快速、轻量级的 JavaScript 库,用于构建用户界面。它提供了与 React 相同的现代 API,但体积仅有 3KB(gzip 压缩后),是 React 的理想替代方案。

1.1 核心定位 #

text
Preact = React API + 极小体积 + 高性能

Preact 的核心设计理念:

  • 轻量:仅 3KB,加载速度极快
  • 兼容:提供与 React 相似的 API
  • 高效:更快的渲染和更低的内存占用
  • 标准:基于 Web 标准,易于理解

1.2 核心特点 #

特点 说明
极小体积 3KB gzip,React 的 1/10
高性能 更快的虚拟 DOM diff 算法
React 兼容 可使用大部分 React 生态库
标准 API 遵循 Web 标准,无魔法
TypeScript 开箱即用的类型支持
无依赖 零外部依赖

二、核心概念 #

2.1 虚拟DOM #

Preact 使用轻量级的虚拟 DOM 实现:

text
┌─────────────┐
│   State     │  状态变化
└──────┬──────┘
       ↓
┌─────────────┐
│ Virtual DOM │  生成新的虚拟DOM树
└──────┬──────┘
       ↓ Diff算法
┌─────────────┐
│   Diffing   │  对比新旧虚拟DOM
└──────┬──────┘
       ↓ 最小更新
┌─────────────┐
│  Real DOM   │  只更新变化的部分
└─────────────┘

Preact 的虚拟 DOM 优势

  • 更轻量的实现
  • 更快的 diff 算法
  • 更低的内存占用

2.2 组件化 #

Preact 应用由组件构成:

jsx
function App() {
  return (
    <div>
      <Header />
      <Main>
        <Sidebar />
        <Content />
      </Main>
      <Footer />
    </div>
  );
}

组件特点:

  • 函数组件优先:推荐使用函数组件
  • Hooks 支持:完整的 Hooks API
  • 类组件支持:兼容 React 类组件写法

2.3 单向数据流 #

Preact 采用单向数据流:

text
┌─────────────┐
│  父组件     │
│   Props     │
└──────┬──────┘
       ↓ 单向传递
┌─────────────┐
│  子组件     │
└─────────────┘

2.4 声明式编程 #

jsx
// 命令式(传统方式)
const counter = document.getElementById('counter');
const button = document.getElementById('button');
button.addEventListener('click', () => {
  counter.textContent = parseInt(counter.textContent) + 1;
});

// 声明式(Preact风格)
function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <div>
      <span>{count}</span>
      <button onClick={() => setCount(count + 1)}>
        增加
      </button>
    </div>
  );
}

三、Preact vs React #

3.1 体积对比 #

text
React 18.x
├── react           ~42KB (gzip ~12KB)
├── react-dom       ~130KB (gzip ~42KB)
└── 总计            ~172KB (gzip ~54KB)

Preact 10.x
├── preact          ~10KB (gzip ~3KB)
└── 总计            ~10KB (gzip ~3KB)

3.2 API 对比 #

方面 Preact React
核心导出 h, render, Component createElement, render, Component
Hooks 完整支持 完整支持
事件系统 原生事件 合成事件
类组件生命周期 简化版 完整版
合成事件

3.3 性能对比 #

javascript
// Preact 更快的渲染
// 原因:
// 1. 更轻量的虚拟 DOM 实现
// 2. 更简单的 diff 算法
// 3. 无合成事件层开销

四、应用场景 #

4.1 移动端 Web 应用 #

text
适合移动端场景
- 首屏加载速度要求高
- 移动网络带宽有限
- 用户对性能敏感

4.2 渐进式增强 #

html
<!-- 在现有页面中嵌入 Preact 组件 -->
<div id="widget"></div>
<script type="module">
  import { render } from 'preact';
  import Widget from './Widget.js';
  
  render(<Widget />, document.getElementById('widget'));
</script>

4.3 轻量级单页应用 #

text
适合中小型 SPA
- 企业内部工具
- 博客系统
- 个人项目
- 原型开发

4.4 微前端子应用 #

text
微前端场景优势
- 独立部署
- 技术栈无关
- 体积小不影响主应用

五、Preact 生态系统 #

5.1 官方库 #

text
Preact 官方生态
├── preact                    核心库
├── preact-router             路由
├── preact-render-to-string   SSR 渲染
├── preact-compat             React 兼容层
├── @preact/signals           响应式状态
└── preact-testing-library    测试工具

5.2 兼容 React 生态 #

javascript
// 使用 preact/compat 兼容 React 库
import { render } from 'preact';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';

function App() {
  return (
    <Provider store={store}>
      <BrowserRouter>
        <Main />
      </BrowserRouter>
    </Provider>
  );
}

六、技术栈概览 #

6.1 推荐技术栈 #

text
┌──────────────────────────────────────┐
│              Preact 10               │
├──────────────────────────────────────┤
│  Preact Router │    Signals          │
│  (路由管理)    │    (响应式状态)      │
├──────────────────────────────────────┤
│  Vite          │    TypeScript       │
│  (构建工具)    │    (类型支持)        │
└──────────────────────────────────────┘

6.2 开发工具 #

  • Preact DevTools:浏览器开发者工具扩展
  • VS Code:推荐编辑器
  • Vite:推荐构建工具
  • TypeScript:类型支持

七、学习路线 #

text
基础阶段
├── Preact基础语法
├── JSX与组件
├── Props与State
└── 事件处理

进阶阶段
├── Preact Hooks
├── 组件通信
├── Preact Router
└── Signals状态管理

高级阶段
├── 性能优化
├── 自定义Hooks
├── TypeScript集成
└── SSR服务端渲染

八、快速体验 #

8.1 在线体验 #

html
<!DOCTYPE html>
<html>
<head>
  <title>Preact Demo</title>
</head>
<body>
  <div id="app"></div>
  <script type="module">
    import { render, h } from 'https://esm.sh/preact';
    import { useState } from 'https://esm.sh/preact/hooks';
    
    function App() {
      const [count, setCount] = useState(0);
      return (
        <div>
          <h1>Hello Preact!</h1>
          <p>Count: {count}</p>
          <button onClick={() => setCount(c => c + 1)}>
            Click me
          </button>
        </div>
      );
    }
    
    render(<App />, document.getElementById('app'));
  </script>
</body>
</html>

8.2 创建项目 #

bash
# 使用 Vite 创建
npm create vite@latest my-app -- --template preact

# 或使用官方 CLI
npx preact-cli create default my-app

九、总结 #

Preact 是一款优秀的轻量级 UI 库:

  • 轻量:仅 3KB,极致性能
  • 兼容:React API,平滑迁移
  • 高效:更快的渲染速度
  • 现代:完整的 Hooks 支持

选择 Preact 的理由:

  • 追求极致的加载性能
  • 需要轻量级解决方案
  • 熟悉 React 想要更小的包体积
  • 移动端或嵌入式场景
最后更新:2026-03-28