情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでモジュールを読み込む

2016/06/18

Node.jsではモジュールの単位はファイルです。すなわち、1つのJavaScriptファイルはNode.jsでは1つのモジュールとなります。

そのため、モジュールを読み込むというのはJavaScriptファイルを読み込むということでもあります。

また、モジュールは下の3種類に大別されます。

  • コアモジュール
  • node_modulesモジュール
  • ファイルモジュール

コアモジュールはNode.jsが標準で提供しているモジュールであり、モジュール名により識別されます。

node_modulesモジュールはnode_modulesフォルダ内に格納されているモジュールであり、npm installによりインストールしたモジュールなどが含まれます。これはモジュールの相対パスにより識別されます。

ファイルモジュールは任意のフォルダ内に格納されているモジュールであり、node_modulesモジュールと同じくモジュールの相対パスにより識別されます。

モジュールの読み込み

モジュールを読み込むにはrequire関数を使用します。

var xxx = require('xxx');

第1引数

第1引数にモジュールの名称又はパスを指定します。

コアモジュールを読み込む場合には名称を指定し、node_modulesモジュールやファイルモジュールを読み込む場合には相対パスを指定します。

相対パスを指定する場合には拡張子は省略しても構いません。

指定したパスがフォルダのパスである場合にはそのフォルダのindex.jsが読み込まれます。ただし、そのフォルダにpackage.jsonという名称のJSONファイルが存在し、JSONがmainプロパティを含んでいる場合にはmainプロパティに設定されているファイルが読み込まれます。

node_modulesモジュールの読み込みはまず現在のフォルダのnode_modulesフォルダで試みられ、読み込みに失敗した場合には現在のフォルダの親フォルダのnode_modulesフォルダで試みられ、これをルートフォルダまで繰り返します。

つまり、たとえば、現在のフォルダがC:\work\node\testである場合、fooという相対パスのnode_modulesモジュールの読み込みは下のような順番で試みられます。

  • C:\work\node\test\node_modules\foo.js
  • C:\work\node\test\node_modules\foo\index.jsなど。
  • C:\work\node\node_modules\foo.js
  • C:\work\node\node_modules\foo\index.jsなど。
  • C:\work\node_modules\foo.js
  • C:\work\node_modules\foo\index.jsなど。
  • C:\node_modules\foo.js
  • C:\node_modules\foo\index.jsなど。

返り値

返り値として読み込まれたモジュールのmodule.exportsが得られます。

モジュールの絶対パスの取得

require関数により読み込まれるモジュールの絶対パスを取得するにはrequire.resolve関数を使用します。

var path = require.resolve('xxx');

第1引数にモジュールの名称又はパスを指定します。

返り値として絶対パスが得られます。

ただし、コアモジュールの名称を指定した場合にはその名称がそのまま返ります。

モジュールのキャッシュ

読み込んだモジュールはキャッシュされます

そのため、同じモジュールに対してrequire関数を複数回呼び出した場合には2回目以降の呼び出しではキャッシュされているそのモジュールのmodule.exportsが返り値として返ります。

モジュール内に記述されている処理は最初のrequire関数の呼び出しでしか実行されないことに注意してください。

キャッシュされている全てのモジュールはrequire.cacheに格納されています。

var cache = require.cache;

サンプルコード1

require-a.js

console.log(require.resolve('./require-b.js'));

var b = require('./require-b.js');

console.log(require.cache);

require-b.js

console.log('module b is loaded.');

console.log(require.resolve('./require-c.js'));

var c = require('./require-c.js');

require-c.js

console.log('module c is loaded.');

実行結果

C:\work\node>node require-a.js
C:\work\node\require-b.js
module b is loaded.
C:\work\node\require-c.js
module c is loaded.
{ 'C:\work\node\require-a.js':
   Module {
     id: '.',
     exports: {},
     parent: null,
     filename: 'C:\\work\\node\\require-a.js',
     loaded: false,
     children: [ [Object] ],
     paths:
      [ 'C:\\work\\node\\node_modules',
        'C:\\work\\node_modules',
        'C:\\node_modules' ] },
  'C:\work\node\require-b.js':
   Module {
     id: 'C:\\work\\node\\require-b.js',
     exports: {},
     parent:
      Module {
        id: '.',
        exports: {},
        parent: null,
        filename: 'C:\\work\\node\\require-a.js',
        loaded: false,
        children: [Object],
        paths: [Object] },
     filename: 'C:\\work\\node\\require-b.js',
     loaded: true,
     children: [ [Object] ],
     paths:
      [ 'C:\\work\\node\\node_modules',
        'C:\\work\\node_modules',
        'C:\\node_modules' ] },
  'C:\work\node\require-c.js':
   Module {
     id: 'C:\\work\\node\\require-c.js',
     exports: {},
     parent:
      Module {
        id: 'C:\\work\\node\\require-b.js',
        exports: {},
        parent: [Object],
        filename: 'C:\\work\\node\\require-b.js',
        loaded: true,
        children: [Object],
        paths: [Object] },
     filename: 'C:\\work\\node\\require-c.js',
     loaded: true,
     children: [],
     paths:
      [ 'C:\\work\\node\\node_modules',
        'C:\\work\\node_modules',
        'C:\\node_modules' ] } }

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js