検索
ホームページウェブフロントエンドjsチュートリアルNode.js_node.jsのモジュールの仕組みの勉強メモ

JavaScript が誕生して以来、JavaScript をプログラミング言語とみなした人は誰もいませんでした。 Web 1.0 時代には、このスクリプト言語は主にフォーム検証と Web ページの特殊効果に使用されていました。 JS が広く評価されるようになったのは、フロントエンド エンジニアが JS を使用して Web ページのユーザー エクスペリエンスを大幅に向上させた Web 2.0 の時代になってからです。 JS の人気が高まるにつれて、ツール ライブラリ、コンポーネント ライブラリ、フロントエンド フレームワーク、およびフロントエンド アプリケーションにおおまかな変更が加えられてきました。 Javascript には本質的にモジュールという機能が 1 つ欠けていますが、CommonJS 仕様の登場によってこの欠点が補われています。この記事ではCommonJSの仕様とNodeのモジュールの仕組みを紹介します。

他の高級言語の中でも、Java にはクラス ファイルがあり、Python にはインポート メカニズムがあり、PHP には include と require があります。 JS が <script> タグを介してコードを導入する方法は複雑に見えます。以前は、コードを人為的に制限するには、名前空間やその他の方法を使用する必要がありました。フロントエンドとバックエンドの Javascript を統合できるようになったのは、CommonJS 仕様の登場です。 Node は CommonJS の Modules 仕様を利用して、非常に使いやすいモジュール システムを実装します。 </script>

1. CommonJS モジュールの仕様

CommonJS のモジュール仕様は 3 つの部分に分かれています:

1). モジュール参照: require() メソッドを通じてモジュールの API を現在のコンテキストに導入し、var math = require('math'); などのモジュール識別子を渡します。 2).モジュール定義: 現在のモジュールのメソッドまたは変数を、exports オブジェクトを通じてエクスポートします。モジュール内にはモジュール オブジェクトもあり、エクスポートは実際にはモジュールの属性です。 Node では、ファイルはモジュールであり、モジュール内の「グローバル変数」は外部からは見えません。exports.add = function() {}; のように、エクスポートにマウントされた属性のみが公開されます。 = 3.1415926;
3). モジュール識別: 実際には、上記の「math」など、require() に渡されるパラメータであり、camel 命名法に準拠した文字列、または「.」「..」で始まる相対パスである必要があります。または絶対パス。ファイル名の接尾辞「.js」は不要です

2. ノードモジュール実装プロセス

Node では、モジュールは 2 つのカテゴリに分類されます。1 つは Node 自体が提供するコア モジュール、もう 1 つはユーザーが作成したファイル モジュールです。コア モジュールの一部は、Node のソース コードのコンパイル プロセス中にバイナリ ファイルにコンパイルされます。コア モジュールは、Node の起動時にメモリに直接ロードされるため、ロード速度が最も速くなります。ファイル モジュールは実行時に動的にロードされ、パス分析、ファイルの場所、コンパイルと実行の 3 つの手順が必要です。なお、Nodeは二次導入コストを削減するためにインポートしたモジュールをキャッシュしており、同一モジュールの二次ロードは最優先のキャッシュからロードする戦略を採用しています。

2.1 パス分析

パス分析では主に上記のモジュール識別子が分析され、主に次のカテゴリに分類されます。

1)、http、fs、path などのコア モジュール。

2) . または ..

で始まる相対パス ファイル モジュール 3) /
で始まる絶対パスファイルモジュール 4). カスタム ファイル モジュール。ファイルまたはパッケージの形式である場合があります。ノードはモジュール パス配列 module.paths に従ってターゲット ファイルを 1 つずつ検索しようとします。通常、現在のディレクトリに沿ってルート ディレクトリまで段階的に node_modules という名前のディレクトリを検索します。そのため、これが最も時間のかかる方法です。それを見つけるために。

2.2 ファイルの配置

パス分析に基づいて、ファイルの場所では次の詳細に注意する必要があります:

1) ファイル拡張子の解析: CommonJS の仕様ではモジュール識別子に拡張子を記入しないことが認められているため、Node は .js、.json、.node の順に拡張子を記入して順番に試行します

2) ディレクトリ分析とパッケージ: 上記のファイル拡張子の分析後に対応するファイルが見つからなかったが、ディレクトリが取得された場合、ノードはそのディレクトリをパッケージとして扱います


2.3 コンパイルと実行

特定のファイルを見つけた後、Node は新しいモジュール オブジェクトを作成し、パスに従ってロードしてコンパイルします。拡張機能が異なると、読み込み方法も異なります:

1)、.js ファイル: fs モジュールを通じてファイルを同期的に読み取り、コンパイルして実行します

2).node ファイル: これは C/C で書かれ、dlopen() メソッド

を通じてロードされる拡張ファイルです。 3).json ファイル: fs モジュールを通じてファイルを同期的に読み取り、JSON.parse() を使用して解析して結果を返します
4). その他の拡張子ファイル: .js ファイルとしてロードされます

各モジュール ファイルには、デフォルトで、require、exports、および module という 3 つの変数があることがわかっています。Node の API ドキュメントでも、各モジュールには、filename と dirname という 2 つの変数があることがわかります。 Node のモジュールは、宣言された「グローバル変数」が実際に他のモジュールを汚染しないことをどのように保証するのでしょうか?実際、Node は JS モジュールのコンパイル中にファイルの内容の先頭と末尾をラップします。以下は、先頭と末尾のパッケージ化を含む JS ファイルの例です:

コードをコピー コードは次のとおりです:

(function(exports, require, module, __filename, __dirname) {
/* 真ん中は実際の JS ファイルの内容です */
var math = require('math');
exports.area = function(radius) {
戻り Math.PI * 半径 * 半径;
};
/* JS ファイルの実際の内容は終わりです */
});

このようにして、各モジュール ファイルはスコープで分離され、require、exports、module などの変数もモジュールのコンテキストに挿入されます。これは、CommonJS モジュール仕様の Node の実装です。 C/C モジュールとノード コア モジュールのコンパイル プロセスは比較的複雑なので、詳細は説明しません。

3. モジュール呼び出しスタック

以下の図に示すように、Node 内のさまざまなモジュールの呼び出し関係を明確にする必要があります。

C/C 組み込みモジュールは最下位のモジュールであり、主に Javascript コア モジュールとサードパーティの Javascript ファイル モジュールを呼び出すための API を提供します。実際には、このようなモジュールが公開されることはほとんどありません。 Javascript コア モジュールには 2 つの主な役割があります。1 つはファイル モジュール呼び出し用の C/C 組み込みモジュールのカプセル化層およびブリッジング層として機能すること、もう 1 つは純粋に機能するモジュールであり、最下層。ファイル モジュールは通常、通常の Javascript モジュールや C/C 拡張モジュールなどのサードパーティによって作成されます。

4. パッケージと NPM

4.1 パッケージ構造

パッケージは基本的にアーカイブ ファイル (通常は .zip または .tar.gz) であり、インストール後に解凍してディレクトリに復元できます。 CommonJS パッケージ仕様は、パッケージ構造とパッケージ説明ファイルの 2 つの部分で構成されます。 CommonJS 仕様に完全に準拠したパッケージ構造には、次のファイルが含まれている必要があります:

1).package.json: パッケージ説明ファイル

2).bin: 実行可能なバイナリファイルが保存されるディレクトリ
3).lib: Javascript コードを格納するディレクトリ
4).doc: ドキュメントを保存するディレクトリ
5).test: 単体テスト ケースを保存するディレクトリ

4.2 パッケージ記述ファイル

パッケージ説明ファイルは、パッケージのルート ディレクトリにある JSON ファイル、package.json であり、パッケージの重要な部分であり、パッケージの一般情報を記述するために使用されます。後で説明する NPM のすべての動作は、このファイルのフィールドと密接に関連しています。以下では、よく知られた Web フレームワーク Express プロジェクトの package.json ファイルを例として使用して、いくつかの一般的なフィールドの意味を説明します。

1).name: パッケージ名

2).description: パッケージの紹介
3).version: バージョン番号。「セマンティック バージョン管理」に準拠する必要があります。http://semver.org/
を参照してください。 4).dependency: 現在のパッケージを使用するために必要なパッケージのリスト。この属性は非常に重要です。NPM はこの属性を通じて依存パッケージを自動的にロードします
5).repositories: ソースコードがホストされている場所のリスト

他のフィールドの使用法については、NPM package.json の説明を参照してください

4.3 NPM 共通機能

NPM (ノード パッケージ マネージャー)、通常はノード パッケージ マネージャーと呼ばれます。その主な機能は、インストール、アンインストール、更新、表示、検索、リリースなどのノード パッケージを管理することです。

4.3.1 NPM パッケージのインストール

Node パッケージのインストールには、ローカル インストールとグローバル インストールの 2 種類があります。 2 つの違いは次のとおりです:

1). ローカルインストール npm install : パッケージは現在のディレクトリにダウンロードされ、現在のディレクトリでのみ使用できます。

2). グローバル インストール npm install -g : パッケージは特定のシステム ディレクトリにダウンロードされ、インストールされたパッケージはすべてのディレクトリで使用できます。

4.3.2 NPM パッケージ管理

以下では、一般的に使用されるパッケージ管理コマンドをリストする例として grunt-cli (grunt コマンド ライン ツール) を取り上げます:

1).npm install: package.json ファイルの依存関係フィールドと devDependency フィールドで宣言されたすべてのパッケージをインストールします

2).npm install grunt-cli@0.1.9: 特定のバージョンの grunt-cli
をインストールします。 3).npm install grunt-contrib-copy --save: grunt-contrib-copy をインストールし、依存関係を package.json ファイルに保存します
4).npm uninstall grunt-cli: パッケージ
をアンインストールします 5).npm リスト: どのパッケージがインストールされているかを確認します
6).npm public :パッケージを公開

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

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

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

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

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

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

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

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

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

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

JavaScriptをインストールするにはどうすればよいですか?JavaScriptをインストールするにはどうすればよいですか?Apr 05, 2025 am 12:16 AM

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

クォーツでタスクが開始される前に通知を送信する方法は?クォーツでタスクが開始される前に通知を送信する方法は?Apr 04, 2025 pm 09:24 PM

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

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

MantisBT

MantisBT

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

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

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。