【发布时间】:2019-08-06 15:56:50
【问题描述】:
上下文:直到现在我都不介意如何将模板 html 文件导入我的香草 web 组件,因为我总是编写小的 html 代码。所以我在我的 webcomponent .js 文件上编写了 html 代码,并执行以下操作:
const template = document.createElement("template");
template.innerHTML = `<div id="firstdiv"><input id="inputAny"/></div>`;
class anyVanillaWebComponent extends HTMLElement {
...
connectedCallback() {
this.attachShadow({ mode: "open" });
this.shadowRoot.appendChild(template.content.cloneNode(true));
const inputAny = this.shadowRoot.getElementById("inputAny");
...
这在教程、博客和论坛中很常见。现在我想将 html 与 javascript 分开,假设这将使我的项目树更清晰。
四处搜索我发现了一些讨论,假设浏览器将不再支持“导入”[(请参阅底部关于导入替代方案的更新讨论)]。1
基本上,这让我想到了两种可能性:
1 - 将 .js 文件从 html 导入到 html 举例:
<template id="my-webcomponent-template">
<link rel="stylesheet" href="./some.css">
<div>some content ...</div>
</template>
<script src="MyWebcomponent.js"></script>
2 - 从 .js 文件中异步获取 my-webcomponent.html
(async () => {
const res = await fetch('/MyWebcomponent.html');
const textTemplate = await res.text();
const HTMLTemplate = new DOMParser().parseFromString(textTemplate, 'text/html')
.querySelector('template');
class MyWebcomponent extends HTMLElement {...
根据 2017 年的此类讨论,我似乎应该避免使用选项 1,但我不清楚为什么以及选项 2 是否有一些真正的优势。所以我的直截了当的问题是:“在编码 Vanilla Web 组件时导入”和“获取” html 文件,该文件预计将由支持本机 Web 组件的浏览器(例如 Chrome)直接呈现?
【问题讨论】:
-
在谈论 Web 组件时,您确实希望将组件的 DOM 代码与 JS 紧密绑定,因为 Web 组件不是“JS”,而是“JS + (shadow) DOM它需要呈现自己”。无论您是通过 html 模板字符串还是基于 JS 的 DOM 构建来实现这一点,都取决于您,但要将所有内容放在一起。请记住,Web 组件应该附带,而且仅 附带呈现自身 所需的代码,仅此而已:子组件正确渲染是每个子组件的责任。
-
我完全同意“你的组件的 DOM 代码与 JS 紧密相关”。我有兴趣分成两个文件,一个 html 和另一个 javascript,因为我相信从开发人员的角度来看它会更友好和更容易组织。我不打算重新使用与 html 分离的 javascript 文件。两者都将相互编码。顺便说一句,我的问题集中在两种方法上,以及它们是否比另一种更具优势。也许可能会建议第三种替代方案并且也很受欢迎。
-
这感觉像是一种虚假的节省:获得一个好的代码编辑器或专用的 IDE,并将您的自定义组件代码保存在一个具有易于浏览结构的文件中。多个文件只是通过不链接正确的文件来无限容易地破坏您的自定义组件,甚至不需要链接。
-
感谢您分享不将 js 与 html 分开的偏好。顺便说一句,我的主要问题是开放的。
标签: javascript html dom web-component native-web-component