HTML5 でのファイルインポートの簡単な紹介

不言
リリース: 2018-05-08 15:39:40
オリジナル
2362 人が閲覧しました

この記事では、jQuery の読み込み、インポート後の実行シーケンス、その他の知識ポイントを含む、HTML でのファイル インポートの簡単な概要を主に紹介します。

テンプレート、Shadow DOM、カスタム要素を使用して UI コンポーネントを作成できます。以前よりも楽になりました。ただし、HTML、CSS、JavaScript などのリソースは依然として 1 つずつロードする必要があるため、非常に非効率的です。

重複した依存関係を削除することも簡単ではありません。たとえば、jQuery UI または Bootstrap を読み込むには、JavaScript、CSS、および Web フォントに個別のタグを追加する必要があります。 Web コンポーネントが複数の依存関係を適用する場合、状況はさらに複雑になります。

HTML インポートを使用すると、これらのリソースを結合された HTML ファイルとしてロードできます。
HTML import を使用する

HTML ファイルを読み込むには、rel 属性が import で、herf 属性が HTML ファイルへのパスであるリンク タグを追加する必要があります。たとえば、component.html をindex.html にロードする場合:

index.html

XML/HTML コードコンテンツをクリップボードにコピー

<link rel="import" href="component.html" >
ログイン後にコピー

ファイルを HTML にインポートできます (翻訳者注:この記事では、「インポートされた HTML」を「HTML インポート ファイル」、「元の HTML」を「HTML マスター ファイル」と翻訳します。たとえば、index.html は HTML マスター ファイル、component.html は HTML インポート ファイルです。スクリプト、スタイルシート、フォントなどは、通常の HTML にリソースを追加するのと同じです。

component.html

XML/HTML コードコンテンツをクリップボードにコピーします

<link rel="stylesheet" href="css/style.css">
<script src="js/script.js"></script>
ログイン後にコピー

doctype、html、head、body タグは必要ありません。 HTML インポートでは、インポートされるドキュメントがただちにロードされ、ドキュメント内のリソースが解析され、スクリプトがあれば実行されます。
実行順序

ブラウザが HTML ドキュメントを解析する方法は線形です。つまり、HTML の上部にあるスクリプトが下部より前に実行されます。さらに、ブラウザは通常、JavaScript コードが実行されるまで待ってから、後続のコードを解析します。

スクリプトが HTML のレンダリングを妨げないようにするには、タグに async 属性または defer 属性を追加します (または、ページの下部に script タグを配置することもできます)。 defer 属性は、すべてのページが解析されるまでスクリプトの実行を遅らせます。 async 属性を使用すると、ブラウザは HTML のレンダリングを妨げないようにスクリプトを非同期に実行できます。では、HTML インポートはどのように機能するのでしょうか?

HTMLインポートファイル内のスクリプトは、defer属性を含むものと同じです。たとえば、次の例では、index.html は script1.js と script2.js を最初に実行し、次に script3.js を実行します。

index.html

XML/HTMLコードコンテンツをクリップボードにコピー

<link rel="import" href="component.html"> // 1.   
<title>Import Example</title>
<script src="script3.js"></script>        // 4.
ログイン後にコピー

component.html

XML/HTMLコードコンテンツをクリップボードにコピーりー

1. index.htmlにcomponent.htmlを読み込み、実行を待ちます

2.component.htmlにあるscript1.jsを実行します

3.script1.jsを実行後、component.htmlにあるscript2.jsを実行します

4. js で、index.html の script3.js を実行します

link[rel="import"] に async 属性を追加すると、HTML インポートでは async 属性を含むスクリプトとして扱われることに注意してください。 HTML インポート ファイルの実行と読み込みを待機しません。つまり、HTML インポートはメイン HTML ファイルのレンダリングを妨げません。これにより、HTML インポート ファイルの実行に依存する他のスクリプトがない限り、Web サイトのパフォーマンスを向上させることもできます。

クロスドメインインポート

基本的に、HTMLインポートでは他のドメイン名からリソースをインポートできません。

たとえば、HTML ファイルを http://webcomponents.org/ から http://example.com/ にインポートすることはできません。この制限を回避するには、CORS (Cross-Origin Resource Sharing) を使用できます。 CORS について詳しくは、この記事をご覧ください。

HTML インポート ファイル内のウィンドウ オブジェクトとドキュメント オブジェクト

HTML ファイルをインポートするときに内部のスクリプトが実行されると前述しましたが、これは HTML インポート ファイル内のタグもブラウザーによってレンダリングされるという意味ではありません。これを解決するには、JavaScript コードを記述する必要があります。

HTML インポート ファイルで JavaScript を使用するときに注意すべき点の 1 つは、HTML インポート ファイルのドキュメント オブジェクトが実際にはメイン HTML ファイルのドキュメント オブジェクトを参照していることです。前のコードを例にとると、index.html とcomponent.html のドキュメントは両方とも、index.html のドキュメント オブジェクトを参照します。 HTML を使用してドキュメントをファイルにインポートするにはどうすればよいですか?リンクで import 属性を使用します。

index.html


XML/HTMLコードコンテンツをクリップボードにコピー

<script src="js/script1.js"></script>     // 2.   
<script src="js/script2.js"></script>     // 3.
ログイン後にコピー

component.htmlのドキュメントオブジェクトを取得するには、document.currentScript.ownerDocument.

component.html


XMLを使用します/HTML コードコンテンツをクリップボードにコピーします

var mainDoc = document.currentScript.ownerDocument;   
// mainDoc points to the document under component.html
ログイン後にコピー

如果你在用webcomponents.js,那么就用document._currentScript来代替document.currentScript。下划线用于填充currentScript属性,因为并不是所有的浏览器都支持这个属性。

component.html

XML/HTML Code复制内容到剪贴板

var mainDoc = document._currentScript.ownerDocument;   
// mainDoc points to the document under component.html
ログイン後にコピー

通过在脚本开头添加下面的代码,你就可以轻松地访问component.html中的document对象,而不用管浏览器是不是支持HTML导入。
document._currentScript = document._currentScript || document.currentScript;
性能方面的考虑

使用HTML 导入的一个好处是能够将资源组织起来,但是也意味着在加载这些资源的时候,由于使用了一些额外的HTML文件而让头部变得过大。有几点是需要考虑的:
解析依赖

假如HTML主文件要依赖多个导入文件,而且导入文件中含有相同的库,这时会怎样呢?例如,你要从导入文件中加载jQuery,如果每个导入文件都含有加载jQuery的script标签,那么jQuery就会被加载两次,并且也会被执行两次。

index.html

XML/HTML Code复制内容到剪贴板

<link rel="import" href="component1.html">
<link rel="import" href="component2.html">
ログイン後にコピー

component1.html

XML/HTML Code复制内容到剪贴板

<script src="js/jquery.js"></script>
ログイン後にコピー

component2.html

HTML导入自动帮你解决了这个问题。

与加载两次script标签的做法不同,HTML 导入对已经加载过的HTML文件不再进行加载和执行。以前面的代码为例,通过将加载jQuery的script标签打包成一个HTML导入文件,这样jQuery就只被加载和执行一次了。

但这还有一个问题:我们增加了一个要加载的文件。怎么处理数目膨胀的文件呢?幸运的是,我们有一个叫vulcanize的工具来解决这个问题。
合并网络请求

Vulcanize 能将多个HTML文件合并成一个文件,从而减少了网络连接数。你可以借助npm安装它,并且用命令行来使用它。你可能也在用 grunt和gulp 托管一些任务,这样的话你可以把vulcanize作为构建过程的一部分。

为了解析依赖以及合并index.html中的导入文件,使用如下命令:

复制代码

代码如下:

$ vulcanize -o vulcanized.html index.html
ログイン後にコピー

通过执行这个命令,index.html中的依赖会被解析,并且会产生一个合并的HTML文件,称作 vulcanized.html。学习更多有关vulcanize的知识,请看这儿。

注意:http2的服务器推送功能被考虑用于以后消除文件的连结与合并。
把Template、Shadow DOM、自定义元素跟HTML导入结合起来

让我们对这个文章系列的代码使用HTML导入。你之前可能没有看过这些文章,我先解释一下:Template可以让你用声明的方式定义你的自定义元素的内容。Shadow DOM可以让一个元素的style、ID、class只作用到其本身。自定义元素可以让你自定义HTML标签。通过把这些跟HTML导入结合起来,你自定义的web 组件会变得模块化,具有复用性。任何人添加一个Link标签就可以使用它。

x-component.html

XML/HTML Code复制内容到剪贴板

<template id="template">
  <style>
    ...   
  </style>
  <p id="container">
    <img src="http://webcomponents.org/img/logo.svg">
    <content select="h1"></content>
  </p>
</template>
<script>
  // This element will be registered to index.html   
  // Because `document` here means the one in index.html   
  var XComponent = document.registerElement(&#39;x-component&#39;, {   
    prototype: Object.create(HTMLElement.prototype, {   
      createdCallback: {   
        value: function() {   
          var root = this.createShadowRoot();   
          var template = document.querySelector(&#39;#template&#39;);   
          var clone = document.importNode(template.content, true);   
          root.appendChild(clone);   
        }   
      }   
    })   
  });   
</script>
ログイン後にコピー

index.html

XML/HTML Code复制内容到剪贴板

...   
  <link rel="import" href="x-component.html">
</head>
<body>
  <x-component>
    <h1>This is Custom Element</h1>
  </x-component>
  ...
ログイン後にコピー

注意,因为x-component.html 中的document 对象跟index.html的一样,你没必要再写一些棘手的代码,它会自动为你注册。
支持的浏览器

Chrome 和 Opera提供对HTML导入的支持,Firefox要在2014年12月后才支持(Mozilla表示Firefox不计划在近期提供对HTML导入的支持,声称需要首先了解ES6的模块是怎样实现的)。

你可以去chromestatus.com或caniuse.com查询浏览器是否支持HTML导入。想要在其他浏览器上使用HTML导入,可以用webcomponents.js(原名platform.js)。

相关推荐:

HTML5中form表单标签用法详解

以上がHTML5 でのファイルインポートの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!