网站 • API 文档 • 功能教程 • Playground • Discord
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 运行时。
社区
来我们的 Discord 聊天吧!Solid 的创建者以及核心团队的其他成员都在那里活跃,我们始终欢迎贡献。
Contributors
Open Collective
通过捐赠支持我们,帮助我们继续开展活动。[Contribute]
赞助者
成为赞助者,让您的 Logo 出现在我们 GitHub 上的 README 中,并附上指向您网站的链接。[成为赞助者]