Let's take a look at some of the new frameworks. SolidJS looks very much like Hooks-style React, but apparently it abandons virtual DOM.
I never used it before, so let's start with a hello world app, and over the next few episodes I'll try to build something a bit more substantive.
Getting started
We can start it with degit
, which seems to be the most popular tool for a lot of frameworks these days:
$ npx degit solidjs/templates/js episode-43
Then we do the usual steps to start the app:
$ npm i
$ npm run dev
index.html
We can start with cleaned up index.html
, it's pretty much what you'd expect:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Solid App</title>
</head>
<body>
<div id="root"></div>
<script src="/src/index.jsx" type="module"></script>
</body>
</html>
index.jsx
This comes from the template as well. I'm not sure what /* @refresh reload */
is for, most likely something related to HMR.
/* @refresh reload */
import { render } from "solid-js/web"
import "./index.css"
import App from "./App"
render(() => <App />, document.getElementById("root"))
index.css
SolidJS has both global and (awkward coming from Svelte) module-scoped CSS. For this app I'll just use global CSS:
body {
margin: 0;
min-height: 100vh;
display: flex;
text-align: center;
justify-content: center;
align-items: center;
}
App.jsx
It looks very close to React with useState
. It's not quite the same, as semantics are very different, and you access current value of count
with count()
not just count
. But for simple cases, it should be easy transition for React developers.
import { createSignal } from "solid-js"
function App() {
let [count, setCount] = createSignal(0)
return (
<div>
<div>{ count() }</div>
<button onClick={() => setCount(count() + 1)}>Click me!</button>
</div>
)
}
export default App
Building the app
To build the app, use npm run build
, and it will be created in dist
... And once again it will not work for GitHub Pages as it uses absolute paths. I have no idea why so many frameworks have this awful default.
We need to modify vite.config.js
to use relative paths. Fortunately that's just one line change base: "./"
:
import { defineConfig } from "vite"
import solidPlugin from "vite-plugin-solid"
export default defineConfig({
base: "./",
plugins: [solidPlugin()],
build: {
target: "esnext",
polyfillDynamicImport: false,
},
})
Story so far
And here's the result:
I deployed this on GitHub Pages, you can see it here.
Coming next
In the next few episodes, we'll try to build some less trivial things with SolidJS.
Top comments (0)