nodejsでモジュール定義の実例を詳しく説明します.
3884 ワード
本論文の例は、nodejsにおけるモジュール定義方法を説明する.皆さんに参考にしてあげます.具体的には以下の通りです.
1.モジュール定義
nodejsというモジュールはファイルです.jsファイルはnodejsのモジュールです.モジュールとファイルは一対一で対応しています.参照モジュールはrequire('ファイルパス')です.
例えば:
二つのjsコードファイルは同じフォルダの下に置いてあります.
他のフォルダのモジュールを参照するなら、直接にパスを書きます.ここのパスフォーマットはlinuxのパスフォーマットと同じです. これは絶対パスです.
ここではexportsとmodule.exportsの違いに注意したいです.exportsはmodule.exportsの一つの引用にすぎません.(a=2、b=aのようにb=cの引用だけです.b=cの場合はaを指しません.)これで公式サイトの意味が分かります.(exportsの根声明を関数としたい場合、またはobjectを生成したい場合は、exportsではなくmodule.exportを使ってください.)
2.循環参照
a.js:
コアモジュールとは、実はnodejsが開発した公共カバンのことです.Javaの公共カバンのように.コアモジュールにアクセスすれば、require('ファイル名')にアクセスできます.実は、公共モジュールのカバンはnodejsがインストールしたnodemodulespm\libの下に置いてあります.
4.ファイルモジュール
いわゆる引用に正確にマッチしていない場合、node jsは拡張子を採用します.js、json、and then.node.jsファイルはJavaScriptファイルです.jsonはjson形式で解析します.nodeはdleopenで追加のモジュールとしてロードされます.
ここで注意したいのですが、'/'、''、''/''という記号の修飾がない場合、モジュールがロードしているところはnodemumodulesです.このファイルはどこにありますか?下を見てください.
5.nodemoodulesフォルダ
モジュールを参照する時に'/'''''''''''/''というフォーマット記号がない場合、探し方を採用します.もしあなたのファイルが'/home/ry/project/foo.js'にあると仮定して、
//home/ry/project/nodemoodules/bar.js/home/ry/nodemoodules/bar.js/home/nodemoodules/bar.js/nodemoodules/bar.js/nodemoumodules/bar.js
つまり、現在の路床から、一歩ずつ親ディレクトリにnodemumodulesフォルダをモジュールアドレスとして追加します.
6.フォルダ名でモジュールを参照する
大体二つに分けられます.1)package.jsonファイルを書きます.このファイルはプロジェクトのルートディレクトリに書いてあります.その形式は以下の通りです.
./some-library/index.js./some-library/index.node
7.キャッシュ
一つのモジュールの複数回の参照は一回だけロードされます.javaの中のstaticのキーワードの修飾のようです.ただし、
ここで述べたように、皆さんのnodejsプログラムの設計に役に立ちます.
1.モジュール定義
nodejsというモジュールはファイルです.jsファイルはnodejsのモジュールです.モジュールとファイルは一対一で対応しています.参照モジュールはrequire('ファイルパス')です.
例えば:
var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is '
+ circle.area(4));
この名前はfoo.jsです.
var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};
この名前はcircele.jsです.二つのjsコードファイルは同じフォルダの下に置いてあります.
他のフォルダのモジュールを参照するなら、直接にパスを書きます.ここのパスフォーマットはlinuxのパスフォーマットと同じです. これは絶対パスです.
ここではexportsとmodule.exportsの違いに注意したいです.exportsはmodule.exportsの一つの引用にすぎません.(a=2、b=aのようにb=cの引用だけです.b=cの場合はaを指しません.)これで公式サイトの意味が分かります.(exportsの根声明を関数としたい場合、またはobjectを生成したい場合は、exportsではなくmodule.exportを使ってください.)
2.循環参照
a.js:
console.log('a starting');
exports.done = false;
var b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');
b.js:
console.log('b starting');
exports.done = false;
var a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');
main.js:
console.log('main starting');
var a = require('./a.js');
var b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);
いいえ、このa.jsとb.jsは相互に引用しました.このように無限ループがありますか?いいえ、これはロードが完了していないだけです.つまり、moduleの一部は利用できない状態にあります.ここのように、a.jsは先にロードしますが、a.jsをロードすると、a.jsはb.jsをロードしました.この時、a.jsは停滞状態になります.ただ前の状態にあります.データは、b.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
3.コアモジュールコアモジュールとは、実はnodejsが開発した公共カバンのことです.Javaの公共カバンのように.コアモジュールにアクセスすれば、require('ファイル名')にアクセスできます.実は、公共モジュールのカバンはnodejsがインストールしたnodemodulespm\libの下に置いてあります.
4.ファイルモジュール
いわゆる引用に正確にマッチしていない場合、node jsは拡張子を採用します.js、json、and then.node.jsファイルはJavaScriptファイルです.jsonはjson形式で解析します.nodeはdleopenで追加のモジュールとしてロードされます.
ここで注意したいのですが、'/'、''、''/''という記号の修飾がない場合、モジュールがロードしているところはnodemumodulesです.このファイルはどこにありますか?下を見てください.
5.nodemoodulesフォルダ
モジュールを参照する時に'/'''''''''''/''というフォーマット記号がない場合、探し方を採用します.もしあなたのファイルが'/home/ry/project/foo.js'にあると仮定して、
require('bar.js')
を参照したら、このbar.jsの探し方は以下の通りです.//home/ry/project/nodemoodules/bar.js/home/ry/nodemoodules/bar.js/home/nodemoodules/bar.js/nodemoodules/bar.js/nodemoumodules/bar.js
つまり、現在の路床から、一歩ずつ親ディレクトリにnodemumodulesフォルダをモジュールアドレスとして追加します.
require('example-module/path/to/file')
のこのような参照は、require('bar.js')
と同じ解析である.6.フォルダ名でモジュールを参照する
大体二つに分けられます.1)package.jsonファイルを書きます.このファイルはプロジェクトのルートディレクトリに書いてあります.その形式は以下の通りです.
{ "name" : "some-library",
"main" : "./lib/some-library.js" }
このように書いたrequire('./some-library')は本当にそうです.
require('./some-library/lib/some-library.js')
2)直接にindex.jsまたはindex.nodeファイルのロードを約束し、同上のrequireは下記のようにロードすることができます../some-library/index.js./some-library/index.node
7.キャッシュ
一つのモジュールの複数回の参照は一回だけロードされます.javaの中のstaticのキーワードの修飾のようです.ただし、
require('foo')
のような形式では毎回同じファイルに引用されるとは限りません.ここで述べたように、皆さんのnodejsプログラムの設計に役に立ちます.