なぜWebページをモジュール化する必要があるのでしょうか?
この記事では、Web モジュール化がなぜ有用であるかを説明し、Web モジュール化を今すぐ実装するために使用できるいくつかのメカニズムを紹介します。こちらは、RequireJS で使用される関数ラッピング形式の設計思想を説明した別の記事です。
問題§1
Webサイトは徐々にWebアプリに変わっていく
コードの複雑さは徐々に増加している
組み立てが困難になっている
開発者はJSファイル/モジュールを分離したい
リクエストのデプロイ時にコードを複数のHTTPに最適化できる
解決策 §2
フロントエンド開発者には次のような解決策が必要です:
そのような API #include/import/require
ネストされた依存関係を読み込む機能があります
開発者にとって使いやすく、その背後に最適化ツールがありますhelpdeploy
スクリプト読み込みAPI § 3
まずスクリプト読み込みAPIを整理します。ここにはいくつかのオプションがあります:
Dojo: dojo.require("some.module") LABjs: $LAB.script("some/module.js") CommonJS: require("some/module")
すべては some/path/some/module.js の読み込みにマップされます。 CommonJS の構文はより一般的になる可能性が高く、コードを再利用したいため、理想的には CommonJS の構文を選択します。
私たちは現在、既存のプレーンテキスト JavaScript ファイルをロードできる構文をいくつか用意したいと考えています。これにより、開発者はスクリプトのロードのメリットを得るためにすべての JavaScript を書き直す必要がなくなります。
しかし、ブラウザでもっとうまく動作するものが必要です。 CommonJS の require() は、モジュールがすぐに返されることを期待する同期呼び出しです。ただし、これはブラウザではうまく機能しません。
非同期と同期§ 4
次の例は、ブラウザの基本的な問題を示しています。 Employee オブジェクトがあり、Employee オブジェクトから派生した Manager オブジェクトが必要だとします。この例では、スクリプトを使用して API をロードし、次のようにコーディングします。
var Employee = require("types/Employee");function Manager () { this.reports = []; }//Error if require call is asyncManager.prototype = new Employee();
上記のコメントに示されているように、require() が非同期の場合、このコードは機能しません。ただし、ブラウザにスクリプトを同期的に読み込むと、パフォーマンスが低下します。じゃあ何をすればいいの?
スクリプトの読み込み: XHR§ 5
スクリプトの読み込みに XMLHttpRequest (XHR) を使用するのは非常に魅力的です。 XHR を使用する場合、上記のテキストに触れることができます。つまり、正規表現を使用して require() 呼び出しを見つけてこれらのスクリプトを確実にロードし、eval() または script 要素を使用してテキスト コンテンツをユーザーに渡すことができます。 XHR 読み込みスクリプト。
モジュールの評価に eval() を使用するのは良くありません:
開発者は、eval() を使用するのは良くないと言われています。
一部の環境では eval() がサポートされていません。
デバッグが難しい。 Firebug と WebKit のインスペクタには、評価されるテキストに名前を付けるための //@sourceURL= 規則がありますが、この機能はすべてのブラウザでサポートされているわけではありません。
ブラウザが異なればコンテキストの評価も異なります。 IE の execScript がそれを行う可能性がありますが、それはまた、より多くの可動部分を意味します。
テキストコンテンツを含むスクリプトタグを使用してファイルテキストとして設定することも良くありません:
デバッグ時に得られるエラー行番号がソースファイル番号と一致しません。
XHR には、クロスドメインリクエストを行う際に依然として問題があります。一部のブラウザーはクロスドメイン XHR をサポートしていますが、すべてではありません。そして IE は、クロスドメイン要求を実装するために、別の API オブジェクト XDomainRequest を作成することにしました。変更しなければならないことが増え、間違いを犯しやすくなります。特に、このクロスオリジン要求が確実に許可されるようにするには、非標準の HTTP ヘッダーを送信しないようにするか、別の「プリフライト」要求を要求しないようにする必要があります。
Dojo は eval() を通じて XHR ベースのローダーを使用しますが、それは機能しますが、開発者にとっては常に問題の原因でした。 Dojo には xdomain ローダーがありますが、関数ラッパーを使用して require モジュールを変更する必要があるため、script src="" タグを使用してモジュールをロードできます。プログラマにとって困難をもたらす特殊なケースやバリエーションも数多くあります。
新しいスクリプトローダーを作成すれば、もっとうまくできるでしょう。
スクリプトの読み込み: Web ワーカー § 6
Web ワーカーはスクリプトをロードする別の方法かもしれませんが、:
クロスプラットフォームではありません
メッセージング API であり、スクリプトは DOM を対話的に処理する必要があるかもしれません。ワーカーを使用してスクリプトのテキストを取得し、そのテキストをメイン ウィンドウに返し、その後 eval/script を使用してスクリプトを実行します。このアプローチには、上で述べた XHR のすべての問題が伴います。
スクリプトの読み込み: document.write()§ 7
Document.write() は、他のドメインからスクリプトを読み込み、ブラウザが通常どのようにスクリプトを使用するかをマッピングするために使用できるため、簡単なデバッグに使用できます。
ただし、非同期と同期の例では、スクリプトを直接実行することはできません。理想的には、スクリプトを実行する前に require() を介して関連する依存関係を把握し、これらの依存関係が最初に読み込まれるようにする必要があります。ただし、スクリプトが実行される前にアクセスすることはできません。
而且,document.write()在页面载入后就不工作了。对于你的网站,一个好的方法是在用户需要进行下一步操作时来载入脚本。
最后,通过document.write()载入脚本或阻塞页面的渲染。要让你的网站有最佳表现,这个方法是不可取的。
脚本载入:head.appendChild(script)§ 8
我们可以在需要时创建脚本并将它们添加到头部:
var head = document.getElementsByTagName('head')[0], script = document.createElement('script'); script.src = url; head.appendChild(script);
上面的脚本片段多了一点东西,不过那正是基本的思想。这种方法比document.write要好,因为它不会阻塞页面的渲染并且在页面载入后仍能工作。
但是,它仍然有同步VS异步例子的问题:理想情况下,在执行脚本前我们能够通过require()知道相关依赖项,并且确保这些依赖项被首先载入。
函数封装 § 9
在执行我们的脚本前,我们需要知道相关依赖项并确保已经将其载入。做这件事的最好方法是通过函数封装来构造我们的模块载入API。像这样:
define( //The name of this module "types/Manager", //The array of dependencies ["types/Employee"], //The function to execute when all dependencies have loaded. The //arguments to this function are the array of dependencies mentioned //above. function (Employee) { function Manager () { this.reports = []; } //This will now work Manager.prototype = new Employee(); //return the Manager constructor function so it can be used by //other modules. return Manager; } );
这是ReguireJS的句法。如果你想载入没有定义成模块的纯文本的JavaScript的话,有一种简单的句法:
require(["some/script.js"], function() { //This function is called after some/script.js has loaded. });
选择这种句法是因为,它足够简洁并且允许载入者使用head.appendChild(script)载入类型。
出于在浏览器中良好工作的需要,它有不同于普通的CommonJS句法。有建议说普通的CommonJS句法可以使用head.appendChild(script)的载入类型,如果服务器进程有封装的函数可以将模块转换成传输格式的话。
我相信不强制使用一个运行时服务器进程来转换代码是很重要的事:
一是调试变的很怪异,因为服务器在注入封装函数时会导致源文件的行号关闭。
二是需要做更多的工作。前端开发应该尽可能的使用静态文件。
关于设计的力量和功能封装格式的使用案例的更多细节,被叫做异步模块定义(Asynchronous Module Definition (AMD)),请前往为什么是AMD?
原文地址:http://www.php.cn/website-design-ask-340211.html
以上就是为什么要web网页模块化?的内容,更多相关内容请关注PHP中文网(www.php.cn)!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











1. module を使用したファイルへのログ出力:logging はカスタム レベルのログを生成し、指定したパスにログを出力できます ログ レベル: debug (デバッグ ログ) = 5) {clearTimeout (time) // すべての結果が取得された場合 10連続した時間が空です スケジュールされたタスクのログをクリアします}return}if(data.log_type==2){//新しいログが取得された場合 for(i=0;i

Caddy の概要 Caddy は強力で拡張性の高い Web サーバーであり、現在 Github 上に 38,000 以上のスターが付いています。 Caddy は Go 言語で書かれており、静的リソースのホスティングとリバース プロキシに使用できます。 Caddy には以下の主な特徴があります: Nginx の複雑な構成と比較して、元の Caddyfile 構成は非常にシンプルです; 提供する AdminAPI を通じて構成を動的に変更できます; デフォルトで自動 HTTPS 構成をサポートし、自動的に適用して構成できますHTTPS 証明書; 数万のサイトのデータに拡張可能; 追加の依存関係なしでどこでも実行可能; Go 言語で記述されているため、メモリの安全性がより保証されます。まずはCentOに直接インストールします

JavaAPI 開発における Web サーバー処理に Jetty7 を使用する インターネットの発展に伴い、Web サーバーはアプリケーション開発の中核部分となり、多くの企業でも注目を集めています。増大するビジネス ニーズを満たすために、多くの開発者が Web サーバー開発に Jetty の使用を選択しており、その柔軟性と拡張性は広く認識されています。この記事では、JavaAPI 開発における Jetty7 の使用方法を紹介します。

まず、frpって何?という疑問があると思います。簡単に言うと、frp はイントラネット侵入ツールであり、クライアントを設定すると、サーバー経由でイントラネットにアクセスできるようになります。現在、私のサーバーは Web サイトとして nginx を使用しており、ポート 80 が 1 つだけあります。では、FRP サーバーもポート 80 を使用したい場合はどうすればよいでしょうか?クエリ後、nginx のリバース プロキシを使用してこれを実現できます。追加: frps はサーバー、frpc はクライアントです。ステップ 1: サーバーの nginx.conf 構成ファイルを変更し、次のパラメータを nginx.conf の http{} に追加します。server{listen80

顔面遮蔽弾幕とは、映像内の人物を遮ることなく大量の弾幕が浮遊し、人物の背後から浮遊しているように見せることです。機械学習は数年前から普及していますが、これらの機能がブラウザでも実行できることは多くの人に知られていません。この記事では、ビデオ連発における実際的な最適化プロセスを紹介します。記事の最後に、適用可能なシナリオをいくつか示します。このソリューションを開くことを望んでいます。いくつかのアイデアがあります。 mediapipeDemo (https://google.github.io/mediapipe/) は、顔ブロック弾幕のオンデマンドアップアップロードの主流の実装原理を示していますサーバーのバックグラウンド計算により、ビデオ画面内のポートレート領域を抽出し、SVG ストレージに変換しますクライアントがビデオを再生している間、サーバーから SVG をダウンロードし、弾幕、ポートレートと組み合わせる

フォーム検証は Web アプリケーション開発において非常に重要なリンクであり、フォーム データを送信する前にデータの有効性をチェックして、アプリケーションのセキュリティ脆弱性やデータ エラーを回避できます。 Web アプリケーションのフォーム検証は、Golang を使用すると簡単に実装できます。この記事では、Golang を使用して Web アプリケーションのフォーム検証を実装する方法を紹介します。 1. フォーム検証の基本要素 フォーム検証の実装方法を紹介する前に、フォーム検証の基本要素が何であるかを知る必要があります。フォーム要素: フォーム要素は

Web 標準は、W3C およびその他の関連組織によって策定された一連の仕様とガイドラインです。HTML、CSS、JavaScript、DOM、Web アクセシビリティおよびパフォーマンスの最適化の標準化が含まれます。これらの標準に従うことで、ページの互換性を向上させることができます。 、メンテナンス性とパフォーマンス。 Web 標準の目標は、Web コンテンツをさまざまなプラットフォーム、ブラウザー、デバイス上で一貫して表示および操作できるようにして、より優れたユーザー エクスペリエンスと開発効率を提供することです。

nginx はバージョン情報を非表示にするだけでなく、カスタム Web サーバー情報もサポートしています。最終的な非表示結果を見てみましょう。それを実現する方法は何ですか? それは実際には非常に簡単です。下を見てください 1. 最新の安定バージョンをダウンロードするための公式 Web サイト wgethttp ://nginx.org/ download/nginx-1.14.1.tar.gz2 tar-xfnginx-1.14.1.tar.gzcdnginx-1.14.13 を解凍します。 c ファイルを修正します (1) vimsrc/http/ngx_http_header_filter_module.c #Modify 49行目 staticu_charngx_http_
