3

我想创建一个 Preact 组件并让人们使用它,即使他们没有构建 Preact 应用程序。

示例:我想<MyTooltip>在 Preact 中构建一个组件,捆绑它(连同 Preact 运行时),并让人们将它作为脚本标签加载,纯粹以声明方式使用它,可能像:

<script src="https://unpkg.com/my-tooltip/my-tooltip-bundled.js">

<my-tooltip content="Tooltip content">Hover here</my-tooltip>

有没有办法捆绑一个组件,使其包含 Preact 运行时、我的库代码和<my-tooltip>元素挂钩?

换句话说,我可以将我的 Preact 组件作为 Custom Elements进行互操作,类似于ReactiveElements吗?

4

5 回答 5

7

There's a great library that does this for you called preact-custom-element:

https://github.com/bspaulding/preact-custom-element

class SearchBox extends Component {
  render() {
    // ...
  }
}
registerComponent(SearchBox, 'search-box');
于 2017-03-07T13:24:04.777 回答
3

尽管@Jason Miller 的回答对我有很大帮助,但我仍然难以制作一个基本的工作示例,所以这是我从头到尾解决这个问题的方法:

我的基本html文档包括dummy.js包含我的虚拟 Web 组件的实际代码的捆绑脚本:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div>
    <script async src="./dummy.js" type="text/javascript"></script>

    <dummy-view name="Test"></dummy-view>
</div>
</body>
</html>

我的虚拟网络组件:

import {div} from '../utils/hyperscript';
import registerCustomElement from 'preact-custom-element';

const DummyView = ({ name = "World" }) => (
    div({}, `Hello, ${name}!`)
);
registerCustomElement(DummyView, "dummy-view", ["name"]);

我的 webpack 配置:

const path = require('path');

module.exports = {
    entry: {
        dummy: './lib/dummy/dummy-view.js'
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
    output: {
        path: path.resolve(__dirname, 'webcomponent/')
    }
};

更多细节:

  • 我是preact-custom-element这样安装的npm i preact-custom-element
  • 捆绑是使用 webpack 完成的,如下所示npx webpack
  • index.html/webcomponent(例如http://localhost:3000/webcomponent/)下提供服务。
  • 在浏览器中访问上述 URL 时,结果如下所示:
<div>Hello, Test!</div>

附录:

于 2019-03-14T14:23:10.593 回答
0

除了已经提到的其他软件包之外,还有:

https://github.com/jhukdev/preactement

它以类似的方式工作,但允许您在需要时动态导入组件文件,从而减少您的前期 JavaScript:

import { define } from 'preactement';

define('my-tooltip', () => import('./myTooltip'));

披露:我是作者:)

于 2021-03-22T17:09:43.640 回答
0

如果您不想使用另一个库来保持苗条,您可以这样做:

import {h} from "preact";
h("lottie-player", {
    src: "/lf30_editor_mjfhn8gt.json",
    background: "transparent",
    speed: 1,
    style: {
        width: 300,
        height: 300,
    },
    loop: true,
    autoplay: true,
})
于 2020-11-28T22:00:13.377 回答
0

PreactJS 自己有一个库可以做到这一点

https://github.com/preactjs/preact-custom-element

于 2020-07-13T21:35:14.567 回答