Stormkit Logo
Stormkit Logo
docsblogwhats new?FAQpricingGitHubTwitterDiscordDiscordlogin

Unlocking dynamic web interactions with htmx

Nov 02, 2023

Htmx is a lightweight JavaScript library (~14k) designed to simplify the process of creating dynamic, interactive web applications.

Htmx leverages HTML attributes to enable AJAX requests, partial page updates, and DOM manipulation with minimal effort. By doing so, htmx empowers developers to create web applications that feel responsive and fluid without the need for complex JavaScript code and setup. It is a godsend for backend developers.

Htmx operates on the principle of reactivity. It facilitates real time updates by intercepting events triggered by users such as clicks, form submissions or keyboard inputs. When an event occurs, htmx sends a request to the server, which processes the request and returns the updated content. This content is then seamlessly integrated into the current page, providing a smooth and interactive user experience.

<!-- Example: Triggering an htmx request on button click -->
<button hx-get="/api/data" hx-target="#result">Fetch Data</button>
<div id="result"></div>

In this example, we have a button element. When clicked, htmx sends a GET request to the /api/data endpoint. The response from the server is then placed inside the div element with the ID result. One of the key strengths of htmx lies in its ability to perform partial page updates. Rather than reloading an entire page, htmx allows you to refresh only specific sections, resulting in faster load times and a more dynamic feel for your application. This is achieved through the manipulation of the DOM, enabling you to replace or modify elements with the updated content received from the server.

One of the remarkable features of htmx is its seamless integration with backend frameworks that renders view on server side (SSR) . Whether you're working with Django, Flask, Rails, ExpressJs or any other backend technology, htmx enhances the user experience without requiring a complete overhaul of your current setup. Additionally, you won’t need bundling step like you do in other frontend frameworks such as React and Vuejs.

When you return HTML as a payload from the server, htmx can seamlessly integrate this content into your web page, resulting in a smoother and more efficient user experience.

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/api/data') {
    // Process data and generate dynamic HTML content
    const dynamicHTML = "<div>New content generated dynamically</div>";

    res.setHeader('Content-Type', 'text/html');

    res.end(dynamicHTML);
  } else {
    res.statusCode = 404;
    res.end('Not Found');
  }
});


server.listen(process.env.PORT || 3000, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

In this example, we're using Node.js to create a basic HTTP server. When a request is made to the /api/data endpoint, the server processes the request and generates dynamic HTML content.

By returning HTML directly, you bypass the need for additional client-side processing to render the content. This leads to faster load times and a more responsive application. It's important to note that while htmx can handle JSON responses, leveraging its capability to work directly with HTML is where it truly shines.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  </head>
  <script src="https://unpkg.com/htmx.org@1.9.6"></script>
  <script src="https://unpkg.com/htmx.org/dist/ext/client-side-templates.js"></script>
  <script src="
https://cdn.jsdelivr.net/npm/nunjucks@3.2.4/browser/nunjucks.min.js
"></script>

  <body>
    <div hx-ext="client-side-templates">
      <button
        hx-get="https://jsonplaceholder.typicode.com/posts?_page=1&_limit=5"
        hx-swap="innerHTML"
        hx-target="#content"
        nunjucks-array-template="foo"
      >
        Click Me
      </button>

      <div id="content">Before content loaded</div>

      <script id="foo" type="x-tmpl-nunjucks">
         {% for post in data %}
            <tr><td> {{ post.body }} </td></tr>
        {% endfor %}
      </script>
    </div>
  </body>
</html>

Example above demonstrates htmx’s client side processing capabilities, it requires bit more setup and capabilities of what you can do is kind of limited. For example, its not possible to implement pagination just with htmx if your end point returns json.

Incorporating htmx into your web development toolkit can be a game changer for creating dynamic and interactive web applications. Its simplicity, reactivity, and adaptability make it a valuable asset for developers looking to enhance user experience without the complexity of traditional JavaScript frameworks. In our upcoming blog post, we'll dive deeper into how you can harness the power of htmx in combination with Vite.js and Stormkit.io to implement infinite scrolling with minimal amount of code in your web applications.

Stormkit Logo

© 2024 Stormkit, Inc.

company
pricingprivacy policyterms
\n \n \n\n \n
\n \n Click Me\n \n\n
Before content loaded
\n\n \n
\n \n\n```\n\nExample above demonstrates htmx’s client side processing capabilities, it requires bit more setup and capabilities of what you can do is kind of limited. For example, its not possible to implement pagination just with htmx if your end point returns json.\n\nIncorporating htmx into your web development toolkit can be a game changer for creating dynamic and interactive web applications. Its simplicity, reactivity, and adaptability make it a valuable asset for developers looking to enhance user experience without the complexity of traditional JavaScript frameworks. In our upcoming blog post, we'll dive deeper into how you can harness the power of htmx in combination with [Vite.js](https://vitejs.dev/) and [Stormkit.io](http://stormkit.io/) to implement infinite scrolling with minimal amount of code in your web applications.","navigation":[{"path":"how-to-deploy-docusarous","title":"How do deploy Docusaurus project to Stromkit","description":"Quick guide to show how to deploy Docusaurus project to Stormkit","search":false,"date":"2024-04-05","active":false},{"path":"how-to-deploy-gatsby","title":"How do deploy Gatsby project to Stromkit","description":"Quick guide to show how to deploy Gatsby project to Stormkit","search":false,"date":"2024-04-04","active":false},{"path":"how-to-deploy-vitepress","title":"How do deploy VitePress project to Stromkit","description":"Quick guide to show how to deploy VitePress project to Stormkit","search":false,"date":"2024-04-04","active":false},{"path":"guide-to-understanding-choosing-right-analytic-tools-for-your-website","title":"A Guide to Understanding and Choosing the Right Analytic Tools for Your Website","description":"This post explores the diverse landscape of web analytics tools, delving into alternatives like GoatCounter, Plausible, Umami, PostHog and Stormkit. Highlighting their unique features and emphasizing the growing importance of self hosted solutions.","search":false,"date":"2024-01-24","active":false},{"path":"postgresql-with-golang-crafting-insert-queries","title":"PostgreSQL with Golang Crafting Insert Queries with Text/Templates","description":"Stormkit's approach of eschewing ORM and query builders in favor of raw SQL queries using text/templates.","search":false,"date":"2024-01-21","active":false},{"path":"site-search-with-react-and-minisearch","title":"Local search with react and minisearch","description":"This blog post walks you through our implementation for local search using minisearch and creating react component as search box.","search":false,"date":"2023-12-16","active":false},{"path":"building-dynamic-web-applications-with-ssr-and-htmx","title":"Building Dynamic Web Applications with SSR, Htmx and Handlebars.js","description":"Learn how to create interactive web applications using Server-Side Rendering (SSR), htmx for seamless AJAX interactions, and Handlebars.js for dynamic templating.","search":true,"date":"2023-11-09","active":false},{"path":"unlocking-dynamic-web-interactions-with-htmx","title":"Unlocking dynamic web interactions with htmx","description":"Unlock the potential of htmx, a lightweight JavaScript library for dynamic web interactions. Simplify AJAX requests, page updates, and DOM manipulation with ease. See how htmx integrates seamlessly with server-side rendering.","search":true,"date":"2023-11-02","active":true},{"path":"getting-started-with-vitejs","title":"Combining Vite.js with Stormkit for React Static Sites Guide","description":"Learn how to leverage the lightning-fast Vite.js build system and Stormkit's seamless deployment platform for React static sites. Follow our quick start guide and explore migration options from Webpack. Plus, discover an all-in-one template project for server-side rendering, static page generation, and API development using React and Vite.js.","search":false,"date":"2023-10-08","active":false},{"path":"how-ai-helping-us-catch-phishing-websites","title":"How AI helps us catching phishing websites","description":"This post explores how Stormkit combats phishing on their hosting platform. They initially used a javascript program for detection, but faced false positives and evasion tactics. By integrating AI through Teachable Machine and TensorFlow.js, they markedly improved accuracy.","search":false,"date":"2023-09-26","active":false},{"path":"faq","title":"FAQ","description":"Our Frequently Asked Questions (FAQ) page is designed to provide you with quick and helpful information about Stormkit.","search":false,"date":"2023-08-17","active":false},{"path":"writing-a-headless-cms-from-scratch--planning","title":"Writing a Headless CMS from scratch","subtitle":"Part 1 - Planning","description":"Welcome to the exciting journey of building a headless CMS from scratch! In this blog post series, we will embark on a step-by-step adventure, exploring the process of creating a powerful content management system tailored to our unique needs.","search":false,"date":"2023-06-04","active":false,"author":{"name":"Savas Vedova","img":"https://pbs.twimg.com/profile_images/824030706112364546/SY-lJnNN_400x400.jpg","twitter":"@savasvedova"}},{"path":"why-we-are-dropping-support-for-next-js","title":"Why we are dropping support for Next.js","description":"In our continuous pursuit of delivering the best developer experience, we've made a bold decision. We're dropping serverless support for Next.js.","search":true,"date":"2023-05-21","active":false},{"path":"monitoring-app-using-stormkit-and-supabase","title":"Monitoring system using Stormkit and Supabase","description":"Learn how to monitor your website's URL status using Stormkit and Supabase. Easy to set up and cost-efficient, this powerful tool can send notifications to Discord, track historical data, and more. Check out the source code now!","search":false,"date":"2023-01-24","active":false},{"path":"factory-pattern-for-go-tests","title":"Factory pattern for Go tests","description":"This article will show you how we improved our Go unit tests worklow using a factory pattern.","search":false,"date":"2022-11-01","active":false},{"path":"how-to-create-content-site","title":"How to create and deploy documentation page using nuxt.js and Stormkit under 5 minutes","description":"Learn how to create a website in under 5 minutes with this step-by-step guide.","search":true,"date":"2022-09-23","active":false},{"path":"migrating-your-app-from-webpack-to-vite","title":"Migrating your app from Webpack to Vite","description":"Learn how to migrate your app from Webpack to Vite with this quick guide. Discover the configuration options used in Vite and the rationale behind the migration.","search":false,"date":"2022-08-29","active":false},{"path":"how-to-deploy-on-aws-s3","title":"Deploy your app on AWS S3","description":"Learn how to deploy your static applications on your own AWS account using Stormkit.","search":true,"date":"2022-04-10","active":false},{"path":"using-analytic-tools-with-stormkit","title":"Tracking user data using Stormkit and Plausible","description":"Learn how to track user data using Stormkit and Plausible without deploying your application. Inject snippets instantly with this powerful functionality.","search":true,"date":"2022-04-09","active":false},{"path":"how-to-deploy-to-bunny-cdn","title":"How to deploy to BunnyCDN","description":"Learn how to deploy your static applications on your own Bunny CDN account using Stormkit.","search":false,"date":"2022-04-01","active":false},{"path":"whats-new","title":"What's New?","description":"Discover the latest changes and improvements to Stormkit. Stay up-to-date and get the most out of our platform.","search":false,"active":false}]}