Solid,一个前端超新星项目?

简介: 本文适合对新兴前端技术框架感兴趣的小伙伴阅读

一、前言


solidjs的GitHub、官网地址:

https://github1s.com/solidjs/solid/blob/HEAD/README.md

https://www.solidjs.com/

 

 广东靓仔前阵子看到一个比较有意思的技术库SolidJS,在Github的star也高达13.1k。

image.png


SolidJS非常非常快,这是最大的亮点。

image.png


SolidJS用于构建用户界面的声明式、高效且灵活的 JavaScript 库。


一些大佬描述SolidJS“比React更React”~


二、简单描述


官方描述:    

image.png


大体意思就是说:Solid是一个用于构建用户界面的 声明性 JavaScript 库,特点是高效灵活。


Solid 很多特点

  • 没有虚拟 DOM!没有脏检查摘要循环(将其模板编译为真实的 DOM
  • 支持并建立在 TypeScript 之上
  • 支持现代功能,例如 JSX、Fragment、Context、Portals、Suspense、Streaming SSR、Progressive Hydration、Error Boundaries 和 Concurrent Rendering
  • 适用于无服务器环境,包括 AWS Lambda 和 Cloudflare Workers
  • 具有高性能,并且具有极小的打包体积,适合打包为独立的模块嵌入其它项目压缩后的代码体积非常非常小
  • Solid 上手简单,贴合 React 或是 Vue3 开发者的使用习惯

  • Solid 中 JSX 直接返回 DOM 元素,符合直觉,并且很纯净
  • Solid 某些地方需要使用其指定的东西才能达到高性能,高性能并不是毫无代价的

......等等


三、将JSX 编译为Dom的demo


菜单目录

image.png


   广东靓仔从官网找了个Demo,可以直观看到编译结果:


简单的组件:

import { render } from "solid-js/web";
const HelloMessage = props => <div>Hello {props.name}</div>;
render(() => 
  <HelloMessage name="Taylor" />, 
  document.getElementById("hello-example")
);


Solid 使用render函数来创建应用程序的反应式挂载点。


将JSX 编译为高效的真实 DOM :

import { render, template, insert, createComponent } from "solid-js/web";
const _tmpl$ = template(`<div>Hello </div>`);
const HelloMessage = props => {
  const _el$ = _tmpl$.cloneNode(true);
  insert(_el$, () => props.name);
  return _el$;
};
render(
  () => createComponent(HelloMessage, { name: "Taylor" }),
  document.getElementById("hello-example")
);


从上面的代码可以看出_el$是真正的 div 元素。props.name包含在insert函数中。这是因为这是该组件中唯一将再次执行的部分。即使从外部更新名称,也只会重新估算的一个表达式。两全其美:编译器优化初始渲染,运行时优化更新。


更新速度快

Solid 的原理和新兴框架 Svelte 的原理非常类似,都是编译成原生 DOM,


创建 DOM 节点时, Solid做了点小技巧,利用了 innerHTML 代替 createElement 来创建,从而进一步提升了性能。


我们都知道:ReactVue有 Virtual DOM(React中叫Fiber树)。


每当发生更新,Virtual DOM 会进行比较(Diff算法),比较的结果会执行不同的DOM操作(增、删、改)。


SolidSvelte 一样,发生更新时,直接调用编译好的DOM操作方法,省去了 Virtual DOM。


Solid更新流程,是哪里需要更新就更新一下,与React区别还是比较大的。因此Solid更新路径更短。


四、安装使用


js安装使用:

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


ts安装使用:

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


如果是一些几个页面的小应用,我们可以独立安装,推荐Solid 与 JSX一起使用:

> npm install solid-js babel-preset-solid


增加 .babelrc 或 webpack 的 babel 配置

"presets": ["solid"]


如果使用了TS,需要在TSconfig加下配置:

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


Solid 没有以下内容

  • 没有Hooks顺序限制
  • 没有useEffect闭包问题
  • 没有Fiber树


   广东靓仔看了下Solid现在的用户量以及社区,感觉要成为主流技术估计没那么顺利,还有很长一段路要走。不过可以给我们多一些技术选择,在技术选型的时候也可以考虑下。不要限制自己~


五、总结


   在我们阅读完官方文档后,我们一定会进行更深层次的学习,比如看下框架底层是如何运行的,以及源码的阅读。  


这里广东靓仔给下一些小建议:

  • 在看源码前,我们先去官方文档复习下框架设计理念、源码分层设计
  • 阅读下框架官方开发人员写的相关文章
  • 借助框架的调用栈来进行源码的阅读,通过这个执行流程,我们就完整的对源码进行了一个初步的了解
  • 接下来再对源码执行过程中涉及的所有函数逻辑梳理一遍
相关文章
|
7天前
|
前端开发 JavaScript 定位技术
一、前端高德地图注册、项目中引入、渲染标记(Marker)and覆盖物(Circle)
文章介绍了如何在前端项目中注册并使用高德地图API,包括注册高德开放平台账号、引入高德地图到项目、以及如何在地图上渲染标记(Marker)和覆盖物(Circle)。
23 1
|
2月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
34 0
|
2月前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
2月前
|
前端开发 JavaScript
在 Vue3 + ElementPlus 项目中使用 computed 实现前端静态分页
本文介绍了在Vue3 + ElementPlus项目中使用`computed`属性实现前端静态分页的方法,并提供了详细的示例代码和运行效果。
104 1
在 Vue3 + ElementPlus 项目中使用 computed 实现前端静态分页
|
2月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!
28 0
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
|
2月前
|
开发者 C# C++
揭秘:如何轻松驾驭Uno Platform,用C#和XAML打造跨平台神器——一步步打造你的高性能WebAssembly应用!
【8月更文挑战第31天】Uno Platform 是一个跨平台应用程序框架,支持使用 C# 和 XAML 创建多平台应用,包括 Web。通过编译为 WebAssembly,Uno Platform 可实现在 Web 上运行高性能、接近原生体验的应用。本文介绍如何构建高效的 WebAssembly 应用:首先确保安装最新版本的 Visual Studio 或 VS Code 并配置 Uno Platform 开发环境;接着创建新的 Uno Platform 项目;然后通过安装工具链并使用 Uno WebAssembly CLI 编译应用;最后添加示例代码并测试应用。
52 0
|
2月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
76 0
|
2月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
48 0
|
2月前
|
前端开发 JavaScript 编译器
【性能革命】Angular Ivy编译器:一场前端开发者的极速盛宴,揭秘应用瘦身与提速的黑科技,让你的Angular项目焕发新生的终极指南
【8月更文挑战第31天】Angular Ivy编译器是Angular团队推出的更新,旨在改善应用性能,减少构建时间和代码量。自Angular 9起,Ivy成为默认编译器。本文通过案例分析,介绍Ivy的工作原理及其优势。以一个复杂应用为例,展示了Ivy如何通过减少生成的JavaScript代码量、优化模板表达式解析等方式提升性能。通过创建示例项目并比较启用与未启用Ivy的构建结果,证明了Ivy在构建速度和文件大小上的显著改进,同时提高了运行时性能。这对于追求高性能和快速开发的应用至关重要。
25 0
|
2月前
|
数据采集 资源调度 JavaScript
Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
【8月更文挑战第4天】Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
38 5
下一篇
无影云桌面