コンピューター プログラミングの世界は、実際には、単純な部分を常に抽象化し、これらの抽象概念を整理するプロセスです。 JavaScript も例外ではありません。私たちが JavaScript を使用してアプリケーションを作成するとき、有名なオープン ソース ライブラリやフレームワークなど、他の人が作成したコードを使用するのでしょうか。プロジェクトが成長するにつれて、依存する必要のあるモジュールがますます増えており、現時点では、これらのモジュールを効果的に編成する方法が非常に重要な問題となっています。依存関係の注入は、コードに依存するモジュールを効果的に編成する方法の問題を解決します。有名なフロントエンド フレームワーク AngularJS など、一部のフレームワークやライブラリで「依存性注入」という用語を聞いたことがあるかもしれません。依存性注入は非常に重要な機能の 1 つです。ただし、依存性注入はまったく新しいものではありません。PHP などの他のプログラミング言語には以前から存在していました。同時に、依存関係の注入は想像されているほど複雑ではありません。この記事では、JavaScript における依存性注入の概念を学び、「依存性注入スタイル」のコードの書き方をわかりやすく説明します。
目標設定
今、2 つのモジュールがあると仮定します。最初のモジュールは Ajax リクエストの送信に使用され、2 番目のモジュールはルーターとして使用されます。
var service = function() {
Return { name: 'サービス' };
}
var router = function() {
Return { 名前: 'ルーター' };
}
現時点では、上記の 2 つのモジュールの使用を必要とする関数を作成しました:
var doSomething = function(other) {
var s = サービス();
var r = router();
};
ここで、コードをより興味深いものにするために、このパラメータはさらにいくつかのパラメータを受け取る必要があります。もちろん、上記のコードを完全に使用することはできますが、上記のコードはどの面から見ても柔軟性が若干劣ります。使用する必要があるモジュールの名前が ServiceXML または ServiceJSON に変更された場合はどうなりますか?あるいは、テスト目的で偽のモジュールを使用したい場合はどうなるでしょうか。この時点では、関数自体を編集するだけでは済みません。したがって、最初に行う必要があるのは、依存モジュールをパラメーターとして関数に渡すことです。コードは次のとおりです:
var doSomething = function(サービス、ルーター、その他) {
var s = サービス();
var r = router();
};
上記のコードでは、必要なモジュールを正確に渡します。しかし、これは新たな問題を引き起こします。コードの両方の部分で doSomething メソッドを呼び出すとします。この時点で、3 番目の依存関係が必要な場合はどうなるでしょうか。現時点では、すべての関数呼び出しコードを編集するのは賢明な考えではありません。したがって、これを行うにはコードが必要です。これは、依存性インジェクターが解決しようとしている問題です。これで目標を設定できます:
1. 依存関係を登録できるはずです
2. 依存関係インジェクターは関数を受け取り、必要なリソースを取得できる関数を返す必要があります
3. コードは複雑であってはなりませんが、シンプルで親しみやすいものである必要があります
4. 依存関係インジェクターは、渡された関数スコープを維持する必要があります
5. 渡された関数は、記述された依存関係だけでなく、カスタム パラメーターを受け取ることができる必要があります
JS/AMD メソッドが必要
おそらく、有名な requirejs について聞いたことがあるでしょう。これは、依存関係注入の問題を非常にうまく解決できるライブラリです。
define(['サービス', 'ルータ'], function(サービス, ルータ) {
// ...
});
requirejs の考え方は、最初に必要なモジュールを記述してから、独自の関数を記述する必要があるということです。中でもパラメータの順序は重要です。同様の構文を実装できる injector というモジュールを作成する必要があるとします。
var doSomething = injector.resolve(['service', 'router'], function(service, router, other) {
Expect(service().name).to.be('Service');
Expect(router().name).to.be('ルーター');
Expect(other).to.be('Other');
});
doSomething("その他");
先に進む前に、doSomething の関数本体で、expect.js アサーション ライブラリを使用してコードの正確さを確認する必要があることを 1 つ説明する必要があります。ここにはTDD(テスト駆動開発)の考え方に似たものがあります。
ここで、インジェクター モジュールの作成を正式に開始します。まず、アプリケーションのすべての部分で同じ機能を持たせるために、モノリスである必要があります。
var インジェクター = {
依存関係: {}、
レジスタ: function(key, value) {
This.dependency[key] = 値;
}、
解決: function(deps, func,scope) {
}
}
このオブジェクトは非常に単純で、2 つの関数と保存用の変数のみが含まれています。私たちがしなければならないことは、deps 配列をチェックし、依存関係変数で答えを探すことです。残りの部分は、.apply メソッドを使用して、渡した func 変数を呼び出すことです:
解決: function(deps, func,scope) {
var args = [];
for(var i=0; i
args.push(this.dependency[d]);
} else {
throw new Error('Can'tsolve ' d);
}
}
戻り関数() {
func.apply(scope || {}, args.concat(Array.prototype.slice.call(arguments, 0)));
}
上記のコードでは、Array.prototype.slice.call(arguments, 0) の機能は、引数変数を実数の配列に変換することです。これまでのところ、私たちのコードはテストに完全に合格しています。しかし、ここでの問題は、必要なモジュールを 2 回書かなければならず、それらを任意の順序で配置できないことです。追加のパラメーターは常にすべての依存関係の後に来ます。
反映方法
Wikipedia の説明によると、リフレクションとは、プログラムの実行中にオブジェクトが自身の構造や動作を変更できることを意味します。 JavaScriptでは、簡単に言えば、オブジェクトのソースコードを読み取って、ソースコードを解析する機能です。 doSomething メソッドに戻りますが、doSomething.toString() メソッドを呼び出すと、次の文字列を取得できます:
var s = サービス();
var r = router();
}"
解決メソッドを以下に示すコードに変更できます:
解決: function() {
var func、deps、scope、args = []、self = this;
func = 引数[0];
deps = func.toString().match(/^functions*[^(]*(s*([^)]*))/m)[1].replace(/ /g, '').split(' 、');
スコープ = 引数[1] {};
戻り関数() {
var a = Array.prototype.slice.call(arguments, 0);
for(var i=0; i
args.push(self.dependency[d] && d != '' ? self.dependency[d] : a.shift());
}
func.apply(scope || {}, args);
}
...
args.push(self.dependency[d] && d != '' ? self.dependency[d] : a.shift());
Expect(service().name).to.be('Service');
Expect(router().name).to.be('ルーター');
Expect(other).to.be('Other');
});
doSomething("その他");
しかし、完璧なものはありません。リフレクティブ メソッドの依存性注入には非常に深刻な問題があります。コードを単純化するとエラーが発生します。これは、コードの簡略化プロセス中にパラメーターの名前が変更され、依存関係の解決に失敗する可能性があるためです。例:
}]);
var インジェクター = {
依存関係: {}、
register: function(key, value) {
this.dependency[key] = 値;
}、
解決: function() {
var func、deps、scope、args = []、self = this;
if(引数の種類[0] === '文字列') {
func = 引数[1];
deps = argument[0].replace(/ /g, '').split(',');
スコープ = 引数[2] || {};
} else {
func = 引数[0];
deps = func.toString().match(/^functions*[^(]*(s*([^)]*))/m)[1].replace(/ /g, '').split(' 、');
スコープ = 引数[1] || {};
}
return function() {
var a = Array.prototype.slice.call(arguments, 0);
for(var i=0; i
args.push(self.dependency[d] && d != '' ? self.dependency[d] : a.shift());
}
func.apply(scope || {}, args);
}
}
}
このバージョンの解決メソッドは 2 つまたは 3 つのパラメータを受け取ることができます。
Expect(a().name).to.be('ルーター');
Expect(b).to.be('その他');
Expect(c().name).to.be('サービス');
});
doSomething("その他");
结语
上の内容では、JavaScript での依存注入の方法を紹介しており、この技術の使用を開始し、依存注入のコードを書き出すのに役立つことを期待しています。
私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

Quartzタイマーを使用してタスクをスケジュールする場合、Quartzでタスク通知を事前に送信する方法、タスクの実行時間はCron式によって設定されます。今...


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

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

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

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。
