2017-09-21 18 views
0

ノードエコシステムの理解を深めるためにNodeJSのrequire()関数がどのように機能するかを学習しています。module._compileの内部でNodeJSエラーが発生する

module._compileを使用してスクリプトをコンパイルするスクリプトを作成しました。私が文字列の中でrequire()にしようとすると、それはうんざりします...しかし、それは正しい道を持っているようです。私は間違って何をしていますか?

私はjson3モジュールを./node_modules/の同じディレクトリにインストールしておきます。

スクリプト

私が働くこのスクリプトを書いた - 私はマークされています行のコメントを解除するまで。

"use strict"; 

var json3 = require('json3'); 

console.log("require.main.filename:", require.main.filename); 
console.log("require.main:", require.main); 

var module = new module.constructor(); 
module._compile(` 
"use strict"; 

console.log("require.main.filename:", require.main.filename); 
console.log("require.main:", require.main); 

// When I uncomment this, it breaks. Why? 
//var json3 = require('json3'); 

module.exports = { 
    run: function() { console.log("It works!") } 
}; 
`, require.main.paths[0]); 

module.exports.run(); 

スクリプトの出力

は、ここで(問題のコードをコメントアウトされた)出力です。 require.main.filename: /home/user/tmp/tmp.js require.main: Module { id: '.', exports: {}, parent: null, filename: '/home/user/tmp/tmp.js', loaded: false, children: [ Module { id: '/home/user/tmp/node_modules/json3/lib/json3.js', exports: [Object], parent: [Circular], filename: '/home/user/tmp/node_modules/json3/lib/json3.js', loaded: true, children: [], paths: [Array] } ], paths: [ '/home/user/tmp/node_modules', '/home/user/node_modules', '/home/node_modules', '/node_modules' ] } require.main.filename: /home/user/tmp/tmp.js require.main: Module { id: '.', exports: {}, parent: null, filename: '/home/user/tmp/tmp.js', loaded: false, children: [ Module { id: '/home/user/tmp/node_modules/json3/lib/json3.js', exports: [Object], parent: [Circular], filename: '/home/user/tmp/node_modules/json3/lib/json3.js', loaded: true, children: [], paths: [Array] } ], paths: [ '/home/user/tmp/node_modules', '/home/user/node_modules', '/home/node_modules', '/node_modules' ] } It works!

モジュールがロードされないのはなぜですか?アドホックモジュールがロードされるのはなぜですか?

答えて

2

あなたのコードには2つのものがあります。実行したとき

var module = new module.constructor(); 

元のモジュールオブジェクトを紛失してしまった場合は、そのようにしないでください。次に、正確な問題が何であるかを知るためには、環境変数NODE_DEBUG=moduleを設定する必要があります。これはバックグラウンドで何が起こるかを示します。インポートメッセージを受け取ること

MODULE 11063: looking for "json3" in [] 

これは、モジュールの読み込みにパスが設定されていないことを意味します。パスも追加する必要があります。以下は、更新されたコード

"use strict"; 

var json3 = require('json3'); 
var os = require("os"); 
console.log("require.main.filename:", require.main.filename); 
console.log("require.main:", require.main); 

var _module = new module.constructor(); 
_module.paths = module.paths; 

_module._compile(` 
"use strict"; 

// console.log("require.main.filename:", require.main.filename); 
// console.log("require.main:", require.main); 

//When I uncomment this, it breaks. Why? 
var json3 = require('json3'); 

module.exports = { 
    run: function() { console.log("It works!") } 
}; 
`, __dirname + "/dynamic_code_loaded_at_run_time.js"); 

_module.exports.run(); 

また_compileの2番目のパラメータが読み込まれているファイル名ですので、あなたはそれをパスが、ファイル名を与えないはずです。そして今、あなたは正しい出力を得ます。

It works! 
+0

最後に、これは私に必要なものすべてを与えました。ありがとう!ここに来る人も関心がある場合は、期待どおりにモジュールに変数を追加することができます:モジュールの外側で_module.stuff = mystuffを使用します。モジュール内部ではmodule.stuffでアクセスします。 –

関連する問題