検索

commonJSの詳しい説明

Mar 09, 2018 pm 02:08 PM
javascript詳しい説明

今回は commonJS について詳しく説明します。 commonJS を使用する際の 注意事項 は何ですか?実際の事例を見てみましょう。

CommonJS の概要

すべてのコードはモジュール スコープで実行され、グローバル スコープを汚染しません。

モジュールは複数回ロードできますが、最初にロードされるときは 1 回だけ実行され、実行結果はキャッシュされ、後でロードされると、キャッシュされた結果が直接読み取られます。モジュールが再び動作するには、キャッシュをクリアする必要があります。
モジュールがロードされる順序は、コード内に出現する順序です。

2.モジュールオブジェクト

各モジュール内には、現在のモジュールを表すモジュールオブジェクトがあります。以下のような性質を持っています。

console.log(module.id) //模块的识别符,通常是带有绝对路径的模块文件名。console.log(module.filename) //模块的文件名,带有绝对路径。console.log(module.loaded) //返回一个布尔值,表示模块是否已经完成加载。console.log(module.parent) //返回一个对象,表示调用该模块的模块。console.log(module.children) //返回一个数组,表示该模块要用到的其他模块。console.log(module.exports) //表示模块对外输出的值。

2.1 module.exports 属性

module.exports 属性は、他のファイルがモジュールをロードするときに、実際に module.exports 変数を読み取ります。

2.2 エクスポート変数

便宜上、Node は module.exports を指す各モジュールのエクスポート変数を提供します。これは、各モジュールの先頭に次のような行があることと同じです:

var exports = module.exports;(commonJS隐式做了这个赋值)

この利点は、モジュール インターフェイスをエクスポートするときに、メソッドをエクスポート オブジェクトに追加して公開できることです。

そのため、module.exports を変更しても、export.xxx を使用して何かを公開したい場合は、exports = module.exports を自分で記述する必要があります。
Li:

module.exports = songthing;//接下来把exports指回来exports = module.exports;//常见写法是:exports = module.exports = something;

3. AMD 仕様と CommonJS 仕様の互換性


CommonJS仕様のロードモジュールは同期的であり、ロードが完了した後でのみ後続の操作を実行できます。 AMD 仕様は、

コールバック関数を指定できる非同期読み込みモジュールです。 Node.js は主にサーバー プログラミングに使用されるため、通常、モジュール ファイルはローカル ハード ディスク上にすでに存在しており、非同期ロードを考慮する必要がないため、CommonJS 仕様の方が適用可能です。ただし、ブラウザ環境でモジュールをサーバーからロードする場合は、非同期モードを使用する必要があるため、ブラウザでは通常 AMD 仕様が使用されます。

define(['package/lib'], function(lib){  function foo(){
    lib.log('hello world!');
  }  return {    foo: foo
  };
});

AMD仕様により、出力モジュールはCommonJS仕様と互換性を持つことができます。 この場合、defineメソッドは次のように記述する必要があります:

define(function (require, exports, module){  var someModule = require("someModule");  var anotherModule = require("anotherModule");
  someModule.doTehAwesome();
  anotherModule.doMoarAwesome();
  exports.asplode = function (){
    someModule.doTehAwesome();
    anotherModule.doMoarAwesome();
  };
});

4.requireコマンド

4.1 基本的な使い方

NodeはCommonJSモジュール仕様を使用します。組み込みの require コマンドは、モジュール ドキュメントをロードするために使用されます。

require コマンドの基本的な機能は、
JavaScript ファイルを読み取って実行し、モジュールのエクスポート オブジェクトを返すことです。指定されたモジュールが見つからない場合は、エラーが報告されます。 (端的に言うと、別のファイルで公開されている値がこのファイルで参照されます。)

// example.jsvar invisible = function () {  console.log("invisible");
}
exports.message = "hi";
exports.say = function () {  console.log(message);
}

以下のコマンドを実行してexportsオブジェクトを出力します。

//someelse.jsvar example = require('./example.js');console.log(example);// {//   message: "hi",//   say: [Function]// }

モジュールが関数を出力する場合、それはexportsオブジェクトでは定義できませんが、module.exports変数で定義する必要があります。

//example2.jsmodule.exports = function () {  console.log("hello world")
}require('./example2.js')()

上記のコードでは、requireコマンドが自身を呼び出しており、module.exportsを実行したことと同じなので、hello worldが出力されます。

4.2 読み込みルール

require コマンドはファイルの読み込みに使用され、接尾辞のデフォルトは .js です。

var foo = require('foo');//  等同于var foo = require('foo.js');

さまざまな形式のパラメータに従って、require コマンドはさまざまなパスにあるモジュール ファイルを検索します。

(1) パラメータ

string が「/」で始まる場合、絶対パスにあるモジュール ファイルがロードされています。たとえば、require('/home/marco/foo.js') は /home/marco/foo.js を読み込みます。 (2) パラメータ文字列が「./」で始まる場合は、(スクリプト実行の現在位置と比較して) 相対パスにあるモジュール ファイルがロードされることを意味します。たとえば、require('./circle') は、現在のスクリプトと同じディレクトリにcircle.jsをロードします。
(3) パラメータ文字列が「./」または「/」で始まらない場合は、デフォルトで提供されるコアモジュール(Nodeのシステムインストールディレクトリにある)、またはnode_modulesディレクトリにある既存のモジュールを意味します。すべてのレベルでモジュールがロードされます (グローバルまたはローカル)。

たとえば、スクリプト /home/user/projects/foo.js が require('bar.js') コマンドを実行すると、Node は次のファイルを順番に検索します。

/usr/local/lib/node/bar.js
/home/user/projects/node_modules/bar.js
/home/user/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js

この設計の目的は、さまざまなモジュールが依存するモジュールをローカライズできるようにすることです。

(4) パラメータ文字列が「./」または「/」で始まらず、require('example-module/path/to/file') などのパスの場合、example-module の場所は次のようになります。最初に見つかったものをパラメータとして使用して、後続のパスを検索します。
(5) 指定されたモジュール ファイルが見つからない場合、Node は検索する前にファイル名に .js、.json、および .node を追加しようとします。 .js ファイルはテキスト形式の JavaScript スクリプト ファイルとして解析され、.json ファイルは JSON 形式のテキスト ファイルとして解析され、.node ファイルはコンパイルされたバイナリ ファイルとして解析されます。
(6) require コマンドによってロードされた正確なファイル名を取得したい場合は、require.resolve() メソッドを使用します。

4.3 ディレクトリ読み込みルール

通常,我们会把相关的文件会放在一个目录里面,便于组织。这时,最好为该目录设置一个入口文件,让require方法可以通过这个入口文件,加载整个目录。
在目录中放置一个package.json文件,并且将入口文件写入main字段。下面是一个例子。

// package.json{ "name" : "some-library",  "main" : "./lib/some-library.js" }
require发现参数字符串指向一个目录以后,会自动查看该目录的package.json文件,然后加载main字段指定的入口文件。如果package.json文件没有main字段,或者根本就没有package.json文件,则会加载该目录下的index.js文件或index.node文件。

4.4模块的缓存

第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的module.exports属性。

require('./example.js');require('./example.js').message = "hello";require('./example.js').message// "hello"

上面代码中,连续三次使用require命令,加载同一个模块。第二次加载的时候,为输出的对象添加了一个message属性。但是第三次加载的时候,这个message属性依然存在,这就证明require命令并没有重新加载模块文件,而是输出了缓存。
如果想要多次执行某个模块,可以让该模块输出一个函数,然后每次require这个模块的时候,重新执行一下输出的函数。
所有缓存的模块保存在require.cache之中,如果想删除模块的缓存,可以像下面这样写。

// 删除指定模块的缓存delete require.cache[moduleName];// 删除所有模块的缓存Object.keys(require.cache).forEach(function(key) {  delete require.cache[key];
})

注意,缓存是根据绝对路径识别模块的,如果同样的模块名,但是保存在不同的路径,require命令还是会重新加载该模块。

4.5环境变量NODE_PATH

Node执行一个脚本时,会先查看环境变量NODE_PATH。它是一组以冒号分隔的绝对路径。在其他位置找不到指定模块时,Node会去这些路径查找。

可以将NODE_PATH添加到.bashrc。
export NODE_PATH="/usr/local/lib/node"

所以,如果遇到复杂的相对路径,比如下面这样:

var myModule = require('../../../../lib/myModule');

有两种解决方法,一是将该文件加入node_modules目录,二是修改NODE_PATH环境变量,package.json文件可以采用下面的写法。

{  "name": "node_path",  "version": "1.0.0",  "description": "",  "main": "index.js",  "scripts": {    "start": "NODE_PATH=lib node index.js"
  },  "author": "",  "license": "ISC"}

NODE_PATH是历史遗留下来的一个路径解决方案,通常不应该使用,而应该使用node_modules目录机制。

4.6模块的循环加载

如果发生模块的循环加载,即A加载B,B又加载A,则B将加载A的不完整版本。

// a.jsexports.x = 'a1';console.log('a.js ', require('./b.js').x);
exports.x = 'a2';// b.jsexports.x = 'b1';console.log('b.js ', require('./a.js').x);
exports.x = 'b2';// main.jsconsole.log('main.js ', require('./a.js').x);console.log('main.js ', require('./b.js').x);

上面代码是三个JavaScript文件。其中,a.js加载了b.js,而b.js又加载a.js。这时,Node返回a.js的不完整版本,所以执行结果如下。(也就是说,虽然这样去require看似会造成a.js和b.js循环引用,但commonJS会在将循环的点剪断循环,并对剪断处所在的a.js终止执行,b得到了第一个x值。)

$ node main.js
b.js  a1
a.js  b2
main.js  a2
main.js  b2

修改main.js,再次加载a.js和b.js。

// main.jsconsole.log('main.js ', require('./a.js').x);console.log('main.js ', require('./b.js').x);console.log('main.js ', require('./a.js').x);console.log('main.js ', require('./b.js').x);

执行上面代码,结果如下。

$ node main.js
b.js  a1
a.js  b2
main.js  a2
main.js  b2
main.js  a2
main.js  b2

上面代码中,第二次加载a.js和b.js时,会直接从缓存读取exports属性,所以a.js和b.js内部的console.log语句都不会执行了。

4.7 require.main

require方法有一个main属性,可以用来判断模块是直接执行,还是被调用执行。
直接执行的时候(node module.js),require.main属性指向模块本身。

require.main === module// true

调用执行的时候(通过require加载该脚本执行),上面的表达式返回false。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

相关阅读:

用jq发送多个ajax然后执行回调的小技巧

怎样使用伪元素first-letter让文字首字母大写

JavaScript的函数重载详解

chrome的内存不足频繁崩溃怎么处理

以上がcommonJSの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

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衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

Safe Exam Browser

Safe Exam Browser

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

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 中国語版

SublimeText3 中国語版

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

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません