0.0.34 • Published 8 months ago

@rules_prerender/preact v0.0.34

Weekly downloads
-
License
-
Repository
-
Last release
8 months ago

@rules_prerender/preact

A @rules_prerender rendering engine for Preact.

NOTE: This project is currently experimental. Feel free to install it to try it out, give feedback, and suggest improvements! Just don't use it in production quite yet.

Installation

See @rules_prerender installation instructions.

Once @rules_prerender is set up, install @rules_prerender/preact and preact.

pnpm install preact @rules_prerender/preact --save-dev

Depend on this in Bazel just like any other NPM package, typically at //:node_modules/@rules_prerender/preact.

If you are using TypeScript, also go through Preact's configuration instructions.

Usage

# my_site/BUILD.bazel

load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin")
load("@rules_prerender//:index.bzl", "prerender_pages")

copy_to_bin(
    name = "package",
    srcs = ["package.json"],
)

prerender_pages(
    name = "my_site",
    srcs = ["my_site.tsx"],
    # Need a `package.json` with `"type": "module"` to load compiled `*.tsx`
    # files at runtime. Also needs to be copied to bin.
    data = [":package"],
    lib_deps = [
        "//:node_modules/@rules_prerender/preact",
        # JSX requires a Preact dependency, even if you don't import from it.
        "//:node_modules/preact",
    ],
)
import { PrerenderResource, renderToHtml } from '@rules_prerender/preact';

export default function* (): Generator<PrerenderResource, void, void> {
    yield PrerenderResource.fromHtml('/index.html', renderToHtml(
        <html>
            <head>
                <title>My Preact Page</title>
                <meta charSet="utf8" />
            </head>
            <body>
                <h2>Hello, World!</h2>
            </body>
        </html>
    ));
}

Prefer includeScript() and inlineStyle() from @rules_prerender/preact, as they return VNodes.

import { includeScript, inlineStyle } from '@rules_prerender/preact';
import { VNode } from 'preact';

export function Component(): VNode {
    return <div>
        {includeScript('./my_script.mjs', import.meta)}
        {inlineStyle('./my_style.css', import.meta)}
    </div>;
}

Preact doesn't directly support <template /> elements, so @rules_prerender/preact exports a Template component for this purpose. This is useful for declarative shadow DOM.

import { Template } from '@rules_prerender/preact';
import { VNode } from 'preact';

export function Component(): VNode {
    return <div>
        <Template shadowrootmode="open">
            <div>Hello, World!</div>
            <slot></slot>
        </Template>
        <div>Hello, Mars!</div>
    </div>;
}
0.0.30

10 months ago

0.0.31

10 months ago

0.0.32

10 months ago

0.0.33

9 months ago

0.0.34

8 months ago

0.0.28

1 year ago

0.0.27

1 year ago

0.0.26

1 year ago

0.0.25

1 year ago