-
-
Notifications
You must be signed in to change notification settings - Fork 106
Description
I'm using wmr in the test suite for our Preact Devtools extension and I need to verify that it works with a range of Preact versions.
To do so I've set up multiple aliases:
{
"alias": {
"preact@10.0.0-rc.0": "/vendor/preact-10.0.0-rc.0/preact.js",
"preact@10.3.4": "/vendor/preact.10.3.4/preact.js"
}And than we can use that with standard imports:
import { h, render } from "preact@10.3.4";
render(
<p>Rendered with 10.3.4</p>,
document.getElementById("app")
);This works really well except for when I use JSX. JSX is transpiled to htm template strings, but by adding a import htm from "htm/preact" import, an additional version of Preact is pulled in.
import { html } from "/@npm/htm/preact"; // Pulls in wrong version
import { h, render } from "preact@10.3.4";
render(
html`<p>Rendered with 10.3.4</p>`,
document.getElementById("app")
);To solve this I can come up with two options:
- Transpile JSX to
createElementcalls
This is arguable the more verbose version, but it works. The parsing performance benefit of tagged template strings doesn't really come to play in my set up, so I'm good with createElement calls.
import { h, render } from "preact@10.3.4";
render(
h("p", null, "Rendered with 10.3.4"),
document.getElementById("app")
);- Inject
htm.bind(h)calls into every file
Another option could be to drop the htm/preact import and initialize the htm constructor anew in each file:
import htm from "/@npm/htm";
import { h, render } from "preact@10.3.4";
const html = htm.bind(h);
render(
html`<p>Rendered with 10.3.4</p>`,
document.getElementById("app")
);- Transpile to
htmlcalls, but don't injecthtm.bind(h)automatically
This closely ties to 2) and is probably a lot more flexible for the end user. Essentially he'd need to make sure that an html function is present in the module scope themselves.