Node.js v 10.1.0 Dcumentation


Modules
Stable
Node.jsモジュールシステムでは、各ファイルは独立したモジュールとして扱われます.foo.jsという名前があると仮定する.
const circle = require('./circle.js');
console.log(`The area of a circle of radius 4 is ${circle.area(4)}`);
第1行目は、foo.jsに、同じフォルダの下のモジュールcircle.js.・circle.js`の内容がロードされている.
const { PI } = Math;

exports.area = (r) => PI * r ** 2;

exports.circumference = (r) => 2 * PI * r;
モジュールcircle.jsは、arear()およびcircumfence()の方法を露出している.方法およびオブジェクトは、この特殊なexportsオブジェクトに対して追加の属性値を付与することにより、モジュールのルートに追加される.モジュールのローカル変数は、Node.jsによってモジュールが一つの関数にカプセル化されるので、プライベートになります.この例では、変数PIcircle.jsに対してプライベートである.module.exports属性は、関数またはオブジェクトのような新しい値を付与することができ、bar.jsは、squareモジュールを使用して、Squareクラスを導出する.
const Square = require('./square.js');
const mySquare = new Square(2);
console.log(`The area of mySquare is ${mySquare.area()}`);
squareモジュールはsquare.jsで定義されている.
// assigning to exports will not modify module, must use module.exports
module.exports = class Square {
  constructor(width) {
    this.width = width;
  }

  area() {
    return this.width ** 2;
  }
};
モジュールシステムはrequire('module')モジュールで実装される.
メールにアクセスします
node.jsが直接実行するファイルは、require.mainがこのファイルのmoduleに設定されますので、require.main == moduleを介して、現在のファイルがnode.jsによって直接実行されているかどうかを判断することができます.node *.jsは、1つのmodule属性を提供するからである(通常はfilenameに等しい).現在のアプリケーションの入口は__filenameによって取得することができる.require.main.filenamerequire 方法を呼び出すと、require()方法を用いて正確なファイル名を取得し、論理は以下の通りである.
require(X) from module at path Y
1. If X is a core module,
   a. return the core module
   b. STOP
2. If X begins with '/'
   a. set Y to be the filesystem root
3. If X begins with './' or '/' or '../'
   a. LOAD_AS_FILE(Y + X)
   b. LOAD_AS_DIRECTORY(Y + X)
4. LOAD_NODE_MODULES(X, dirname(Y))
5. THROW "not found"

LOAD_AS_FILE(X)
1. If X is a file, load X as JavaScript text.  STOP
2. If X.js is a file, load X.js as JavaScript text.  STOP
3. If X.json is a file, parse X.json to a JavaScript Object.  STOP
4. If X.node is a file, load X.node as binary addon.  STOP

LOAD_INDEX(X)
1. If X/index.js is a file, load X/index.js as JavaScript text.  STOP
2. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
3. If X/index.node is a file, load X/index.node as binary addon.  STOP

LOAD_AS_DIRECTORY(X)
1. If X/package.json is a file,
   a. Parse X/package.json, and look for "main" field.
   b. let M = X + (json main field)
   c. LOAD_AS_FILE(M)
   d. LOAD_INDEX(M)
2. LOAD_INDEX(X)

LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
   a. LOAD_AS_FILE(DIR/X)
   b. LOAD_AS_DIRECTORY(DIR/X)

NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = []
4. while I >= 0,
   a. if PARTS[I] = "node_modules" CONTINUE
   b. DIR = path join(PARTS[0 .. I] + "node_modules")
   c. DIRS = DIRS + DIR
   d. let I = I - 1
5. return DIRS
Caching
modulesは初めて読み込まれたときcacheに入れます.つまり、require.resolve()を呼び出すたびに、同じファイルが解析されると、同じリターンオブジェクトが得られる.もし一つのmoduleに何度もコードを実行させたいなら、exportは一つのfunctionを使って、そのfunctionを呼び出します.
Module Caching警告
moduleは彼らが解析されたファイル名に基づいてcacheにロードします.moduleはmoduleを起動する経路が異なるため、レスリングによって異なるファイル名を持つことができるので、同じrequire('foo')を呼び出すたびに同じオブジェクトに戻ることは保証されない.大きさの書き込みに敏感なファイルシステムやオペレーティングシステムは、たとえmoduleが同じファイルとして解析されても、大きさのために何度もマウントされます.
コアModules
Node.jsにはいくつかのmoduleがバイナリファイルにコンパイルされています.これらのmoduleはNode.jsソースファイルに定義されています.require(module)ディレクトリの下にあります.Core Moduleはcacheにプリロードされています.lib/は内蔵のHTTP moduleを呼び出します.たとえ現在のディレクトリの下にhttpというファイルがありますとしても.
Cyclesrequire('http'):
console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');
a.js:
console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');
b.js:
console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done = %j, b.done = %j', a.done, b.done);
main.js:
$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done = true, b.done = true
無限ループを防止するために、output unfinished copyはa.jsに戻ります.
File Modules
指定された名前の値段が見つからない場合、Node.jsは、ファイルの拡張子b.jsを追加しようと試み、.js.jsonが見つかりませんでした..nodeに戻ります.
Folders as Modules
programsとlibririesを一つの目次の下に組織して、一つの統一的な入り口を提供することをオススメします.このフォルダの名前をMODULE_NOT_FOUNDメソッドのパラメータとして伝えることができる3つの方法があります.
  • は、フォルダのルートディレクトリの下にrequire()のファイルを作成し、package.json mduleを指定します.
    { 
      "name" : "some-library",
      "main" : "./lib/some-library.js"
     }
  • は、入り口mainのファイルを作成します.
  • は、入り口index.jsのファイルを作成します.
    Loading from index.node Foldersnode_modulesに伝達されたmodule名が一つのcore moduleではなく、require()'/''../'を開始としていない場合、Node.jsは、'./'ディレクトリの下から必要なmoduleを検索することを試みる.例えば、''/home/ry/projects/foo.js'呼び出しnode_modulesがあり、node.jsは以下のように順次検索される.
  • /home/ry/project/node_modules/bar.js
  • /home/ry/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.jsはまた、既知の経路のmoduleを参照として使用して、このmoduleに対する他のmoduleを検索することができる.
  • Loading from the global foldersrequire('bar.js')に指定されたmoduleがまだ見つからない場合、Node.jsは、システム環境変数bar.jsによって指定されたディレクトリを検索する.もちろん、前提はこの環境変数を設定しています.壁裂は、node_modulesディレクトリの下に関連するmoduleを置くことを推奨しています.このようにロードすると、より速く安定します.
    The module wrapper
    moduleのコードが実行される前に、Node.jsは先にmoduleの中のコードをカプセル化します.
    (function(exports, require, module, __filename, __dirname) {
    // Module code actually lives in here
    });
    このようにするメリットは:
  • は、globalオブジェクトの下ではなく、変数をこのmoduleに限定します.
  • は、globalと似たようなオブジェクトを提供する.(NODE_PATH、'require node_modules、'u dirname`)
  • The module scope
    同前dirname(type:string)
    Example:export from ,'module','__filenameを実行します.
    console.log(__dirname);
    // Prints: /Users/mjr
    console.log(path.dirname(__filename));
    // Prints: /Users/mjr
    同前filename(type:string)
    Example:node example.js from /Users/mjrを実行します.
    console.log(__filename);
    // Prints: /Users/mjr/example.js
    console.log(__dirname);
    // Prints: /Users/mjr
    二つのファイルa.jsとb.jsを与えられました.a.jsはb.jsに依存しています.次のような構造があります.
  • /Users/mjr/ap/a.js
  • /Users/mjr/ap/node_modules/b/b.js
  • exportsnode example.jsに等しい.
    module(type:object)
    現在module
    require()(type:function)
    依存moduleを呼び出します.
    require.cache(type:object)
    require法で呼び出されたすべての依存性はこのオブジェクトに格納されています.オブジェクトの中のあるキーが削除された場合、次回/Users/mjrメソッドを呼び出すと、このmoduleが再ロードされます.しかしこの方法はnative addonsを適用しない.
    require.extensions(廃棄)
    require.main(type:object)
    代表プログラム起動時の入り口module.
    require.reolve(request[これはパラメータです]module.exoportsのメカニズムを使用して、あるmoduleのパスを検索したが、解決されたfilenameだけに戻り、このmoduleをロードしない.
    require.reolve.paths(request[これもパラメータです]
    あるmoduleが遍歴している経路情報を検索します.core moduleであれば、nullに戻ります.
    The require() Objectrequire:現在のmoduleのすべての依存項module:あるクラスのインスタンス(exportは不可)を付与するために使用されてもよい.module.children:
    const EventEmitter = require('events');
    module.exports = new EventEmitter();
    // Do some work, and after some time emit
    // the 'ready' event from the module itself.
    setTimeout(() => {
      module.exports.emit('ready');
    }, 1000);
    module.exports:
    const a = require('./a');
    a.on('ready', () => {
      console.log('module "a" is ready');
    });
    割り当て操作はすぐに完了する必要があります.掉中に完了してはいけません.以下のコードは有効ではないです.a.js:
    setTimeout(() => {
      module.exports = { a: 'hello' };
    }, 0);
    b.js:
    const x = require('./x');
    console.log(x.a);
    他の属性x.js:全ファイル名y.js:module識別子は通常、全ファイル名module.filenameである.moduleがロードされているかどうかmodule.id.最初にこのmoduleを呼び出すmodule module.loaded.検索パスmodule.parent:module外調用requireの方法.
    ソースリンク
    転載先:https://www.cnblogs.com/ArvinZhao/p/9067051.html