Template、ShadowDOM 和 CustomElements 让您可以比以往更轻松地创建 UI 组件。 而且HTML、CSS、JavaScript等资源仍然需要一一加载,效率非常低。
例如,加载 jQueryUI 或 Bootstrap 现在需要为 JavaScript、CSS 和 Web 字体添加单独的标签。 如果您的 Web 组件应用多个依赖项,事情会变得更加复杂。
HTML 导出允许您将此资源加载到组合的 HTML 文件中。使用 HTML 导出
为了加载HTML文件,需要添加一个link标签,其相关属性为import,herf属性为HTML文件的路径。 例如,如果要将 component.html 加载到 index.html 中:
索引.html
用于将内容复制到文本的 XML/HTML 代码
可以将文件导出为HTML(译者注:这里“导入的HTML”被翻译为“HTML导出文件”,“原始HTML”被翻译为“HTML主文件”。例如index.html是HTML主文件,component.html 是 HTML 导出文件。)添加任何资源,包括脚本、样式表和字体,就像向普通 HTML 添加资源一样。
组件.html
用于将内容复制到文本的 XML/HTML 代码
脚本>
Doctype、html、head、body 标签是不必要的。 HTML导出会立即加载导入的文档,解析文档中的资源,如果有则执行脚本。执行顺序
浏览器解析 HTML 文档的方式是线性的,这意味着 HTML 底部的脚本先于顶部执行。 而且,浏览器通常会等到JavaScript代码执行完毕,然后继续解析它旁边的代码。
为了防止脚本压缩 HTML 渲染,可以在标签中添加 async 或 defer 属性(或者也可以将 script 标签放在页面顶部)。 defer 属性将重复执行脚本,直到解析完所有页面。 async 属性允许浏览器首先执行脚本,因此不会阻止 HTML 渲染。 那么html导入html,HTML 导出是如何进行的呢?
HTML 导出文件中的脚本遵循与包含 defer 属性相同的方式。 例如,在下面的示例中,index.html将首先执行script1.js和script2.js,然后执行script3.js。
索引.html
用于将内容复制到文本的 XML/HTML 代码
//1.
导出示例标题></p> <p><scriptsrc="script3.js">script>//4. </p> <p>component.html</p> <p>将内容复制到文本的 XML/HTML 代码</p> <p><scriptsrc="js/script1.js">script>//2. </p> <p><scriptsrc="js/script2.js">脚本>//3. </p> <p>1.在index.html中加载component.html并等待执行</p> <p>2.执行component.html中的script1.js</p> <p>3.执行完script1.js后,执行component.html中的script2.js</p> <p>4.执行完script2.js后html导入html,执行index.html中的script3.js</p> <p>注意,如果给link[ rel="import"]添加异步属性,HTML导出会将其视为包含异步属性的脚本。它不会等待 HTML 导出文件被执行和加载,这意味着 HTML 导出不会阻塞主 HTML 文件的渲染。这也带来了网站性能提升的可能性,除非有其他脚本依赖于HTML导入文件的执行。跨域导入</p> <p>从根本上来说,HTML导入无法导入其他域名的资源。 </p> <p>例如,您无法从向导导入 HTML 文件。为了解决这个限制,可以使用 CORS(跨源资源共享)。要了解 CORS,请阅读这篇文章。 HTML导出文件中的Window和Document对象</p> <p>后面我提到,上面的脚本会在HTML文件导入时执行,但这并不意味着HTML导入文件中的标签也会被渲染通过浏览器。您需要编写一些 JavaScript 代码来提供帮助。 </p> <p>在 HTML 导出文件中使用 JavaScript 时,需要注意的一件事是 HTML 导出文件中的文档对象实际上引用了主 HTML 文件中的文档对象。以上面的代码为例,index.html和组件。 html的文档指的是index.html的文档对象。如何使用 HTML 导出文件中的文档?在链接中导出属性即可。 </p> <p>index.html</p> <p>将内容复制到文本的 XML/HTML 代码</p> <p>varlink=document.querySelector('link[rel="import"]') ;</p> <p>link.addEventListener('load', function(e){</p> <p>varimportedDoc=link.import;</p> <p>//importedDoc指向component.html文档</p> <p>});</p> <p>要获取component.html中的文档对象,请使用document.currentScript.ownerDocument。 </p> <p>component.html</p> <p>将内容复制到文本的XML/HTML代码</p> <p>varmainDoc=document.currentScript.ownerDocument;</p> <p>// mainDoc指向component.html下的文档</p> <p>如果您使用的是webcomponents.js,则将document.currentScript替换为document._currentScript。逗号用于填充 currentScript 属性,因为并非所有浏览器都支持该属性。 </p> <p>component.html</p> <p>将内容复制到文本的XML/HTML代码</p> <p>varmainDoc=document._currentScript.ownerDocument;</p> <p>// mainDoc指向component.html下的文档</p> <p>通过在脚本开头添加以下代码,就可以轻松访问component.html中的document对象,无论浏览器是否支持HTML导出。 document._currentScript=document._currentScript||document.currentScript;性能考虑</p> <p>使用HTML的用途之一是是否可以组织资源,这也意味着在加载此类资源时,由于使用了一些额外的HTML文件而使它们变得太大。有几点需要考虑: 解决依赖关系</p> <p>例如,如果要从导出的文件加载 jQuery,如果每个导入的文件都包含加载 jQuery 的脚本标记,如果主 HTML 文件依赖于多个 如果导出文件包含导入文件中的相同库怎么办?所以 jQuery 将被加载两次,并被执行两次。 </p> <p>index.html</p> <p>将内容复制到文本的 XML/HTML 代码</p> <p><linkrel="import" href="component1.html"></p > <p><linkrel="import" href="component2.html"></p> <p>component1.html</p> <p>将内容复制到文本的 XML/HTML 代码</p> <p >Script></p> <p>手动引入的component2.htmlHTML可以帮助你解决这个问题。 </p> <p>以上述代码为例,通过不同的方式加载jQuery脚本标签,对已经加载的HTML文件进行HTML导入,并通过加载jQuery 脚本标签。这样 jQuery 只被加载和执行一次。 </p> <p>相反,还有一个问题:我们删除了一个要加载的文件。如何处理多个扩展文件?幸运的是,我们有一个名为 vulcanize 的工具来解决这个问题。合并网络请求</p> <p>Vulcanize 可以将多个 HTML 文件合并为一个文件,从而减少网络连接数量。您可以通过 npm 安装它并从命令行使用它。您可以使用 grunt 和 gulp 来托管一些任务,因此您可以将 vulcanize 作为构建过程的一部分。 </p> <p>为了解决依赖关系并合并index.html中导入的文件,请使用以下命令:</p> <p>复制代码</p> <p>代码如下:</p> <p> p> <p> $vulcanize-ovulcanized.htmlindex.html</p> <p>通过执行此命令,index.html 中的依赖关系将被解析,并且将形成一个合并的 HTML 文件并插入到 vulcanized.html 中。要了解有关硫化的更多信息,请参阅此处。 </p> <p>注:http2的服务器推送功能考虑到稍后删除文件的链接和合并。将Template、ShadowDOM、自定义元素与HTML结合起来介绍</p> <p>你可能没有读过那些文章,我先解释一下:Template允许你以声明的形式定义你的自定义元素的内容。 ShadowDOM 允许元素的样式、ID 和类仅应用于其自身。自定义元素允许您自定义 HTML 标签。通过将其与 HTML 导入相结合,您的自定义 Web 组件将被取代和重叠。任何人都可以通过添加链接标签来使用它。 </p> <p>x-component.html</p> <p>将内容复制到文本的 XML/HTML 代码</p> <p><templateid="template"></p> <p>。 ..</p> <p>样式></p> <p><divid="container"></p> <p><imgsrc=""></p> <p><contentselect="h1 ">content></p> <p>div></p> <p>template></p> <p>//该元素会被注册到index.html</p> <p>//由于这里的“document”是index.html中的</p> <p>varXComponent=document.registerElement('x-component', {</p> <p>Prototype: Object.create(HTMLElement.prototype, { </p> <p>createdCallback:{</p> <p>值:function(){</p> <p>varroot=this.createShadowRoot();</p> <p>vartemplate=document.querySelector ('#template');</p> <p>varclone=document.importNode(template.content, true);</p> <p>root.appendChild(clone);</p> <p>} ) </p> <p>});</p> <p>脚本></p> <p>index.html</p> <p>将内容复制到文本的 XML/HTML 代码</p> < p>...</p> <p><linkrel="import" href="x-component.html"></p> <p>标题></p> <p><x-component>< /p> <p><h1>这是一个自定义元素 h1></p> <p>x-component></p> <p>...</p> <p>请注意,由于 X- component .html中的document对象和index.html一样,你不需要写一些棘手的代码,它会手动为你注册它。支持的浏览器Chrome和Opera提供了对HTML导出的支持,Firefox将在2014年12月之后支持(Mozilla表示Firefox最初不打算提供对HTML导出的支持,需要了解ES6模块是如何工作的)实施的)。 </p> <p>您可以访问chromestatus.com或caniuse.com检查您的浏览器是否支持HTML导出。要在其他浏览器上使用 HTML 导出,您可以使用 webcomponents.js(以前称为 platform.js)。相关资源</p> <p>HTML介绍就到此为止。如果您想了解更多HTML介绍,请访问:</p> <p>HTML导出:#include for Web–HTML5Rocks</p> <p>HTML导出规范</p></p>
发表评论