DEV Community

RuturajMaggirwar
RuturajMaggirwar

Posted on

Create embeddable widgets in react for static pages

Introduction

In today’s digital world, embeddable widgets are everywhere, from chatbots and social media plugins to embedded video players and analytics dashboards. If you are a developer, you have likely come across the challenge of creating these embeddable widgets—especially if you want them to be easily integrated into static pages.

In this blog, we’ll explore what widgets are, how to create embeddable widgets using React for static pages, and discuss the advantages and disadvantages of these widgets. Let’s dive into the why and how of building embeddable widgets and explore a use case with an example.

Image description


What is an Embeddable Widget?

An embeddable widget is a self-contained block of functionality that can be dropped into any website, offering features like live chats, user feedback forms, or even media players. Widgets are often designed to work on various types of web pages and can be easily shared, reused, and customized for different webpages.

Image description

Example Use Cases:

  • Chatbots on e-commerce websites to guide users through purchases.
  • Social Media Feed widgets to display Twitter or Instagram posts.
  • Survey/Feedback Forms for collecting user input.
  • Analytics Widgets to display real-time metrics on a webpage.

Why Use React for Embeddable Widgets?

React, a popular JavaScript library for building user interfaces, is an excellent choice for creating embeddable widgets. It allows you to build encapsulated components that can manage their own state, which makes it easy to integrate complex functionality into any webpage. Additionally, React's component-based architecture simplifies the process of updating and maintaining widgets.

Advantages of Using React for Widgets

  1. Component-Based: React’s modular structure allows for creating reusable components, ideal for embeddable widgets.
  2. State Management: React makes it easy to manage dynamic content and interactions within widgets.
  3. Performance: React is highly efficient, ensuring that even complex widgets perform well on any webpage.
  4. Ease of Integration: React apps can be easily integrated into static HTML pages using Webpack or directly embedding the React app script.

Disadvantages of Using React for Widgets

  1. Bundle Size: React’s ecosystem comes with libraries and tools that may increase the final bundle size of your widget, which can be a problem for performance-sensitive pages.
  2. Learning Curve: React has a steeper learning curve compared to vanilla JavaScript or simpler frameworks. If you're new to React, it may take some time to get used to it.
  3. Dependencies: You often need to use additional tools like Webpack or Babel to bundle and compile your code, adding some complexity.

Advantages and Disadvantages of Embeddable Widgets

Advantages:

  1. Reuse: Widgets are reusable components that can be easily embedded into multiple web pages.
  2. Modularity: Widgets encapsulate functionality, making them easy to update and maintain without affecting the host page.
  3. Customization: You can easily pass variables from the host page to customize the widget’s behavior.
  4. Cross-Site Deployment: Widgets can be deployed across different sites or applications, promoting code reuse.

Disadvantages:

  1. Bundle Size: The more complex the widget, the larger the JavaScript bundle, which can impact performance.
  2. Security: If not handled carefully, embedding widgets could expose sensitive data or make the host page vulnerable to attacks (like cross-site scripting).
  3. Browser Compatibility: Older browsers may not fully support the latest JavaScript features or React components, requiring polyfills or additional configurations.

Step-by-Step approach

Let’s walk through a simple example of building a chatbot widget using React and embedding it into a static HTML page.

  • First we will set up a React App from scratch.
npx create-react-app embeddable-widget --template typescript
cd embeddable-widget
npm install react-chat-widget
Enter fullscreen mode Exit fullscreen mode
  • Next we will create the Widget Component. In your App.tsx file, create a simple widget component using the react-chat-widget library:
import { useEffect } from 'react';
import { Widget, addResponseMessage } from "react-chat-widget";
import "react-chat-widget/lib/styles.css";

function App() {
  useEffect(() => {
    addResponseMessage("Welcome to our chatbot!");
  }, []);

  const handleNewUserMessage = (newMessage: string) => {
    console.log(`New Message received: ${newMessage}`);
  };

  return (
    <Widget
      handleNewUserMessage={handleNewUserMessage}
      title="Chatbot Widget"
      subtitle="How can we help you?"
    />
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode
  • Later we will configure Webpack for the Bundle. To make this React app embeddable, we need to bundle it using Webpack. The Webpack config will bundle the React app into a single widget.bundle.js file, which can be included in any static HTML page. Here’s a basic Webpack configuration:
const path = require("path");
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
    entry: path.join(__dirname, "src/index.tsx"),
    output: {
        path: path.join(__dirname, "dist"),
        filename: "bundle.min.js",
    },
    resolve: {
        extensions: [".ts", ".tsx", ".js"],
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ["style-loader", "css-loader"],
            },
            {
                test: /\.ts(x?)$/,
                exclude: /node_modules/,
                use: ["ts-loader"],
            },
        ],
    },
    optimization: {
        minimize: true,
        minimizer: [new TerserPlugin()],
    },
};
Enter fullscreen mode Exit fullscreen mode
  • Next modify the index.tsx file accordingly:
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);

root.render(
    <App />
  );

reportWebVitals();
Enter fullscreen mode Exit fullscreen mode
  • Finally we shall embed the Widget in a Static html Page. By linking the bundled JavaScript file, the widget will automatically render in the #widget-root div when the page loads. To embed the widget on a static HTML page, you need to include the generated bundle like so:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>New Static Page for testing embeddable widget</h1>
    <div id="root"></div>
    <script defer="defer" src="bundle.min.js"></script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Build the react project and server the static html file along with the built files from the react dist folder. This way the static html page will have a reference to the built files and will be able to embed the widget.


Conclusion

Embeddable widgets are an excellent way to add dynamic, reusable functionality to static pages. By leveraging React, you can build powerful, modular widgets that are easy to maintain and customize. However, it’s essential to consider bundle size, security, and the performance of your widget to ensure that it integrates smoothly with different web pages. By following the steps outlined in this guide, you should be well on your way to creating efficient, simple, and flexible embeddable widgets with React.

Top comments (0)