react-shadowed
TypeScript icon, indicating that this package has built-in type declarations

0.0.7 • Public • Published

react-shadowed

Create web components using React.

Install

npm i react-shadowed

Quick Start

npx create-react-app my-app --template typescript
cd my-app
npm install @craco/craco react-shadowed

Edit ./package.json, replacing existing calls to react-scripts with calls to craco in scripts.

"scripts": {
-   "start": "react-scripts start",
+   "start": "craco start",
-   "build": "react-scripts build",
+   "build": "craco build"
-   "test": "react-scripts test",
+   "test": "craco test"
}

Create ./craco.config.js and configure style-loader to pass styles into react-shadowed which will inject them into Shadow DOM rather than the host page.

const { getLoader, loaderByName } = require('@craco/craco');

module.exports = {
  webpack: {
    configure: (config) => {
      const { isFound, match } = getLoader(
        config,
        loaderByName('style-loader')
      );

      if (isFound) {
        match.parent[match.index] = {
          loader: 'style-loader',
          options: {
            insert: function (element) {
              require('react-shadowed').addStyleElement(element);
            },
          },
        };
      }

      return config;
    },
  },
};

Replace the contents of index.tsx with:

import { createWebComponent } from 'react-shadowed';
import './index.css';

createWebComponent('my-hello', { name: String }, async () => {
  // the components and React itself are lazy loaded upon instantiation of a component to reduce initial bundle size
  //  initial bundle size is ~25KB
  const { default: React } = await import('react');
  const { Hello } = await import('./components/Hello');

  // host attributes are parsed and passed through as props
  return ({ name }) => (
    <React.StrictMode>
      <Hello name={name ?? 'Anonymous'} />
    </React.StrictMode>
  );
});

Add the components to your index.html

<app-hello name="Joe"></app-hello>
<!-- Hello, Joe -->

<app-hello name="Jane"></app-hello>
<!-- Hello, Jane -->

Run it

npm run start

Configure TailwindCSS

Follow the Install Tailwind CSS with Create React App guide to add Tailwind CSS to your Web Components. Nothing special needs to be done to work with react-shadowed.

/react-shadowed/

    Package Sidebar

    Install

    npm i react-shadowed

    Weekly Downloads

    7

    Version

    0.0.7

    License

    none

    Unpacked Size

    96.1 kB

    Total Files

    7

    Last publish

    Collaborators

    • joeflateau