ITADN
solidjs/solid
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

SolidJS

Build Status Coverage Status

NPM Version Discord Subreddit subscribers

网站API 文档功能教程PlaygroundDiscord

Solid 是一个用于创建用户界面的声明式 JavaScript 库。它不使用虚拟 DOM,而是将模板编译为真实的 DOM 节点,并通过细粒度的响应进行更新。声明你的状态并在整个应用中使用它,当某部分状态发生变化时,只有依赖于它的代码会重新运行。

概览

import { createSignal } from "solid-js";
import { render } from "solid-js/web";

function Counter() {
  const [count, setCount] = createSignal(0);
  const doubleCount = () => count() * 2;
  
  console.log("The body of the function runs once...");

  return (
    <>
      <button onClick={() => setCount(c => c + 1)}>
        {doubleCount()}
      </button>
    </>
  );
}

render(Counter, document.getElementById("app")!);

在我们的 playground 中尝试这段代码!

解释一下!
import { createSignal } from "solid-js";
import { render } from "solid-js/web";

// A component is just a function that returns a DOM node
function Counter() {
  // Create a piece of reactive state, giving us an accessor, count(), and a setter, setCount()
  const [count, setCount] = createSignal(0);
  
  //To create derived state, just wrap an expression in a function
  const doubleCount = () => count() * 2;
  
  console.log("The body of the function runs once...");

  // JSX allows you to write HTML within your JavaScript function and include dynamic expressions using the { } syntax
  // The only part of this that will ever rerender is the doubleCount() text.
  return (
    <>
      <button onClick={() => setCount(c => c + 1)}>
        Increment: {doubleCount()}
      </button>
    </>
  );
}

// The render function mounts a component onto your page
render(Counter, document.getElementById("app")!);

Solid 会将你的 JSX 编译为高效的真实 DOM 更新。它在运行时使用相同的响应式原语(createSignal),但确保尽可能减少重新渲染。以下是该示例中的具体表现:

import { template as _$template } from "solid-js/web";
import { delegateEvents as _$delegateEvents } from "solid-js/web";
import { insert as _$insert } from "solid-js/web";
//The compiler pulls out any static HTML
const _tmpl$ = /*#__PURE__*/_$template(`<button>Increment: `);

import { createSignal, createEffect } from "solid-js";
import { render } from "solid-js/web";

function Counter() {
  const [count, setCount] = createSignal(0);
  
  const doubleCount = () => count() * 2;
  
  console.log("The body of the function runs once...");
  
  return (() => {
    //_el$ is a real DOM node!
    const _el$ = _tmpl$();
    _el$.$$click = () => setCount(c => c + 1);
     //This inserts the count as a child of the button in a way that allows count to update without rerendering the whole button
    _$insert(_el$, doubleCount);
    return _el$;
  })();
}
render(Counter, document.getElementById("app"));
_$delegateEvents(["click"]);

主要特性

  • 对真实 DOM 的细粒度更新
  • 声明式数据:将你的状态建模为具有响应式原语的系统
  • 单次渲染心智模型:你的组件是运行一次以设置视图的常规 JavaScript 函数
  • 自动依赖跟踪:访问你的响应式状态即订阅它
  • 简单:学习几个可复用、组合和在其基础上构建的强大概念
  • 提供现代框架特性,如 JSX、fragments、Context、Portals、Suspense、流式 SSR、渐进式 hydration、Error Boundaries 和并发渲染。
  • 天然可调试:<div> 是一个真实的 div,因此你可以使用浏览器的 devtools 来检查渲染
  • Web 组件友好 并且可以创建自定义元素
  • 同构:在客户端和服务器上渲染你的组件
  • 通用:编写 自定义渲染器 以在任意地方使用 Solid
  • 拥有活跃核心团队支持的不断增长的社区和生态系统
快速入门

您可以通过在终端中运行以下命令,使用一个简单的应用开始入门:

> npx degit solidjs/templates/js my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpm

或者对于 TypeScript:

> npx degit solidjs/templates/ts my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpm

这将创建一个由 Vite 驱动的最小化客户端渲染应用程序。

或者,您可以在自己的环境中安装依赖项。要在 JSX 中使用 Solid(推荐),请运行:

> npm i -D babel-preset-solid
> npm i solid-js

最简单的设置方法是将 babel-preset-solid 添加到您的 .babelrc、webpack 的 babel 配置或 rollup 配置中:

"presets": ["solid"]

为了让 TypeScript 正常工作,请记住将你的 .tsconfig 设置为处理 Solid 的 JSX:

"compilerOptions": {
  "jsx": "preserve",
  "jsxImportSource": "solid-js",
}

为什么选择 Solid?

高性能

Solid 经过精心打造以追求极致性能,并拥有半十年的研究积累,其性能几乎与优化后的原生 JavaScript 无异(参见 Solid 在 JS Framework Benchmark 上的表现)。Solid 体积小巧且完全支持 tree-shaking,在服务器端渲染时同样快速。无论您是构建完全客户端渲染的 SPA 还是服务器渲染的应用,您的用户都能体验到前所未有的速度。(阅读更多关于 Solid 性能 的内容,来自该库的创建者。)

功能强大

Solid 功能完备,具备现代框架应有的所有特性。内置了高性能的状态管理,包括 Context 和 Stores:您无需依赖第三方库来管理全局状态(如果您不想使用的话)。借助 Resources,您可以像使用其他状态一样使用从服务器加载的数据,并得益于 Suspense 和并发渲染来构建响应式 UI。当您准备迁移到服务器端时,Solid 提供完整的 SSR 和 serverless 支持,通过流式传输和渐进式水合(progressive hydration)尽可能快地达到可交互状态。(查看我们完整的交互式功能指南。)

务实

用更少的代码做更多的事:使用简单、可组合的原语,没有隐藏的规则和陷阱。在 Solid 中,组件只是函数——渲染完全由你如何使用状态决定——因此你可以自由地组织代码,无需学习新的渲染系统。Solid 鼓励诸如声明式代码和读写分离等有助于保持项目可维护性的模式,但不会强加观点而妨碍你。

高效

Solid 建立在 JSX 和 TypeScript 等成熟工具之上,并与 Vite 生态系统集成。Solid 的裸机、最小化抽象让你可以直接访问 DOM,从而轻松使用你喜欢的原生 JavaScript 库,如 D3。此外,Solid 生态系统正在快速增长,拥有自定义原语组件库,以及让你以新方式编写 Solid 代码的构建时工具。

更多

查看我们的官方文档或浏览一些示例

浏览器支持

SolidJS Core 致力于支持最近 2 年的现代浏览器,包括 Firefox、Safari、Chrome 和 Edge(适用于桌面和移动设备)。我们不支持 IE 或类似的已停止维护的浏览器。对于服务器环境,我们支持 Node LTS 以及最新的 Deno 和 Cloudflare Worker 运行时。

Testing Powered By SauceLabs

社区

来我们的 Discord 聊天吧!Solid 的创建者以及核心团队的其他成员都在那里活跃,我们始终欢迎贡献。

Contributors

Open Collective

通过捐赠支持我们,帮助我们继续开展活动。[Contribute]

赞助者

成为赞助者,让您的 Logo 出现在我们 GitHub 上的 README 中,并附上指向您网站的链接。[成为赞助者]