SolidJs的第一天

197 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

前言

前端框架三分天下依然存在,但是其它优秀的框架也在活跃,比如SolidJSSolidJS是一个构建用户界面的库,简单高效且卓越。如果你使用过react,这个也许会给带来另外一种体验。SolidJS同样使用jsx进行开发,在性能上,根据官方给出的性能图,直逼原生js

特点

  1. 由于没有采用虚拟DOM或者其它对比,在性能上没有额外的开销
  2. 站在react等优秀的框架之上,如果学习过,对于本套框架的学习有事半功倍的效果
  3. 体积很小且支持ts

简单使用

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

function Counter() {
  const [count, setCount] = createSignal(0);
  const increment = () => setCount(count() + 1);

  return (
    <button type="button" onClick={increment}>
      {count()}
    </button>
  );
}

render(() => <Counter />, document.getElementById("app")!);

这是官方提供了一小段代码,很简单。从solid-js/web库里面导入render函数,此函数作用于将函数会的代码渲染到节点上。从solid-js导入createSignal导入响应式函数createSignal。在页面上添加一个按钮,调用increment函数,调用setCount函数从而让count()(这里是一个getter函数)响应式变化。从写法上来看,和react及其相似,所以会减轻开发者的负担。我们在看一下编译出来的语法:

import { render, createComponent, delegateEvents, insert, template } from 'solid-js/web';
import { createSignal } from 'solid-js';

const _tmpl$ = /*#__PURE__*/template(`<button type="button"></button>`, 2);

function Counter() {
  const [count, setCount] = createSignal(0);

  const increment = () => setCount(count() + 1);

  return (() => {
    const _el$ = _tmpl$.cloneNode(true);

    _el$.$$click = increment;

    insert(_el$, count);

    return _el$;
  })();
}

render(() => createComponent(Counter, {}), document.getElementById("app"));

delegateEvents(["click"]);

看到编译出来的代码,在_templ$ 变量里面保存的是完整的原生dom,而其它的语法也是直接从其它库里面调用的。 相比于其它的框架,都是采用运行时编译,虽然方便了我们在开发时没有约束,但是整体的包体积也会变得更大,会将整个框架的代码都打包进去。SolidJs而使用预编译,将 jsx 部分的代码,转换成原生的语法,所以在性能上直逼原生JS