ローカル変数へのアクセス権を持つnode.jsの外部jsファイルをロードして実行しますか?


130

include('./path/to/file')node.jsで単純なタイプのコマンドを実行するのは簡単ですか?

ローカル変数にアクセスしてスクリプトを実行するだけです。単純なHello Worldよりも大きなnode.jsプロジェクトは、通常どのように整理されますか?(完全に機能する動的ウェブサイト)

たとえば、次のようなディレクトリが必要です。

/models

/views

...など


(ローカルファイルの代わりに)外部URLからスクリプトを含めることもできます。ここを参照してください:pastebin.com/WkvHjGsG
アンダーソングリーン

上記のスクリプトdownloadedModulesは、スクリプトと同じディレクトリに呼び出されるフォルダーを作成した場合にのみ正しく機能します。
アンダーソングリーン

回答:


134

ただ require('./yourfile.js');

外部アクセスが必要なすべての変数をグローバル変数として宣言します。だから代わりに

var a = "hello" そうなる

GLOBAL.a="hello" あるいは単に

a = "hello"

これは明らかに悪いです。グローバルスコープを汚染する必要はありません。代わりに、提案メソッドはexport関数/変数に対するものです。

MVCパターンが必要な場合は、Geddyをご覧ください。


3
余談ですが、エクスプレスが大好きです。MVCにそれほどこだわっていない場合は、チェックアウトする必要もあります。
シュリパッドクリシュナ2010

42
「これは明らかに悪い」と言うとき、「これ」は何を指しているのですか?
アンダーソン・グリーン

1
@AndersonGreen-彼は変数をグローバルスコープに置くことを意味します。
Tim

77
@AndersonGreen:スコープについて非常に賢い冗談だったと教えてください;-)
ダスティJ

6
requireパスの前に次のようなものを付けない場合、npmモジュールを調べることを学ぶのに役立ちました./
Dylan Valade

93

モジュールを定義するためのパターンであるCommonJSを理解する必要があります。常に悪いことであるGLOBALスコープを悪用しないでください。代わりに、次のように 'exports'トークンを使用できます。

// circle.js

var PI = 3.14; // PI will not be accessible from outside this module

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

そして、私たちのモジュールを使用するクライアントコード:

// client.js

var circle = require('./circle');
console.log( 'The area of a circle of radius 4 is '
           + circle.area(4));

このコードは、node.jsドキュメントAPIから抽出されました。

http://nodejs.org/docs/v0.3.2/api/modules.html

また、RailsやSinatraなどを使用したい場合は、Expressをお勧めします(URLを投稿できなかったので、スタックオーバーフローで恥をかいてください!)


64

Nodeのコードを記述している場合、Ivanの説明に従ってNodeモジュールを使用することは間違いありません。

ただし、すでに記述されていて、ノードを認識していないJavaScriptをロードする必要がある場合は、vmモジュールを使用することをお勧めします(間違いなくを推奨しますeval)。

たとえばexecfile、これは私のモジュールです。これは、またはグローバルコンテキストpathでスクリプトを評価しcontextます。

var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
  var data = fs.readFileSync(path);
  vm.runInNewContext(data, context, path);
}

また、注意:ロードされたモジュールrequire(…)は、グローバルコンテキストにアクセスできません。


1
このヒントをありがとう。実際の使用例は、モジュールをアドホックにロードする必要がある場合です。中央サービスに登録する1000個のモジュールがある登録パターンのように言います。それは...モジュールをスキャンし、1ではなく1000年を実行して、1はあなたのサービスでステートメントを必要とし、それらをロードするために非常にクリーンで優れたデザインである
アサフMoldavsky

ノードは動的要求をサポートしているため、ノード対応モジュールを動的にロードするときにこのパターンを使用する理由はありません。実際、Nodeをバイパスするため、そこで使用することは積極的に有害であり、require.cache単一のファイルが複数回ロードされる可能性があります。
David Wolever

では、1000個のモジュールがあり、それぞれがレジストリサービスに登録しているというケースを解決するために、レジストリサービスに1000個のrequireステートメントがなくても、提案したものをどのように使用しますか?
Assaf Moldavsky

1
ただ、require通常のように:function loadService(name) { return require('./services/' + name); }その後、サービスをリストがアプリケーションのために理にかなっています。
David Wolever

そうですが、これは、レジストリサービスの1000個のモジュールすべてを知っている必要があることを意味します。これは1000のrequireステートメントよりも優れています。全体のアイデアは、レジストリサービスがすべてのモジュールを認識しているわけではなく、実際にはそれらのモジュールを考慮しているということです。モジュールはアドホックをレジストリサービスに登録します。それは理にかなっていますか?
Assaf Moldavsky

7

外部JavaScriptファイルの関数またはオブジェクトをロードする場合は、次のコードを使用してこのコンテキストをロードします。runInThisContextメソッドに注意してください。

var vm = require("vm");
var fs = require("fs");

var data = fs.readFileSync('./externalfile.js');
const script = new vm.Script(data);
script.runInThisContext();

// here you can use externalfile's functions or objects as if they were instantiated here. They have been added to this context. 

2
多くの検索とあちこちの後、このテクニックは私のために働いた。私のファイルは、ブラウザーが直接使用して変数を宣言するために作成されています。例:const aVar = {thing: 'a'}
lucsan

3

@Shripad@Ivanの答えを拡張して、Node.jsの標準module.export機能を使用することをお勧めします。

定数(例:)の ファイルではconstants.js、次のように定数を記述します。

const CONST1 = 1;
module.exports.CONST1 = CONST1;

const CONST2 = 2;
module.exports.CONST2 = CONST2;

次に、これらの定数を使用するファイルに、次のコードを記述します。

const {CONST1 , CONST2} = require('./constants.js');

これまでにconst { ... }構文を見たことがない場合は、それが破壊的な代入です。


0

復活してすみません。child_processモジュールを使用して、node.jsで外部jsファイルを実行できます

var child_process = require('child_process');

//EXECUTE yourExternalJsFile.js
child_process.exec('node yourExternalJsFile.js', (error, stdout, stderr) => {
    console.log(`${stdout}`);
    console.log(`${stderr}`);
    if (error !== null) {
        console.log(`exec error: ${error}`);
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.