DEV Community

Cover image for Qwik introduction from Misko and Giorgio
Leonardo Montini for This is Learning

Posted on • Originally published at leonardomontini.dev

Qwik introduction from Misko and Giorgio

On June 14th I've been in Florence to attend an amazing workshop about Qwik, held by Misko Hevery, the creator of Qwik, and Giorgio Boa, a Qwik core contributor and advocate.

In case Misko's name sounds familiar to you, he is also the creator of Angular.

Selfie with Misko

Such a great day! I've learned a lot about Qwik and I've met a lot of great people, I'm proud of this selfie!


Qwik Workshop

Today I want to share with you some highlights of what I learnt during the workshop.

You can find here a short summary of the topics I'm going to cover in the video below.

Resumability

One of the key factors of Qwik is that it's based on resumability.

In short, components are rendered first on the server, then they are "paused" and sent to the client. When the client receives the component, it receives it as plain html (and css) with the serialized state attached to it, and nothing happens. No extra javascript is downloaded.

This makes the page load fast. Really fast.

When the user interacts with the components, the js code is downloaded and the component is "resumed" on the client, starting exactly from the state it had on the server.

Click to source

A cool thing, you can hold the Alt key and click on any element of the page to see the source code of the component that generated it, directly on vscode.

Qwik isn't the only framework that does this, but it works fine and it's worth mentioning.

Signals

Qwik uses Signals natively. The greatest advantage is that way less components need a rerender when the state changes. Actually, only the part that really needs to be updated is updated. Child components are not rerendered if they don't need to.

You can use useSignal for primitive values, or useStore for objects.

React to changes

Similarly to what you know as useEffect, Qwik has useTask with the biggest difference in the dependency array, which got removed.

useTask$(({ track, cleanup }) => {
  track(filter);
  const id = setTimeout(() => (debouncedFilter.value = filter.value), 400);
  cleanup(() => clearTimeout(id));
});
Enter fullscreen mode Exit fullscreen mode

You can keep track of the dependencies by using track and return a cleanup function if you need to.

Components below the fold

Similarly to Astro, you can make sure some components not currently visible on the screen are not dynamic. Once you get there, the js code is downloaded and the magic happens.

This is possible with useVisibleTask$.

Scoped Style

You can easily scope your style to avoid conflicts with other components.

import CSS from "./index.css?inline";

...

useStylesScoped$(CSS);
Enter fullscreen mode Exit fullscreen mode

Combine data

Again a React analogy, similar to useMemo you can use useComputed to combine data.

const fullName = useComputed$(() => `${firstName} ${lastName}`);
Enter fullscreen mode Exit fullscreen mode

This works really well if you have data stored in signals or stores.

Retrieve data asynchronously

The useResource$ method will let you get async data with the power of useTask$, with track, cleanup and some extra features, such as the <Resource> built-in component which allows you to handle the loading and error states.

<Resource
  value={reposResource}
  onPending={() => <>Loading...</>}
  onRejected={(error) => <>Error: {error.message}</>}
  onResolved={(repos) => (
    <ul>
      {repos.map((repo) => (
        <li key={repo}>
          <a href={`/github/${github.org}/${repo}`}>{repo}</a>
        </li>
      ))}
    </ul>
  )}
/>
Enter fullscreen mode Exit fullscreen mode

Routing parameters

useLocation in combination with routeLoader$ are your best friends if you need to read parameters from the url and do some server-side computation.

Server only operations

Speaking of the server, if you want something to happen there and not on the client, for example access the database or handle some external calls which might have private keys, you can use server$.

Contribute to Qwik

Qwik is Open Source, you can contribute in the official GitHub repo and also by creating integrations, dev tools and other projects.

A cool one I can mention is qwik-ui, the official UI library for Qwik.

Sounds cool?

If some of the mentioned topics sound interesting to you, that's great, I will expand them and show some coding in the video I recorded:


Thanks for reading this article, this was a short one but I hope you found it interesting!

I recently launched my Discord server to talk about Open Source and Web Development, feel free to join: https://discord.gg/bqwyEa6We6

Do you like my content? You might consider subscribing to my YouTube channel! It means a lot to me ❤️
You can find it here:
YouTube

Feel free to follow me to get notified when new articles are out ;)

Top comments (1)

Collapse
 
moinulmoin profile image
Moinul Moin

Nice Work, Leonardo!