<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jonas Pfalzgraf</title>
    <description>The latest articles on DEV Community by Jonas Pfalzgraf (@josunlp).</description>
    <link>https://dev.to/josunlp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png</url>
      <title>DEV Community: Jonas Pfalzgraf</title>
      <link>https://dev.to/josunlp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josunlp"/>
    <language>en</language>
    <item>
      <title>bQuery.js v1.9.0 🥂 Still the jQuery for the Modern Web Platform — but sharper than ever</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Mon, 06 Apr 2026 12:06:46 +0000</pubDate>
      <link>https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho</link>
      <guid>https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho</guid>
      <description>&lt;p&gt;&lt;em&gt;A modular, zero-build JavaScript toolkit for people who want modern reactivity, Web Components, and DOM ergonomics without marrying a giant framework&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;A little while ago, I wrote about &lt;strong&gt;bQuery.js&lt;/strong&gt; and called it what it honestly feels like: &lt;strong&gt;the jQuery for the modern web platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And yes — I still stand by that.&lt;/p&gt;

&lt;p&gt;But bQuery didn’t stop there. The ecosystem kept evolving, the APIs matured further, and with &lt;strong&gt;&lt;code&gt;@bquery/bquery&lt;/code&gt; 1.9.0&lt;/strong&gt;, the project feels even more like a serious option for people who want modern frontend capabilities &lt;strong&gt;without immediately summoning an entire framework stack from the underworld&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because let’s be honest: sometimes you don’t want to set up a mega toolchain, configure seventeen plugins, and debate hydration strategies for three business days.&lt;/p&gt;

&lt;p&gt;Sometimes you just want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;select DOM elements&lt;/li&gt;
&lt;li&gt;react to state changes&lt;/li&gt;
&lt;li&gt;fetch some data&lt;/li&gt;
&lt;li&gt;build a component&lt;/li&gt;
&lt;li&gt;ship your app&lt;/li&gt;
&lt;li&gt;and go to sleep at a reasonable hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where bQuery still shines.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 What is bQuery again?
&lt;/h2&gt;

&lt;p&gt;If you haven’t heard of it yet:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;bQuery&lt;/strong&gt; is a modular JavaScript/TypeScript library published as &lt;strong&gt;&lt;code&gt;@bquery/bquery&lt;/code&gt;&lt;/strong&gt; on npm. It aims to combine the directness of classic DOM libraries with modern frontend features like &lt;strong&gt;signals, typed Web Components, async composables, forms, i18n, routing, SSR, accessibility helpers, and more&lt;/strong&gt;. Your earlier article also highlighted its modular architecture and zero-build approach. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;So yes, the “jQuery for the modern web platform” label is not just marketing fluff. It’s actually a pretty accurate mental model.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DOM ergonomics&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fine-grained reactivity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;progressive enhancement&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;modular imports&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;security-conscious APIs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;native platform-first thinking&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that combo is still weirdly rare.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Why this matters in 2026
&lt;/h2&gt;

&lt;p&gt;The frontend world still has a small addiction problem.&lt;/p&gt;

&lt;p&gt;Not with caffeine.&lt;br&gt;&lt;br&gt;
Okay, also with caffeine.&lt;/p&gt;

&lt;p&gt;But especially with complexity.&lt;/p&gt;

&lt;p&gt;There are plenty of cases where React, Vue, Angular, Svelte, Solid, or whatever else absolutely make sense. I use frameworks too. This is not a crusade.&lt;/p&gt;

&lt;p&gt;But there’s also a huge space between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“just use vanilla JS”&lt;/li&gt;
&lt;li&gt;and&lt;/li&gt;
&lt;li&gt;“spin up an enterprise-grade framework architecture for a settings panel”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That middle ground is where libraries like bQuery are genuinely interesting.&lt;/p&gt;

&lt;p&gt;If you’re building things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internal tools&lt;/li&gt;
&lt;li&gt;progressive web enhancements&lt;/li&gt;
&lt;li&gt;browser-based utilities&lt;/li&gt;
&lt;li&gt;Web Components&lt;/li&gt;
&lt;li&gt;small to mid-sized apps&lt;/li&gt;
&lt;li&gt;interactive islands on otherwise static pages&lt;/li&gt;
&lt;li&gt;prototypes that accidentally became real products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…then bQuery makes a lot of sense.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Getting started
&lt;/h2&gt;

&lt;p&gt;You can install it the normal way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @bquery/bquery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with pnpm / bun if you’re living the good life:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add @bquery/bquery
&lt;span class="c"&gt;# or&lt;/span&gt;
bun add @bquery/bquery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your previous article also showed that bQuery can be used directly in the browser via ES modules, without forcing a traditional build step, which is one of its most compelling traits. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That alone is such a refreshing thing.&lt;/p&gt;

&lt;p&gt;No “before you begin, initialize six config files.”&lt;/p&gt;

&lt;p&gt;Just code.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ The familiar part: DOM manipulation that doesn’t feel painful
&lt;/h2&gt;

&lt;p&gt;The easiest way to understand bQuery is to start with the part that feels familiar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ready&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;css&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rebeccapurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.1rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from bQuery!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggleClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you ever used jQuery, this feels immediately understandable.&lt;/p&gt;

&lt;p&gt;But unlike old-school jQuery, this is not where the story ends.&lt;/p&gt;

&lt;p&gt;The core module gives you a chainable, ergonomic API for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;classes and attributes&lt;/li&gt;
&lt;li&gt;events&lt;/li&gt;
&lt;li&gt;DOM traversal&lt;/li&gt;
&lt;li&gt;form helpers&lt;/li&gt;
&lt;li&gt;dimensions and positioning&lt;/li&gt;
&lt;li&gt;content updates&lt;/li&gt;
&lt;li&gt;insertion and replacement utilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And one detail I particularly like: &lt;strong&gt;sanitization-aware HTML handling&lt;/strong&gt;. In your earlier write-up, you pointed out that &lt;code&gt;html()&lt;/code&gt; is sanitized by default and &lt;code&gt;htmlUnsafe()&lt;/code&gt; is the explicit opt-out, which is a very sane design choice. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That’s one of those “small” details that actually says a lot about a library’s philosophy.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Signals, because modern state should not be miserable
&lt;/h2&gt;

&lt;p&gt;This is where bQuery stops being “just a DOM helper” and starts becoming something much more interesting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;batch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jonas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pfalzgraf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Josun&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LP&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the kind of API I really like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;readable&lt;/li&gt;
&lt;li&gt;explicit&lt;/li&gt;
&lt;li&gt;modern&lt;/li&gt;
&lt;li&gt;not overloaded with ceremony&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your March article already covered that bQuery’s reactive layer includes things like &lt;strong&gt;signals, computed values, effects, batching, watchers, persisted signals, and linked signals&lt;/strong&gt;, which makes it much more than a tiny convenience wrapper. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;And honestly?&lt;br&gt;&lt;br&gt;
Signals are one of the best things that happened to frontend state management in recent years.&lt;/p&gt;

&lt;p&gt;They’re simple enough to understand quickly, but powerful enough to build serious UI logic on top of them.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌐 Async data without writing the same boilerplate forever
&lt;/h2&gt;

&lt;p&gt;Another area where frontend code often becomes deeply annoying: async state.&lt;/p&gt;

&lt;p&gt;Loading states. Error states. Refresh logic. Cleanup. Watching dependencies. Re-running on change.&lt;br&gt;&lt;br&gt;
Fun. So much fun. Absolutely thrilling. Definitely not repetitive at all.&lt;/p&gt;

&lt;p&gt;bQuery wraps this into composables like &lt;code&gt;useAsyncData&lt;/code&gt; and &lt;code&gt;useFetch&lt;/code&gt;, which your earlier article described in detail, including support for lifecycle state like pending/success/error and HTTP niceties like query params and response parsers. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;A simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useFetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That kind of API is exactly what I want for smaller apps and tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expressive&lt;/li&gt;
&lt;li&gt;low-friction&lt;/li&gt;
&lt;li&gt;practical&lt;/li&gt;
&lt;li&gt;doesn’t force me into a giant framework runtime&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Web Components that don’t feel like punishment
&lt;/h2&gt;

&lt;p&gt;I’ve said it before and I’ll say it again:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Web Component API is powerful, but raw Web Component authoring can be annoyingly verbose.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s another place where bQuery becomes genuinely useful.&lt;/p&gt;

&lt;p&gt;Your previous article showed that bQuery’s component layer supports &lt;strong&gt;typed props, configurable Shadow DOM usage, sanitized render output, lifecycle hooks, local reactive helpers, and external signals for rerendering&lt;/strong&gt;. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That means you can build native custom elements without drowning in low-level setup code.&lt;/p&gt;

&lt;p&gt;And that’s huge.&lt;/p&gt;

&lt;p&gt;Because Web Components are great when you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;framework-agnostic components&lt;/li&gt;
&lt;li&gt;encapsulation&lt;/li&gt;
&lt;li&gt;reusability across projects&lt;/li&gt;
&lt;li&gt;native browser primitives&lt;/li&gt;
&lt;li&gt;long-lived maintainable UI building blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But they become a lot more fun when the authoring experience is decent.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Why I like the philosophy behind bQuery
&lt;/h2&gt;

&lt;p&gt;There are lots of libraries that can do one or two of these things. That’s not the special part.&lt;/p&gt;

&lt;p&gt;What I like about bQuery is the overall mindset:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Platform-first&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It builds on browser capabilities instead of fighting them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Progressive&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You don’t need to buy into everything at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Modular&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Import what you need. Leave the rest alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Modern&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Signals, typed components, async composables, SSR support, i18n, accessibility tools — this is not “nostalgia jQuery”.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Pragmatic&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It feels built for developers who actually want to get things done.&lt;/p&gt;

&lt;p&gt;And that last point matters a lot to me.&lt;/p&gt;

&lt;p&gt;Because sometimes frontend tooling feels like it was designed primarily to create conference talks.&lt;/p&gt;

&lt;p&gt;bQuery feels more like it was designed to solve real problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Ecosystem breadth: more than just selectors
&lt;/h2&gt;

&lt;p&gt;One of the strongest things in your previous bQuery article was how clearly it showed the ecosystem breadth. bQuery is not just core DOM helpers — it spans modules for &lt;strong&gt;routing, global store management, forms, i18n, accessibility, drag-and-drop, media helpers, plugins, devtools, testing, and SSR&lt;/strong&gt;. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That matters because it means the project can scale with your needs.&lt;/p&gt;

&lt;p&gt;You can start small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“I just want cleaner DOM utilities”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And later move into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reactive state&lt;/li&gt;
&lt;li&gt;reusable components&lt;/li&gt;
&lt;li&gt;shared stores&lt;/li&gt;
&lt;li&gt;localized UI&lt;/li&gt;
&lt;li&gt;accessible interactions&lt;/li&gt;
&lt;li&gt;server-rendered output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without switching mental models every five minutes.&lt;/p&gt;

&lt;p&gt;That’s a pretty compelling story.&lt;/p&gt;




&lt;h2&gt;
  
  
  🆕 Why write about 1.9.0 specifically?
&lt;/h2&gt;

&lt;p&gt;Because version bumps are only interesting if they reflect maturity.&lt;/p&gt;

&lt;p&gt;And that’s the real point here.&lt;/p&gt;

&lt;p&gt;For me, &lt;strong&gt;1.9.0&lt;/strong&gt; is less about “look, number bigger” and more about this project continuing to feel like a serious, coherent toolkit rather than a random utility collection. The npm package exists as &lt;code&gt;@bquery/bquery&lt;/code&gt;, the source is maintained in the &lt;code&gt;bQuery/bQuery&lt;/code&gt; GitHub repository, and there’s also an official project site available. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7?utm_source=openai"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That coherence is what makes a package worth adopting.&lt;/p&gt;

&lt;p&gt;A lot of libraries have nice APIs in isolated examples.&lt;br&gt;&lt;br&gt;
Far fewer feel like they have a real philosophy and an ecosystem that fits together.&lt;/p&gt;

&lt;p&gt;bQuery increasingly does.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Who should use bQuery?
&lt;/h2&gt;

&lt;p&gt;I’d especially recommend taking a look if you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a developer who likes &lt;strong&gt;vanilla JS, but wants better ergonomics&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;someone building &lt;strong&gt;small to medium-sized frontend apps&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;into &lt;strong&gt;Web Components&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;doing &lt;strong&gt;progressive enhancement&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;tired of framework overhead for simpler projects&lt;/li&gt;
&lt;li&gt;looking for a &lt;strong&gt;modern, modular toolkit&lt;/strong&gt; instead of a monolithic solution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would especially keep it on my radar for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dashboard tools&lt;/li&gt;
&lt;li&gt;admin panels&lt;/li&gt;
&lt;li&gt;widgets&lt;/li&gt;
&lt;li&gt;browser tools&lt;/li&gt;
&lt;li&gt;static sites with interactive islands&lt;/li&gt;
&lt;li&gt;component libraries based on native custom elements&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  😅 Who is it &lt;em&gt;not&lt;/em&gt; for?
&lt;/h2&gt;

&lt;p&gt;Let’s be fair.&lt;/p&gt;

&lt;p&gt;If your team already has a deeply established framework ecosystem with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strict conventions&lt;/li&gt;
&lt;li&gt;internal tooling&lt;/li&gt;
&lt;li&gt;existing component libraries&lt;/li&gt;
&lt;li&gt;SSR infra&lt;/li&gt;
&lt;li&gt;testing patterns&lt;/li&gt;
&lt;li&gt;onboarding optimized around one framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…then bQuery may not replace that.&lt;/p&gt;

&lt;p&gt;And that’s okay.&lt;/p&gt;

&lt;p&gt;Not every tool has to replace everything.&lt;/p&gt;

&lt;p&gt;Sometimes being the &lt;strong&gt;best fit for a certain class of projects&lt;/strong&gt; is more valuable than pretending to be universal.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 My honest takeaway
&lt;/h2&gt;

&lt;p&gt;What I like most about bQuery is that it feels like it respects both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;web platform&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;and the &lt;strong&gt;developer’s time&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a rare combo.&lt;/p&gt;

&lt;p&gt;It gives you modern frontend capabilities without acting like the browser is an annoying implementation detail.&lt;/p&gt;

&lt;p&gt;And it gives you structure without forcing a whole religion on you.&lt;/p&gt;

&lt;p&gt;That alone makes it worth paying attention to.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Check it out
&lt;/h2&gt;

&lt;p&gt;If you want to explore it yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;npm: &lt;code&gt;@bquery/bquery&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;code&gt;bQuery/bQuery&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;docs / website: &lt;code&gt;bquery.flausch-code.de&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are the official package, repository, and project site references you shared for this article request. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7?utm_source=openai"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 TL;DR
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;bQuery 1.9.0&lt;/strong&gt; continues to be one of the more interesting “modern web without unnecessary drama” libraries out there.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jQuery-like DOM ergonomics&lt;/li&gt;
&lt;li&gt;signals-based reactivity&lt;/li&gt;
&lt;li&gt;async composables&lt;/li&gt;
&lt;li&gt;typed Web Components&lt;/li&gt;
&lt;li&gt;modular architecture&lt;/li&gt;
&lt;li&gt;platform-first design&lt;/li&gt;
&lt;li&gt;progressively adoptable APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If vanilla JavaScript had a glow-up, learned modern reactivity, embraced Web Components, and started making better life decisions, it would probably look a lot like bQuery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Peace out,&lt;br&gt;&lt;br&gt;
— Josun&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Meet bQuery: a TypeScript-first DOM library with jQuery-style chaining, reactive APIs, zero runtime deps, and modern web features out of the box. #TypeScript #WebDev

bquery.flausch-code.de</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Mon, 06 Apr 2026 11:38:47 +0000</pubDate>
      <link>https://dev.to/josunlp/meet-bquery-a-typescript-first-dom-library-with-jquery-style-chaining-reactive-apis-zero-runtime-2400</link>
      <guid>https://dev.to/josunlp/meet-bquery-a-typescript-first-dom-library-with-jquery-style-chaining-reactive-apis-zero-runtime-2400</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__hidden-navigation-link"&gt;bQuery.js 🥂 The jQuery for the Modern Web Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3426234" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" id="article-link-3426234"&gt;
          bQuery.js 🥂 The jQuery for the Modern Web Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Wed, 01 Apr 2026 13:04:43 +0000</pubDate>
      <link>https://dev.to/josunlp/-2efg</link>
      <guid>https://dev.to/josunlp/-2efg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__hidden-navigation-link"&gt;bQuery.js 🥂 The jQuery for the Modern Web Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3426234" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" id="article-link-3426234"&gt;
          bQuery.js 🥂 The jQuery for the Modern Web Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Mon, 30 Mar 2026 23:21:50 +0000</pubDate>
      <link>https://dev.to/josunlp/-4km2</link>
      <guid>https://dev.to/josunlp/-4km2</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__hidden-navigation-link"&gt;bQuery.js 🥂 The jQuery for the Modern Web Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3426234" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" id="article-link-3426234"&gt;
          bQuery.js 🥂 The jQuery for the Modern Web Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>bQuery.js 🥂 The jQuery for the Modern Web Platform</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Sun, 29 Mar 2026 17:04:45 +0000</pubDate>
      <link>https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7</link>
      <guid>https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7</guid>
      <description>&lt;p&gt;&lt;em&gt;A deep-dive into the modular, zero-build frontend framework that bridges the gap between vanilla JavaScript and full-blown frameworks&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Remember jQuery? That legendary library that made DOM manipulation actually enjoyable back in the day? Well, times have changed, browsers became smarter, the web platform grew up, and build toolchains ballooned into something that requires a PhD to configure properly.&lt;/p&gt;

&lt;p&gt;But here's the thing: sometimes you just want to grab an element, wire up some reactive state, and get on with your life. No Vite config, no &lt;code&gt;node_modules&lt;/code&gt; rabbit hole, no framework-specific mental model to internalize. Just... JavaScript. On the web. Like the good ol' days, but modern.&lt;/p&gt;

&lt;p&gt;That's exactly where &lt;strong&gt;bQuery.js&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;bQuery (v1.7.0 as of this writing) describes itself as &lt;em&gt;"the jQuery for the modern web platform"&lt;/em&gt; and it earns that title. It takes the directness and ergonomics of jQuery and layers on signals-based reactivity, async data composables, native Web Components, motion, forms, i18n, accessibility primitives, drag-and-drop, SSR, and a whole lot more. All of it modular. All of it progressively adoptable.&lt;/p&gt;

&lt;p&gt;Let's break it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What Is bQuery?&lt;/li&gt;
&lt;li&gt;Getting Started Zero Build, No Excuses&lt;/li&gt;
&lt;li&gt;The Core API Good Old DOM Manipulation&lt;/li&gt;
&lt;li&gt;Reactive Primitives Signals All the Way Down&lt;/li&gt;
&lt;li&gt;Async Data &amp;amp; Fetching&lt;/li&gt;
&lt;li&gt;Building Web Components with bQuery&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@bquery/ui&lt;/code&gt; The Default Component Library&lt;/li&gt;
&lt;li&gt;The Broader Ecosystem at a Glance&lt;/li&gt;
&lt;li&gt;When Should You Reach for bQuery?&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. What Is bQuery?
&lt;/h2&gt;

&lt;p&gt;bQuery is a modular JavaScript/TypeScript library published under &lt;code&gt;@bquery/bquery&lt;/code&gt; on npm. Its philosophy can be summed up in three bullet points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero build required&lt;/strong&gt; works via CDN or ES modules straight in the browser; Vite is optional&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure by default&lt;/strong&gt; sanitized DOM operations and Trusted Types compatibility out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive&lt;/strong&gt; import only what you need, add complexity only where you need it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The package is split into focused submodules so you never pay for what you don't use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;core&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selectors, DOM manipulation, events, utilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reactive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signals, computed, effects, async composables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;component&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Typed Web Components with Shadow DOM control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;motion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transitions, FLIP, springs, parallax, typewriter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;security&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sanitization, Trusted Types, CSP helpers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;platform&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Storage, cookies, cache, page meta, announcer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;router&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SPA routing with guards and declarative links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;store&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signal-based global state with persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;forms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reactive form state and validators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;i18n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Locale, translations, pluralization, Intl formatting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a11y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Focus traps, skip links, live regions, media audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dnd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Draggable, drop zones, sortable lists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;media&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport, network, battery, clipboard wrappers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom directive and component registration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;devtools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signal/store/component inspection at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Component mounts, mock signals, async assertions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Server-side rendering with hydration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's a lot of ground covered and yet the entry point stays clean because you only import what you actually touch.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Getting Started Zero Build, No Excuses
&lt;/h2&gt;

&lt;p&gt;The fastest way to try bQuery is dropping a &lt;code&gt;&amp;lt;script type="module"&amp;gt;&lt;/code&gt; into an HTML file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;bQuery Demo&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"counter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Count: 0&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/@bquery/bquery@1/dist/full.es.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nf"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Count: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No build step. No config. Reactive state, DOM manipulation, and event handling in ~10 lines. If that doesn't put a smile on your face, I don't know what will.&lt;/p&gt;

&lt;p&gt;For project-based setups you install it the usual way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @bquery/bquery
&lt;span class="c"&gt;# or&lt;/span&gt;
pnpm add @bquery/bquery
&lt;span class="c"&gt;# or&lt;/span&gt;
bun add @bquery/bquery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then import from the main entry point or directly from individual submodules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Everything from one place&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Or surgically pick submodules&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useFetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;registerDefaultComponents&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. The Core API Good Old DOM Manipulation
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;core&lt;/code&gt; module is the jQuery-familiar part of bQuery. You get &lt;code&gt;$&lt;/code&gt; for single elements and &lt;code&gt;$$&lt;/code&gt; for collections. Both return wrapper objects with a chainable API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Single element throws if not found&lt;/span&gt;
&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;loaded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;css&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rebeccapurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.2rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, bQuery!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Multiple elements&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggleClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The single-element wrapper (&lt;code&gt;BQueryElement&lt;/code&gt;) covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class/attribute helpers&lt;/strong&gt;: &lt;code&gt;addClass&lt;/code&gt;, &lt;code&gt;removeClass&lt;/code&gt;, &lt;code&gt;toggleClass&lt;/code&gt;, &lt;code&gt;attr&lt;/code&gt;, &lt;code&gt;removeAttr&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;prop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content&lt;/strong&gt;: &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt; (sanitized by default!), &lt;code&gt;htmlUnsafe&lt;/code&gt;, &lt;code&gt;append&lt;/code&gt;, &lt;code&gt;prepend&lt;/code&gt;, &lt;code&gt;before&lt;/code&gt;, &lt;code&gt;after&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibility&lt;/strong&gt;: &lt;code&gt;show&lt;/code&gt;, &lt;code&gt;hide&lt;/code&gt;, &lt;code&gt;toggle&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events&lt;/strong&gt;: &lt;code&gt;on&lt;/code&gt;, &lt;code&gt;once&lt;/code&gt;, &lt;code&gt;off&lt;/code&gt;, &lt;code&gt;trigger&lt;/code&gt;, &lt;code&gt;delegate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traversal&lt;/strong&gt;: &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;closest&lt;/code&gt;, &lt;code&gt;parent&lt;/code&gt;, &lt;code&gt;children&lt;/code&gt;, &lt;code&gt;siblings&lt;/code&gt;, &lt;code&gt;next&lt;/code&gt;, &lt;code&gt;prev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOM manipulation&lt;/strong&gt;: &lt;code&gt;wrap&lt;/code&gt;, &lt;code&gt;unwrap&lt;/code&gt;, &lt;code&gt;replaceWith&lt;/code&gt;, &lt;code&gt;detach&lt;/code&gt;, &lt;code&gt;scrollTo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form helpers&lt;/strong&gt;: &lt;code&gt;serialize&lt;/code&gt;, &lt;code&gt;serializeString&lt;/code&gt;, &lt;code&gt;val&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions&lt;/strong&gt;: &lt;code&gt;rect&lt;/code&gt;, &lt;code&gt;offset&lt;/code&gt;, &lt;code&gt;outerWidth&lt;/code&gt;, &lt;code&gt;outerHeight&lt;/code&gt;, &lt;code&gt;position&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice that &lt;code&gt;html()&lt;/code&gt; is sanitized by default. That's the "secure by default" principle in practice you have to explicitly call &lt;code&gt;htmlUnsafe()&lt;/code&gt; to bypass it. A small thing that prevents a whole class of XSS bugs.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;core&lt;/code&gt; module also ships a solid utility belt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;throttle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;utils&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;saved!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cancel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// cancelable&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "component-xyz123"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// { a: 1, b: 2 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilities include &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;pick&lt;/code&gt;, &lt;code&gt;omit&lt;/code&gt;, &lt;code&gt;slugify&lt;/code&gt;, &lt;code&gt;truncate&lt;/code&gt;, &lt;code&gt;chunk&lt;/code&gt;, &lt;code&gt;flatten&lt;/code&gt;, &lt;code&gt;compact&lt;/code&gt;, &lt;code&gt;unique&lt;/code&gt;, &lt;code&gt;randomInt&lt;/code&gt;, &lt;code&gt;clamp&lt;/code&gt;, and a full suite of type guards (&lt;code&gt;isString&lt;/code&gt;, &lt;code&gt;isElement&lt;/code&gt;, &lt;code&gt;isPromise&lt;/code&gt;, etc.). It's the kind of utility layer that means you actually &lt;em&gt;don't&lt;/em&gt; need lodash.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Reactive Primitives Signals All the Way Down
&lt;/h2&gt;

&lt;p&gt;This is where bQuery steps firmly into modern territory. The reactive module gives you fine-grained reactivity through signals the same primitive that's now baked into Angular, Solid, and Preact signals.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Doe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Computed values are lazy and cached&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Effects run immediately, re-run on dependency change&lt;/span&gt;
&lt;span class="nf"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Batch multiple updates into a single notification pass&lt;/span&gt;
&lt;span class="nf"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Smith&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Watch with old/new value comparison&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldVal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Changed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;oldVal&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; â†’ &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;newVal&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// unsubscribe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things worth highlighting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;signal.peek()&lt;/code&gt;&lt;/strong&gt; reads the value without creating a reactive dependency. Useful when you need to read inside an effect without it re-subscribing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;signal.update(fn)&lt;/code&gt;&lt;/strong&gt; updates based on the current value handy for immutable patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;signal.dispose()&lt;/code&gt;&lt;/strong&gt; removes all subscribers and prevents memory leaks. Important for long-lived apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;readonly(signal)&lt;/code&gt;&lt;/strong&gt; creates a read-only view. Great for exposing reactive state from a store without allowing external mutation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;untrack(() =&amp;gt; ...)&lt;/code&gt;&lt;/strong&gt; reads signals inside an effect without tracking them as dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;persistedSignal&lt;/code&gt;&lt;/strong&gt; syncs a signal to &lt;code&gt;localStorage&lt;/code&gt; automatically, with graceful fallbacks for SSR and Safari private mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;persistedSignal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;persistedSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;theme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saved to localStorage automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;linkedSignal&lt;/code&gt;&lt;/strong&gt; creates a writable computed you provide both a getter and a setter, so writes can fan out to multiple underlying signals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;linkedSignal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lovelace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;linkedSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nextFirst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nextLast&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextFirst&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextLast&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Grace Hopper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Fans out to first and last&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Errors inside effects are caught and logged rather than crashing the reactive system subsequent updates keep working. That's a nice resilience property you don't always get for free.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Async Data &amp;amp; Fetching
&lt;/h2&gt;

&lt;p&gt;Managing loading states, errors, and async lifecycles is boilerplate-heavy in vanilla JS. bQuery abstracts all of that into two composables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;useAsyncData&lt;/code&gt;&lt;/strong&gt; wraps any async function in a signal-based lifecycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useAsyncData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useAsyncData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;        &lt;span class="c1"&gt;// re-run when userId changes&lt;/span&gt;
    &lt;span class="na"&gt;defaultValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Reactive state you can bind directly to the DOM&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// 'idle' | 'pending' | 'success' | 'error'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// boolean&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// the resolved data&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Error | null&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// manually trigger&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;         &lt;span class="c1"&gt;// reset everything&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;       &lt;span class="c1"&gt;// stop watchers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;useFetch&lt;/code&gt;&lt;/strong&gt; builds on top of that and adds HTTP niceties base URLs, query params, custom headers, automatic JSON serialization, and pluggable response parsers (&lt;code&gt;json&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;blob&lt;/code&gt;, &lt;code&gt;arrayBuffer&lt;/code&gt;, &lt;code&gt;formData&lt;/code&gt;, &lt;code&gt;response&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useFetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bearer my-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For shared defaults across multiple requests, &lt;code&gt;createUseFetch&lt;/code&gt; acts as a factory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createUseFetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useApi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUseFetch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern is really clean for larger apps where you want a pre-configured fetch instance rather than repeating base URLs everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Building Web Components with bQuery
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;component&lt;/code&gt; module is where bQuery really shines for component-driven architectures. It wraps the native Custom Elements API with typed props, optional internal state, scoped reactivity, and a sanitized render function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/default-avatar.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;clicks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
    .card { display: grid; gap: 0.5rem; padding: 1rem; border-radius: 8px; }
    .active { border: 2px solid #4f46e5; }
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-card mounted&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;disconnected&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-card removed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;emit&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`
      &amp;lt;button
        class="card &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"
        &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;disabled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
        @click=&lt;/span&gt;&lt;span class="p"&gt;${()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clicks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clicks&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;card-clicked&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;
      &amp;gt;
        &amp;lt;img src="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" alt="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" /&amp;gt;
        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/strong&amp;gt;
        &amp;lt;span&amp;gt;Clicked &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clicks&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; times&amp;lt;/span&amp;gt;
      &amp;lt;/button&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Usage --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;user-card&lt;/span&gt; &lt;span class="na"&gt;username=&lt;/span&gt;&lt;span class="s"&gt;"Jonas"&lt;/span&gt; &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/user-card&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things to appreciate here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Props are typed and coerced automatically.&lt;/strong&gt; Strings stay strings, numbers get &lt;code&gt;Number()&lt;/code&gt; called on them, booleans understand &lt;code&gt;'true'&lt;/code&gt;, &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;'1'&lt;/code&gt;, &lt;code&gt;'false'&lt;/code&gt;, &lt;code&gt;'0'&lt;/code&gt;. Objects get &lt;code&gt;JSON.parse&lt;/code&gt;d. You can also add a &lt;code&gt;validator&lt;/code&gt; function to enforce invariants at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The render output is sanitized before being written to the Shadow DOM.&lt;/strong&gt; You get security by default with an explicit opt-in mechanism (&lt;code&gt;safeHtml&lt;/code&gt;, &lt;code&gt;trusted&lt;/code&gt;) when you need to pass sanitized fragments through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shadow DOM mode is configurable.&lt;/strong&gt; Open shadow root by default, but you can go closed or render directly into light DOM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inline-banner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// renders in light DOM&lt;/span&gt;
  &lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;p class="banner"&amp;gt;No shadow needed here&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lifecycle hooks&lt;/strong&gt; cover everything you need: &lt;code&gt;beforeMount&lt;/code&gt;, &lt;code&gt;connected&lt;/code&gt;, &lt;code&gt;beforeUpdate&lt;/code&gt; (return &lt;code&gt;false&lt;/code&gt; to cancel a re-render), &lt;code&gt;updated&lt;/code&gt;, &lt;code&gt;disconnected&lt;/code&gt;, &lt;code&gt;onError&lt;/code&gt;, &lt;code&gt;onAdopted&lt;/code&gt;, and &lt;code&gt;onAttributeChanged&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scoped reactive helpers&lt;/strong&gt; (&lt;code&gt;useSignal&lt;/code&gt;, &lt;code&gt;useComputed&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;) create component-local reactive resources that are cleaned up automatically on disconnect no manual cleanup needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;live-timer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;seconds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disconnected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;p&amp;gt;Elapsed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;s&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;External signals can drive re-renders&lt;/strong&gt; via the &lt;code&gt;signals&lt;/code&gt; option, keeping component updates predictable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;themeClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`theme-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;theme-badge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;themeClass&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;signals&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;span class="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;themeClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;Current theme&amp;lt;/span&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. &lt;code&gt;@bquery/ui&lt;/code&gt; The Default Component Library
&lt;/h2&gt;

&lt;p&gt;bQuery ships a companion component library that's registered through &lt;code&gt;registerDefaultComponents()&lt;/code&gt;. It's a small, zero-dependency set of native UI primitives no external CSS framework required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineBqueryConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/platform&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;registerDefaultComponents&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery/component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Configure a custom prefix (default is 'ui')&lt;/span&gt;
&lt;span class="nf"&gt;defineBqueryConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;transitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;skipOnReducedMotion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;registerDefaultComponents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// {&lt;/span&gt;
&lt;span class="c1"&gt;//   button: 'ui-button',&lt;/span&gt;
&lt;span class="c1"&gt;//   card: 'ui-card',&lt;/span&gt;
&lt;span class="c1"&gt;//   input: 'ui-input',&lt;/span&gt;
&lt;span class="c1"&gt;//   textarea: 'ui-textarea',&lt;/span&gt;
&lt;span class="c1"&gt;//   checkbox: 'ui-checkbox'&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The available primitives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-button&lt;/code&gt;&lt;/strong&gt; pill-shaped button with &lt;code&gt;variant&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, and &lt;code&gt;disabled&lt;/code&gt; props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-card&lt;/code&gt;&lt;/strong&gt; container with optional &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, and &lt;code&gt;elevated&lt;/code&gt; props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-input&lt;/code&gt;&lt;/strong&gt; labeled text input that emits &lt;code&gt;input&lt;/code&gt; events with &lt;code&gt;{ value }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-textarea&lt;/code&gt;&lt;/strong&gt; labeled textarea, same event contract as &lt;code&gt;ui-input&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-checkbox&lt;/code&gt;&lt;/strong&gt; labeled checkbox that emits &lt;code&gt;change&lt;/code&gt; events with &lt;code&gt;{ checked }&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These components use regular HTML slots and bubble custom events, so they play nicely with forms, routers, and shadow DOM boundaries. You can compose them directly in your markup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ui-card&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Create Account"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-input&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ui-input&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-input&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ui-input&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-checkbox&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Accept terms"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ui-checkbox&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-button&lt;/span&gt; &lt;span class="na"&gt;variant=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign Up&lt;span class="nt"&gt;&amp;lt;/ui-button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ui-card&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And wire them up reactively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ui-input[label="Name"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;CustomEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prefix system via &lt;code&gt;defineBqueryConfig&lt;/code&gt; is a nice touch for teams with strict naming conventions, or for avoiding collisions when integrating bQuery components into an existing design system.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. The Broader Ecosystem at a Glance
&lt;/h2&gt;

&lt;p&gt;bQuery v1.7.0 covers a surprising amount of ground beyond what we've walked through. Here's a quick tour of the other modules:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Router&lt;/strong&gt; full SPA routing with constrained params, guards, redirects, and declarative &lt;code&gt;&amp;lt;bq-link&amp;gt;&lt;/code&gt; elements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store&lt;/strong&gt; signal-based global state with persistence, migrations, and action lifecycle hooks. Think a lightweight Pinia, but framework-agnostic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt; declarative &lt;code&gt;bq-*&lt;/code&gt; attribute directives (&lt;code&gt;bq-text&lt;/code&gt;, &lt;code&gt;bq-show&lt;/code&gt;, &lt;code&gt;bq-class&lt;/code&gt;, etc.) for template-style binding without a full component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motion&lt;/strong&gt; transitions, FLIP animations, springs, parallax, typewriter effects, and scroll-linked animations. Respects &lt;code&gt;prefers-reduced-motion&lt;/code&gt; by default when configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i18n&lt;/strong&gt; reactive locale state, nested translation keys, pluralization rules, and Intl-based date/number/relative-time formatting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a11y&lt;/strong&gt; focus traps, skip navigation links, live region announcers, and audit helpers that flag missing ARIA attributes at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DnD&lt;/strong&gt; make any element draggable, define drop zones, build sortable lists without reaching for a third-party library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt; &lt;code&gt;renderComponent&lt;/code&gt;, &lt;code&gt;fireEvent&lt;/code&gt;, &lt;code&gt;waitFor&lt;/code&gt; utilities that mirror what you'd expect from Testing Library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSR&lt;/strong&gt; &lt;code&gt;renderToString&lt;/code&gt; for server-side HTML generation and &lt;code&gt;hydrateMount&lt;/code&gt; for seamlessly picking up where the server left off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storybook helpers&lt;/strong&gt; &lt;code&gt;storyHtml()&lt;/code&gt; and &lt;code&gt;when()&lt;/code&gt; for writing safe Storybook stories with boolean attribute shorthand (&lt;code&gt;?disabled=${true}&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  9. When Should You Reach for bQuery?
&lt;/h2&gt;

&lt;p&gt;bQuery isn't trying to replace React, Vue, or Svelte for large-scale applications with complex component trees and heavy state management. It's solving a different problem.&lt;/p&gt;

&lt;p&gt;Reach for bQuery when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want reactivity and component primitives &lt;strong&gt;without a build pipeline&lt;/strong&gt; prototypes, experiments, browser extensions, internal tools&lt;/li&gt;
&lt;li&gt;You're writing &lt;strong&gt;vanilla JS/TS&lt;/strong&gt; and want jQuery's ergonomics plus modern signal-based reactivity&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;native Web Components&lt;/strong&gt; with typed props and a sane lifecycle, but don't want to set up Lit or Stencil&lt;/li&gt;
&lt;li&gt;You're building &lt;strong&gt;progressively enhanced&lt;/strong&gt; pages where a CDN import is all you need&lt;/li&gt;
&lt;li&gt;You want to ship &lt;strong&gt;accessible, secure-by-default&lt;/strong&gt; UI without bolting on extra libraries for sanitization, focus management, and ARIA&lt;/li&gt;
&lt;li&gt;You're working on a &lt;strong&gt;small-to-medium project&lt;/strong&gt; where a full SPA framework would be overkill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's also genuinely useful as a companion in larger apps you could use bQuery's reactive core alongside an existing codebase for specific interactive islands without committing to a full rewrite.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;p&gt;bQuery v1.7.0 is one of those rare libraries that manages to feel both nostalgic and completely modern at the same time. It channels the simplicity of jQuery while embracing everything the web platform has become signals, Web Components, Trusted Types, &lt;code&gt;fetch&lt;/code&gt;, Shadow DOM, the whole lot.&lt;/p&gt;

&lt;p&gt;The zero-build path alone makes it worth knowing about. Being able to drop a single CDN import into an HTML file and immediately have signals, reactive DOM manipulation, typed components, and async data composables is genuinely impressive.&lt;/p&gt;

&lt;p&gt;If you've been eyeing signals-based reactivity but felt the existing frameworks were too opinionated or too heavyweight for your use case, bQuery is absolutely worth exploring.&lt;/p&gt;

&lt;p&gt;Give it a spin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📒¦ npm: &lt;a href="https://www.npmjs.com/package/@bquery/bquery" rel="noopener noreferrer"&gt;&lt;code&gt;@bquery/bquery&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 – Docs: &lt;a href="https://bquery.flausch-code.de/" rel="noopener noreferrer"&gt;bquery.flausch-code.de&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! If you have questions or feedback, drop them in the comments. And if you're using bQuery in a project, I'd love to hear about it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>QRify v1.3: The Privacy-First QR Code Generator Got Even Better! 🔐</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Sat, 06 Dec 2025 15:29:55 +0000</pubDate>
      <link>https://dev.to/josunlp/qrify-v13-the-privacy-first-qr-code-generator-got-even-better-5e9j</link>
      <guid>https://dev.to/josunlp/qrify-v13-the-privacy-first-qr-code-generator-got-even-better-5e9j</guid>
      <description>&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;Remember my rant about &lt;a href="https://dev.to/josunlp/shady-qr-code-generator-pages-ugh-58c0"&gt;shady QR code generator pages&lt;/a&gt;? You know, the ones that want your subscription, your login, your firstborn child, and probably your soul just to generate a simple QR code?&lt;/p&gt;

&lt;p&gt;Well, I didn't just complain about it — I built something. And now it's even better.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 Introducing: QRify v1.3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/JosunLP/qr-code-generator" rel="noopener noreferrer"&gt;QRify&lt;/a&gt; started as a quick weekend project born out of frustration. But you know how it goes — you start with "just a simple QR code generator" and suddenly you're knee-deep in i18n configuration files at 2 AM, translating "Download" into 27 languages.&lt;/p&gt;

&lt;p&gt;No regrets though. It was worth it.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Check It Out
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo&lt;/strong&gt;: &lt;a href="https://qr.flausch-code.de/" rel="noopener noreferrer"&gt;qr.flausch-code.de/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code repo&lt;/strong&gt;: &lt;a href="https://github.com/JosunLP/qr-code-generator" rel="noopener noreferrer"&gt;GitHub - JosunLP/qr-code-generator&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Key Features
&lt;/h2&gt;

&lt;p&gt;Let me break down what QRify can do for you:&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Multiple QR Code Types
&lt;/h3&gt;

&lt;p&gt;Not just boring text QR codes. QRify supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt; — The classic. Type anything, get a QR code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt; — Scannable links, no fuss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vCard&lt;/strong&gt; — Full business cards! Name, phone, email, address, company, website — the whole package.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WiFi&lt;/strong&gt; — Share your network credentials without awkwardly spelling out your password.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt; — Pre-composed emails with recipient, subject, and body.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📥 Export Formats Galore
&lt;/h3&gt;

&lt;p&gt;Choose your poison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vector&lt;/th&gt;
&lt;th&gt;Raster&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SVG&lt;/td&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;JPEG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;GIF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;TIFF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;WebP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SVG is my personal favorite — it scales infinitely without getting pixelated. Perfect for print.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Privacy-First (For Real)
&lt;/h3&gt;

&lt;p&gt;This is the big one. QRify runs &lt;strong&gt;100% client-side&lt;/strong&gt;. Your data never leaves your browser. Ever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ No tracking&lt;/li&gt;
&lt;li&gt;❌ No analytics&lt;/li&gt;
&lt;li&gt;❌ No login required&lt;/li&gt;
&lt;li&gt;❌ No subscription&lt;/li&gt;
&lt;li&gt;❌ No server-side processing&lt;/li&gt;
&lt;li&gt;✅ Just pure, unadulterated QR code generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't build this to harvest your data. I built it because I needed a tool that respects privacy.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 27 Languages
&lt;/h3&gt;

&lt;p&gt;Yeah, you read that right. &lt;strong&gt;Twenty-seven&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;QRify auto-detects your browser language and switches automatically. Or you can pick manually from the dropdown. We've got everything from English to Arabic, Japanese to Ukrainian, and a bunch more in between.&lt;/p&gt;

&lt;p&gt;Here's the full list:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Swedish, Chinese, Japanese, Korean, Turkish, Arabic, Hindi, Czech, Greek, Hungarian, Romanian, Ukrainian, Vietnamese, Thai, Indonesian, Danish, Norwegian, Finnish&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Did I translate all of these myself? Let's just say I had some... assistance. 😅 But hey, if you spot a weird translation, PRs are welcome!&lt;/p&gt;

&lt;h3&gt;
  
  
  📱 Progressive Web App (PWA)
&lt;/h3&gt;

&lt;p&gt;QRify is installable. On your phone. On your desktop. Works offline after the first load. Gets automatic updates.&lt;/p&gt;

&lt;p&gt;It's basically an app without the App Store drama.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Tech Stack
&lt;/h2&gt;

&lt;p&gt;For my fellow devs who care about the nerdy details:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vue 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontend framework (Composition API, baby!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Because &lt;code&gt;any&lt;/code&gt; is not a type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build tool &amp;amp; dev server (fast as heck)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tailwind CSS 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Utility-first styling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vue-i18n&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internationalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;qrcode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The actual QR code magic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vite-plugin-pwa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PWA support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bun&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runtime &amp;amp; package manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I went with Vue 3 because, well, I'm a Vue person. You probably figured that out by now if you've read my other articles. The Composition API makes the component logic so much cleaner compared to the old Options API days.&lt;/p&gt;

&lt;p&gt;Tailwind CSS 4 is the new hotness, and combined with Vite's speed, the development experience is &lt;em&gt;chef's kiss&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;p&gt;Want to run it locally or contribute? Here's how:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repo&lt;/span&gt;
git clone https://github.com/JosunLP/qr-code-generator.git
&lt;span class="nb"&gt;cd &lt;/span&gt;qr-code-generator

&lt;span class="c"&gt;# Install dependencies (I recommend Bun, but npm works too)&lt;/span&gt;
bun &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Start the dev server&lt;/span&gt;
bun run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You're up and running at &lt;code&gt;http://localhost:5173&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ What's Next?
&lt;/h2&gt;

&lt;p&gt;I've got some ideas brewing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More QR code types (SMS, geo-location, calendar events?)&lt;/li&gt;
&lt;li&gt;Custom styling options (colors, logos in the center?)&lt;/li&gt;
&lt;li&gt;Batch generation&lt;/li&gt;
&lt;li&gt;History/favorites (stored locally, of course)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But honestly, I'm open to suggestions. What would make QRify more useful for you?&lt;/p&gt;




&lt;h2&gt;
  
  
  🙌 Contribution
&lt;/h2&gt;

&lt;p&gt;This is open source, and I genuinely appreciate contributions. Whether it's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 Bug fixes&lt;/li&gt;
&lt;li&gt;✨ New features&lt;/li&gt;
&lt;li&gt;🌍 Translation improvements&lt;/li&gt;
&lt;li&gt;📝 Documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just open a PR or an issue, and let's make it happen.&lt;/p&gt;

&lt;p&gt;The repo: &lt;a href="https://github.com/JosunLP/qr-code-generator" rel="noopener noreferrer"&gt;github.com/JosunLP/qr-code-generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful, maybe drop a ⭐ on GitHub? It helps more than you'd think!&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QRify&lt;/strong&gt; is a free, open-source QR code generator&lt;/li&gt;
&lt;li&gt;Supports text, URL, vCard, WiFi, and email QR codes&lt;/li&gt;
&lt;li&gt;Exports to SVG, PNG, JPEG, GIF, TIFF, and WebP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;27 languages&lt;/strong&gt; with auto-detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% client-side&lt;/strong&gt; — no tracking, no data collection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA&lt;/strong&gt; — install it, use it offline&lt;/li&gt;
&lt;li&gt;Built with Vue 3, TypeScript, Tailwind CSS 4, and Vite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop using shady QR code generators that want your data. Use QRify instead.&lt;/p&gt;

&lt;p&gt;Peace out,&lt;br&gt;
— Josun&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tetris for Logistics: solving the 3D Bin Packing Problem with Rust 🦀</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Fri, 05 Dec 2025 09:47:08 +0000</pubDate>
      <link>https://dev.to/josunlp/tetris-for-logistics-solving-the-3d-bin-packing-problem-with-rust-42ag</link>
      <guid>https://dev.to/josunlp/tetris-for-logistics-solving-the-3d-bin-packing-problem-with-rust-42ag</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hi everyone! 👋&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You know what’s frustrating? Opening a huge delivery box just to find a tiny item rattling around inside, surrounded by a mountain of bubble wrap. It’s inefficient, it’s bad for the environment, and honestly, it just feels wrong.&lt;/p&gt;

&lt;p&gt;Or maybe you’ve moved house recently and played "Real Life Tetris" trying to fit everything into the moving truck?&lt;/p&gt;

&lt;p&gt;I decided to tackle this problem the way I love most: &lt;strong&gt;with code.&lt;/strong&gt; 💻&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Introducing: sort-it-now
&lt;/h3&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://github.com/JosunLP/sort-it-now" rel="noopener noreferrer"&gt;sort-it-now&lt;/a&gt;&lt;/strong&gt;, a 3D packing optimizer written in &lt;strong&gt;Rust&lt;/strong&gt;. The goal is simple but powerful: calculate the most efficient way to pack a set of items into a box (or container) and visualize the result.&lt;/p&gt;

&lt;p&gt;It’s basically an algorithm that plays Tetris for you, but in 3D and with much higher stakes (okay, maybe just better efficiency).&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ The Tech Stack
&lt;/h3&gt;

&lt;p&gt;I chose &lt;strong&gt;Rust&lt;/strong&gt; 🦀 for this project because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Performance:&lt;/strong&gt; When you are calculating 3D space and iterating through thousands of possibilities, speed matters.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Safety:&lt;/strong&gt; Rust’s memory safety guarantees help prevent silly bugs when dealing with complex data structures.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;It’s awesome:&lt;/strong&gt; Let's be honest, writing Rust just feels good.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ✨ Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Intelligent Optimization:&lt;/strong&gt; It calculates the best fit for your items.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;3D Visualization:&lt;/strong&gt; It’s not just a console output saying "It fits." You get an interactive visualization to see &lt;em&gt;how&lt;/em&gt; it fits.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Open Source:&lt;/strong&gt; Because sharing is caring!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Why I built this
&lt;/h3&gt;

&lt;p&gt;I love projects that bridge the gap between abstract algorithms and real-world visual feedback. &lt;code&gt;sort-it-now&lt;/code&gt; was a playground for me to dive deeper into Rust while solving a classic optimization problem (the &lt;em&gt;Bin Packing Problem&lt;/em&gt;). Plus, visualizing the output makes the math feel "real."&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Check it out
&lt;/h3&gt;

&lt;p&gt;The project is hosted on GitHub. I’d love for you to check it out, give it a spin, or maybe even drop a star if you find it cool! ⭐&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/JosunLP/sort-it-now" rel="noopener noreferrer"&gt;JosunLP/sort-it-now&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 Contribution
&lt;/h3&gt;

&lt;p&gt;I'm always open to feedback. If you have ideas on how to make the packing algorithm even smarter, or if you want to improve the visualization, feel free to open an issue or a pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's stop shipping air and start sorting it now!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Peace out,&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;— Josun&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>opensource</category>
      <category>algorithms</category>
      <category>visualization</category>
    </item>
    <item>
      <title>I Supercharged My UserScript Template: Now with ESLint, Prettier, and Full Mobile Support! 🚀</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Fri, 11 Jul 2025 23:31:30 +0000</pubDate>
      <link>https://dev.to/josunlp/i-supercharged-my-userscript-template-now-with-eslint-prettier-and-full-mobile-support-5ddc</link>
      <guid>https://dev.to/josunlp/i-supercharged-my-userscript-template-now-with-eslint-prettier-and-full-mobile-support-5ddc</guid>
      <description>&lt;p&gt;Hey, dev community!&lt;/p&gt;

&lt;p&gt;I'm super excited to share the latest, and biggest, updates to my &lt;a href="https://github.com/JosunLP/UserScriptProjectTemplate" rel="noopener noreferrer"&gt;UserScript Project Template&lt;/a&gt; on GitHub. I've spent the last few days giving it a major overhaul to modernize the entire development workflow, boost code quality, and—the part I'm most thrilled about—make it fully mobile-ready!&lt;/p&gt;

&lt;p&gt;Let's dive into what's new.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Part 1: A Modern Development Experience
&lt;/h3&gt;

&lt;p&gt;My first goal was to bring the entire development setup up to modern standards. A clean, automated environment is key to writing good code, and this template now has everything you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Quality with ESLint &amp;amp; Prettier&lt;/strong&gt;&lt;br&gt;
Say goodbye to inconsistent code styles! The project now comes pre-configured with ESLint and Prettier to enforce a clean and error-free codebase. I've added &lt;code&gt;.eslintrc.js&lt;/code&gt; and &lt;code&gt;.prettierrc.json&lt;/code&gt; files with solid defaults, full TypeScript support, and custom rules to get you started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beefed-up Scripts &amp;amp; Dependencies&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;package.json&lt;/code&gt; has been revamped with a bunch of new scripts to make life easier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;npm run lint&lt;/code&gt;: Check your code with ESLint.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;npm run format&lt;/code&gt;: Format the entire codebase with Prettier.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;npm run type-check&lt;/code&gt;: Run the TypeScript compiler to check for type errors.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;npm run clean&lt;/code&gt;: Clean up build artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the necessary dev dependencies for ESLint, Prettier, and TypeScript are, of course, included.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modular Architecture &amp;amp; New Utilities&lt;/strong&gt;&lt;br&gt;
The project structure got a significant refactor to be more modular and maintainable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The main application class in &lt;code&gt;src/index.ts&lt;/code&gt; now features a modular architecture, a built-in event system, and examples for using persistent storage and custom styles.&lt;/li&gt;
&lt;li&gt;  New DOM utilities in &lt;code&gt;src/utils/dom.ts&lt;/code&gt; make it a breeze to manipulate elements, inject styles, and check for visibility.&lt;/li&gt;
&lt;li&gt;  A new &lt;code&gt;ExampleModule&lt;/code&gt; in &lt;code&gt;src/modules/example.ts&lt;/code&gt; showcases the event-driven architecture and how to use the new utilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📱 Part 2: The Main Event – Full Mobile Support!
&lt;/h3&gt;

&lt;p&gt;This is the biggest game-changer. UserScripts are no longer just a desktop thing, and this template now fully embraces the mobile web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The New &lt;code&gt;MobileModule&lt;/code&gt; for Touch Gestures&lt;/strong&gt;&lt;br&gt;
At the core of this update is the new &lt;code&gt;MobileModule&lt;/code&gt; (&lt;code&gt;src/modules/mobile.ts&lt;/code&gt;). It implements a robust gesture detection system for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Tap&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Swipe&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pinch&lt;/strong&gt; (zoom in/out)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also handles orientation changes and provides mobile-friendly UI elements right out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic Detection &amp;amp; Adaptation&lt;/strong&gt;&lt;br&gt;
The main app in &lt;code&gt;src/index.ts&lt;/code&gt; now automatically detects if it's running on a mobile device. If it is, it initializes the &lt;code&gt;MobileModule&lt;/code&gt;, loads mobile-specific styles, and listens for mobile events like gestures. This makes your script responsive and touch-optimized without any extra work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated Docs &amp;amp; Metadata&lt;/strong&gt;&lt;br&gt;
To reflect all these new capabilities, I've expanded the &lt;code&gt;README.md&lt;/code&gt; and updated the project's metadata (&lt;code&gt;header.config.json&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;). The documentation now includes details on the mobile utilities, supported browsers, and features like responsive design and safe area handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;These changes make the template a powerful starting point for any UserScript project. You get a modern development environment with top-tier tooling, a clean and scalable architecture, and the versatility to build scripts that work beautifully on both desktop and mobile.&lt;/p&gt;

&lt;p&gt;I'm really proud of how this turned out and I hope you find it useful!&lt;/p&gt;

&lt;p&gt;Feel free to check out the project on GitHub, give it a try, and let me know what you think. I appreciate every star and contribution!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the repo here:&lt;/strong&gt; &lt;a href="https://github.com/JosunLP/UserScriptProjectTemplate" rel="noopener noreferrer"&gt;https://github.com/JosunLP/UserScriptProjectTemplate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding! 🎉&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What I used to use and what I use now. Developer Development in a nutshell!</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Mon, 16 Jun 2025 22:25:04 +0000</pubDate>
      <link>https://dev.to/josunlp/what-i-used-to-use-and-what-i-use-now-developer-development-in-a-nutshell-5cj0</link>
      <guid>https://dev.to/josunlp/what-i-used-to-use-and-what-i-use-now-developer-development-in-a-nutshell-5cj0</guid>
      <description>&lt;p&gt;The world of frontend development is a constantly spinning carousel. As soon as you've mastered one framework, the next "Next Big Thing" is already on the horizon, promising to make everything better, faster, and easier. Looking back on my own journey, I see not just a list of technologies, but a personal development—a story of pragmatism, curiosity, initial aversion, and unexpected affection.&lt;/p&gt;

&lt;p&gt;This article is my personal retrospective. Not an ultimate "This is the best framework" sermon, but an honest reflection on the tools that have shaped my path as a developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  In the beginning there was... SharePoint? And an Angular fork
&lt;/h2&gt;

&lt;p&gt;My journey didn't start in the shiny greenfield project heaven. It began in the pragmatic world of SharePoint on-prem. Anyone who has ever had to develop here knows: it's a discipline of its own. Our tool of choice was not ordinary Angular, but a fork called &lt;strong&gt;SPAngular&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It was specifically optimized to integrate into the complex and sometimes stubborn architecture of SharePoint. Hand on heart: the developer experience was... functional. It was often cumbersome and far from the elegance of modern frameworks. But it got the job done. It allowed us to bring reactive UIs into an environment that wasn't really made for it.&lt;/p&gt;

&lt;p&gt;A typical "Component" back then, simplified, might have looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Imagine a lot of SharePoint-specific boilerplate here&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;spAngularModule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;angular&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mySharePointApp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

&lt;span class="nx"&gt;spAngularModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MyWebPartController&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$scope&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spListService&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;spListService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My Documents&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchDocs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Complex call to a SharePoint service&lt;/span&gt;
      &lt;span class="nx"&gt;spListService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getListItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Document Library&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;$scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;fetchDocs&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking back, it was the perfect, albeit tough, start. It taught me to work within strict boundaries and to find solutions for real business problems, even when the tools weren't ideal.&lt;/p&gt;

&lt;h2&gt;
  
  
  A breath of fresh air: Vue and the magic of Quasar
&lt;/h2&gt;

&lt;p&gt;After the SharePoint era, switching to &lt;strong&gt;Vue.js&lt;/strong&gt; felt like a liberation. Suddenly, everything was so... logical. Single-File Components (&lt;code&gt;.vue&lt;/code&gt; files), the separation of template, script, and style in one file, immediately felt right.&lt;/p&gt;

&lt;p&gt;Together with the &lt;strong&gt;Quasar Framework&lt;/strong&gt;, it was a real power duo. Need a complex, responsive data table? &lt;code&gt;q-table&lt;/code&gt;. A standardized dialog? &lt;code&gt;q-dialog&lt;/code&gt;. Productivity skyrocketed. I could focus on the logic while Quasar took care of the heavy lifting in UI building.&lt;/p&gt;

&lt;p&gt;A simple example that shows the clarity of Vue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"q-pa-md"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;q-btn&lt;/span&gt; &lt;span class="na"&gt;:label=&lt;/span&gt;&lt;span class="s"&gt;"`Clicks: ${count}`"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"increment"&lt;/span&gt; &lt;span class="na"&gt;color=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;scoped&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nc"&gt;.q-pa-md&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vue showed me how much fun development can be when the framework doesn't get in your way but supports you. It was intuitive and powerful at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The great love: Svelte and syntactic sugar
&lt;/h2&gt;

&lt;p&gt;And then came &lt;strong&gt;Svelte&lt;/strong&gt;. Svelte wasn't just another framework, it was a revelation. The idea of not using a virtual DOM and instead generating highly optimized, pure JavaScript code at build time immediately convinced me.&lt;/p&gt;

&lt;p&gt;But what really blew me away was the syntax. It no longer felt like learning a framework. It felt like just writing HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;Reactivity? Just declare a variable with &lt;code&gt;let&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Derived value? No problem!&lt;/span&gt;
  &lt;span class="nl"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Clicked: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;time&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;times&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; * 2 = &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;doubled&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code is so incredibly elegant and readable. No &lt;code&gt;this.setState()&lt;/code&gt;, no &lt;code&gt;.value&lt;/code&gt;, no boilerplate. It's just there and it works. For me, this is the pinnacle of syntactic sugar.&lt;/p&gt;

&lt;p&gt;But there's a catch. As much as I love Svelte, reality catches up with you. The ecosystem is smaller. You don't find a ready-made library for every problem. &lt;strong&gt;SvelteKit&lt;/strong&gt;, the associated meta-framework, is fantastic, but it requires compromises. Sometimes you have to build things yourself for which there are already established solutions in other ecosystems.&lt;/p&gt;

&lt;h2&gt;
  
  
  From foe to friend: My deep dive into React
&lt;/h2&gt;

&lt;p&gt;I admit it openly: I didn't like &lt;strong&gt;React&lt;/strong&gt; at first. JSX felt to me like an unclean mix of HTML and JS. Hooks like &lt;code&gt;useState&lt;/code&gt; seemed cumbersome compared to the magic of Svelte. Why should I write &lt;code&gt;[count, setCount]&lt;/code&gt; when &lt;code&gt;let count&lt;/code&gt; is enough?&lt;/p&gt;

&lt;p&gt;But then came a project that required React with TypeScript. So I had to dive deep—and my opinion changed fundamentally.&lt;/p&gt;

&lt;p&gt;I began to understand the genius behind function components and hooks. The unidirectional data flow architecture makes applications extremely predictable and well testable once they reach a certain complexity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// A side effect that runs every time 'count' changes&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`You clicked &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; times`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;You clicked &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; times&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the real game-changer for me was something else: &lt;strong&gt;AI support&lt;/strong&gt;. Tools like GitHub Copilot seem to &lt;em&gt;think&lt;/em&gt; in React. I describe a component in a comment, and Copilot spits out almost finished, idiomatic React code. Need a complex hook? The suggestions are usually spot on. This productivity boost is simply undeniable in professional everyday life. The huge ecosystem does the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Pragmatism wins, but the heart beats for Svelte
&lt;/h2&gt;

&lt;p&gt;So where am I today? I currently develop my private projects mainly with &lt;strong&gt;React&lt;/strong&gt;. The reason is pure pragmatism. The combination of the gigantic ecosystem, the maturity of the framework, and the phenomenal tooling and AI support simply makes me incredibly productive.&lt;/p&gt;

&lt;p&gt;Every framework on my journey has taught me valuable lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SPAngular&lt;/strong&gt; taught me to solve problems under difficult conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vue&lt;/strong&gt; showed me the joy of a good developer experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; taught me the power of structure, predictability, and a superior ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Svelte&lt;/strong&gt; showed me how elegant and beautiful code can be.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My wish for the future? Broader acceptance for Svelte. I dream of a world where the Svelte ecosystem is so rich that choosing Svelte is not just a matter of the heart, but also of pragmatic reason.&lt;/p&gt;

&lt;p&gt;Until then, for me: The best tool is the one with which you can best get the job done. And sometimes that's not the one you fell in love with at first sight.&lt;/p&gt;

&lt;p&gt;Peace out,&lt;/p&gt;

&lt;p&gt;— Josun&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>programming</category>
      <category>frontend</category>
      <category>development</category>
    </item>
    <item>
      <title>Shady QR Code Generator Pages? Ugh!</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Thu, 09 Jan 2025 09:14:52 +0000</pubDate>
      <link>https://dev.to/josunlp/shady-qr-code-generator-pages-ugh-58c0</link>
      <guid>https://dev.to/josunlp/shady-qr-code-generator-pages-ugh-58c0</guid>
      <description>&lt;p&gt;You know what I really, &lt;strong&gt;REALLY&lt;/strong&gt; hate? Shady QR Code generator pages. There are so many of them out there on the internet—one more dubious than the next. Practically all of them want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A subscription from you
&lt;/li&gt;
&lt;li&gt;Your login details
&lt;/li&gt;
&lt;li&gt;Your money
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if that’s not enough, they love generating tracking links instead of just giving you a simple QR code. They pretend to be oh-so-helpful, but really, it’s all about &lt;strong&gt;collecting your data&lt;/strong&gt; and &lt;strong&gt;milking you for profit&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  They’re Just Math (Not Magic)
&lt;/h2&gt;

&lt;p&gt;I got so fed up with it. QR codes aren’t a magical enigma—there’s no sorcery or witchcraft involved. Yes, it’s some level of math, but definitely not the kind that requires the sacrifice of your data. Even better: in the year &lt;strong&gt;2025&lt;/strong&gt;, we don’t need to send people’s data to a server just to generate a QR code. I mean, we can generate these things &lt;strong&gt;live&lt;/strong&gt;, on the fly, while you’re typing your content!&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing: Qrify
&lt;/h2&gt;

&lt;p&gt;After two evenings of coding, I created my own thing: &lt;strong&gt;Qrify&lt;/strong&gt;. Currently, it has the basic features you need, and guess what? It &lt;strong&gt;runs 100% in your browser&lt;/strong&gt;, no tracking or sneaky stuff. I wanted something straightforward that doesn’t shake you down for a subscription or a login.&lt;/p&gt;

&lt;p&gt;Oh, and if you notice the language is a bit…&lt;strong&gt;odd&lt;/strong&gt; in places—yes, it’s a crude mashup of German and English right now. Today is &lt;strong&gt;09.01.2025&lt;/strong&gt;, so the internationalization (i18n) part is still pending. But hey, &lt;strong&gt;deal with it for now&lt;/strong&gt;. More updates will come in time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: It's localized now ^^&lt;/p&gt;

&lt;h3&gt;
  
  
  Check It Out
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://qr.josunlp.de" rel="noopener noreferrer"&gt;qr.josunlp.de&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code repo:&lt;/strong&gt; &lt;a href="https://github.com/JosunLP/qr-code-generator" rel="noopener noreferrer"&gt;GitHub - JosunLP/qr-code-generator&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you also hate shady QR code generators, or just want a quick, no-BS tool, I hope Qrify helps you out.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;That’s all.&lt;/strong&gt; If you’re as tired as I am of shady QR code sites, well, now you’ve got a free, open-source alternative. Enjoy the new freedom from dubious data-hungry websites!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Peace out,&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;— Josun&lt;/strong&gt;  &lt;/p&gt;

</description>
      <category>qrcode</category>
      <category>webdev</category>
      <category>vue</category>
      <category>programming</category>
    </item>
    <item>
      <title>Societal Critique: The Struggle of Neurodivergent Employees in Neurotypical Work Environments</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Fri, 06 Sep 2024 12:17:43 +0000</pubDate>
      <link>https://dev.to/josunlp/societal-critique-the-struggle-of-neurodivergent-employees-in-neurotypical-work-environments-32i0</link>
      <guid>https://dev.to/josunlp/societal-critique-the-struggle-of-neurodivergent-employees-in-neurotypical-work-environments-32i0</guid>
      <description>&lt;p&gt;In the modern workplace, there is a silent and often invisible crisis affecting many companies and their employees: the disregard for the needs of neurodivergent employees. Particularly impacted are people with Attention Deficit Hyperactivity Disorder (ADHD) and those who have both ADHD and Autism Spectrum Disorder (AuDHD). These employees are typically forced to conform to the standards of their neurotypical colleagues, leading to significant personal and professional challenges.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Invisible Burden of Neurodivergent Employees
&lt;/h3&gt;

&lt;p&gt;Neurodivergent individuals bring unique skills and perspectives to the workplace. However, instead of fostering these qualities, they are typically expected to fit into a standardized work environment. This expectation forces neurodivergent employees to constantly push beyond their limits to meet demands. The result is not only a significant strain on their mental health but also a waste of their potential.&lt;/p&gt;

&lt;h3&gt;
  
  
  ADHD and AuDHD: Strengths and Challenges
&lt;/h3&gt;

&lt;p&gt;People with ADHD and AuDHD frequently possess extraordinary abilities such as creative problem-solving, hyperfocus in areas of interest, and high resilience under pressure. Simultaneously, they struggle with difficulties like sensory overload, organizational challenges, and increased sensitivity to social rejection. Employers' ignorance of these challenges leads to an environment that systematically disadvantages neurodivergent employees.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Economic Consequences of Ignorance
&lt;/h3&gt;

&lt;p&gt;A company that does not support neurodivergent employees loses not only human potential but also economic advantages. Studies have shown that diversity in the workplace leads to higher innovation and productivity. However, by marginalizing neurodivergent employees, companies miss the opportunity to leverage these creative and often revolutionary thinkers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concrete Improvement Suggestions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility in Work Hours and Locations&lt;/strong&gt;: Many neurodivergent people work more effectively in flexible environments. Options for remote work and flexible hours can help meet individual needs and increase productivity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adjustment of Communication Methods&lt;/strong&gt;: Clear, written instructions and regular check-ins can reduce misunderstandings and support neurodivergent employees. Visual aids and structured task lists are also helpful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Awareness and Training&lt;/strong&gt;: Companies should offer training to raise awareness of neurodivergent needs. Managers and colleagues must understand that neurodivergent people are different, but not less capable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mentoring Programs&lt;/strong&gt;: An experienced mentor who understands the challenges and strengths of neurodivergent employees can provide valuable support and guidance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quiet Workspaces and Retreat Areas&lt;/strong&gt;: A quiet workplace without distracting stimuli can significantly enhance the productivity and well-being of neurodivergent employees.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Path to a More Inclusive Society
&lt;/h3&gt;

&lt;p&gt;Handling neurodivergent employees is not only a matter of social justice, but also an economic necessity. Companies that recognize and nurture the uniqueness and potential of these employees benefit from their creativity and innovation. Simultaneously, the mental health and well-being of neurodivergent people are strengthened, leading to a more positive and productive work environment.&lt;/p&gt;

&lt;p&gt;Society as a whole must learn not to view neurodivergent people as “problematic” or “deficient,” but to appreciate their unique skills and perspectives. This requires rethinking and reevaluating what we consider to be “normal” working methods. Only then can we create a truly inclusive and fair working world.&lt;/p&gt;

&lt;p&gt;At a time when diversity and inclusion are gaining importance, it is time to include neurodivergent people in this movement. It is not only morally right but also economically wise. Because a workplace that has room for everyone is a workplace that prospers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The challenges faced by neurodivergent employees are real and profound, but they are not insurmountable. With conscious efforts and an open, inclusive attitude, companies can create an environment where every employee – regardless of their neurological differences – can thrive. Only then can we shape a future that truly includes everyone and unlocks the full potential of each individual.&lt;/p&gt;

</description>
      <category>adhd</category>
      <category>neurodiversity</category>
      <category>hiring</category>
      <category>developer</category>
    </item>
    <item>
      <title>Migrating TypeScript Projects from Webpack to Vite</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Fri, 07 Jun 2024 14:00:51 +0000</pubDate>
      <link>https://dev.to/josunlp/migrating-typescript-projects-from-webpack-to-vite-15nn</link>
      <guid>https://dev.to/josunlp/migrating-typescript-projects-from-webpack-to-vite-15nn</guid>
      <description>&lt;p&gt;So, you're a seasoned developer, juggling TypeScript like a boss, and you've been using Webpack for ages. Webpack is your trusty steed, your old reliable, but let's face it—sometimes it feels like you're configuring a spaceship just to build a to-do app. Enter Vite, the new kid on the block that's fast, lean, and incredibly straightforward. If you’re considering jumping ship from Webpack to Vite, this guide is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Migrate to Vite?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blazing Fast Hot Module Replacement (HMR):&lt;/strong&gt; Vite's HMR is lightning quick. No more waiting around for Webpack to recompile the entire universe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity:&lt;/strong&gt; Vite’s configuration is straightforward and minimal. You'll spend less time configuring and more time coding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Features:&lt;/strong&gt; Out of the box support for TypeScript, ES modules, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimized Builds:&lt;/strong&gt; Vite uses Rollup under the hood for production builds, which is known for its tree-shaking and optimization capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem Maturity:&lt;/strong&gt; Webpack has been around longer, and its ecosystem is more mature. Some plugins and integrations might be missing or less stable in Vite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning Curve:&lt;/strong&gt; While simpler, Vite has its quirks and differences that you'll need to get used to.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Hurdles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Compatibility Issues
&lt;/h3&gt;

&lt;p&gt;Moving from Webpack to Vite isn't always smooth sailing. Here are a few potential bumps in the road:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plugins:&lt;/strong&gt; Not all Webpack plugins have Vite equivalents. You might need to find alternatives or write custom plugins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration Differences:&lt;/strong&gt; Vite’s config file (vite.config.ts) is different from Webpack’s (webpack.config.js). Expect to rewrite parts of your configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loader Mismatches:&lt;/strong&gt; Vite handles module loading differently. You might need to tweak or replace some of your current loaders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependencies and Peer Dependencies
&lt;/h3&gt;

&lt;p&gt;Ensure all your dependencies are compatible with Vite. Some older packages might rely heavily on Webpack-specific features.&lt;/p&gt;

&lt;h3&gt;
  
  
  TypeScript Configuration
&lt;/h3&gt;

&lt;p&gt;Vite’s TypeScript integration is different from Webpack’s ts-loader. Adjustments in your tsconfig.json and project structure might be necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Migration Guide
&lt;/h2&gt;

&lt;p&gt;Alright, let’s roll up our sleeves and get to work. Here’s a step-by-step guide to migrating a TypeScript project from Webpack to Vite. We’ll use a React project as an example, but the principles apply to Vue, Svelte, or vanilla TypeScript projects as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Vite
&lt;/h3&gt;

&lt;p&gt;First, let's install Vite and its dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;vite @vitejs/plugin-react @vitejs/plugin-typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Set Up Vite Configuration
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;vite.config.ts&lt;/code&gt; file at the root of your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@vitejs/plugin-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tsconfigPaths&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite-tsconfig-paths&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;react&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nf"&gt;tsconfigPaths&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
  &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;outDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Update tsconfig.json
&lt;/h3&gt;

&lt;p&gt;Make sure your &lt;code&gt;tsconfig.json&lt;/code&gt; aligns with Vite’s expectations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ESNext"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ESNext"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"moduleResolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jsx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-jsx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@/*"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"include"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Update npm Scripts
&lt;/h3&gt;

&lt;p&gt;Replace your Webpack scripts with Vite scripts in &lt;code&gt;package.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serve"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite preview"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Adjust Project Structure
&lt;/h3&gt;

&lt;p&gt;Ensure your project follows Vite’s expectations, which are simpler but sometimes different from Webpack’s.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public Directory:&lt;/strong&gt; Move static assets to a &lt;code&gt;public&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entry Point:&lt;/strong&gt; Ensure your entry point is &lt;code&gt;index.html&lt;/code&gt; in the root or &lt;code&gt;src&lt;/code&gt; directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example &lt;code&gt;index.html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Vite + React&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/src/main.tsx"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Update Import Paths
&lt;/h3&gt;

&lt;p&gt;Vite uses native ES module imports, so adjust any dynamic imports or path aliases to match Vite’s requirements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StrictMode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.StrictMode&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Handle Environment Variables
&lt;/h3&gt;

&lt;p&gt;Vite uses &lt;code&gt;.env&lt;/code&gt; files for environment variables. Ensure your variables are prefixed with &lt;code&gt;VITE_&lt;/code&gt; to be accessible in your code.&lt;/p&gt;

&lt;p&gt;Example &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_API_URL=https://api.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_API_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 8: Test the Migration
&lt;/h3&gt;

&lt;p&gt;Run the dev server and make sure everything works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix any issues that arise. Most commonly, these will be path issues or missing plugins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9: Build for Production
&lt;/h3&gt;

&lt;p&gt;Once the dev server is running smoothly, try building your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy your production build and test it thoroughly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Framework-Specific Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  React
&lt;/h3&gt;

&lt;p&gt;Vite’s &lt;code&gt;@vitejs/plugin-react&lt;/code&gt; handles React fast refresh and other optimizations out of the box. Ensure your JSX pragma is set correctly in &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vue
&lt;/h3&gt;

&lt;p&gt;For Vue projects, use &lt;code&gt;@vitejs/plugin-vue&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @vitejs/plugin-vue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update &lt;code&gt;vite.config.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;vue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@vitejs/plugin-vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;vue&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Svelte
&lt;/h3&gt;

&lt;p&gt;For Svelte projects, use &lt;code&gt;@sveltejs/vite-plugin-svelte&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @sveltejs/vite-plugin-svelte
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update &lt;code&gt;vite.config.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;svelte&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sveltejs/vite-plugin-svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;svelte&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Migrating from Webpack to Vite can seem daunting, but the benefits of a faster, simpler build process make it worthwhile. Vite’s modern approach to development aligns perfectly with the rapid pace of modern web development. Sure, there might be a few bumps along the road, but with this guide, you’re well-equipped to tackle the migration head-on.&lt;/p&gt;

&lt;p&gt;So, take a deep breath, roll up your sleeves, and get ready to enjoy the speed and simplicity of Vite. Happy coding!&lt;/p&gt;

&lt;p&gt;(Parts of this text were created with AI ^^)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>webpack</category>
      <category>vite</category>
    </item>
  </channel>
</rss>
