6

できる限り単純なモジュールを作成して、hello.js に書き込みます。

var hello = function(){
  console.log('hello');
};

exports = hello; \\ Doesn't work on Amazon EC2 Ubuntu Instance nor Windows Powershell

ノードを実行し、モジュールが必要です

var hello = require('./hello');
hello;

{}を取得するはずのときに空の配列が返されます[Function]

に置き換えexportsてみましたmodule.exportsが、これは Windows Powershell では機能しません。私の Amazon EC2 Ubuntu インスタンスでは機能しますが、なぜ機能しないexportsのですか? API は変更されましたか? そして、これらのどちらも機能しない Powershell で何が起こっているのでしょうか?

Windows が最も望ましい開発環境ではないことはわかっていますが、このような単純な事故を回避することはできません。

4

2 に答える 2

9

編集

ES6 でのエクスポートは少し便利です

export const hello = function(){
  console.log('hello');
};

インポートは次のようになります

import {hello} from './file';

元の答え

使いたくなるmodule.exports

var hello = function(){
  console.log('hello');
};

module.exports = hello;

1 つのことだけをエクスポートする場合は、通常、すべてを 1 行で行います。

var hello = module.exports = function() {
  console.log('hello');
};

エクストラ

名前付き関数を使用すると、コードでエラーが発生した場合に、スタック トレースが見栄えがよくなります。これが私がそれを書く方法です

// use a named function               ↓
var hello = module.exports = function hello() {
  console.log("hello");
};

anonymousスタック トレースで関数名を表示する代わりに、が表示されますhello。これにより、バグを非常に簡単に見つけることができます。

コードを簡単にデバッグできるように、このパターンをあらゆる場所で使用しています。ここに別の例があります

// event listeners          ↓
mystream.on("end", function onEnd() {
  console.log("mystream ended");
};

// callbacks                              ↓
Pokemon.where({name: "Metapod"}, function pokemonWhere(err, result) {
  // do stuff
});

複数のものをエクスポートするexports場合は、直接使用できますが、key

// lib/foobar.js
exports.foo = function foo() {
  console.log("hello foo!");
};

exports.bar = function bar() {
  console.log("hello bar!");
};

今、そのファイルを使用するとき

var foobar = require("./lib/foobar");

foobar.foo(); // hello foo!
foobar.bar(); // hello bar!

最後のおまけとして、単一のオブジェクトfoobar.jsをエクスポートしても同じ動作が得られるように書き換える方法を紹介します。

// lib/foobar.js
module.exports = {
  foo: function foo() {
    console.log("hello foo!");
  },
  bar: function bar() {
    console.log("hello bar!");
  }
};

// works the same as before!

これにより、特定のモジュールに最適な方法でモジュールを作成できます。わーい!

于 2013-03-14T15:38:02.383 に答える
6

機能しない理由exportsは、参照の競合のためです。各ファイルの一番上の変数はmodulewhich has a propertymodule.exportsです。モジュールがロードされると、新しい変数がバックグラウンドで作成されます。次のようなことが起こります。

var exports = module.exports;

明らかにexportsへの参照ですがmodule.exports

exports = function(){};

variable が関数オブジェクトを指すように強制exportsします - それは変化しませんmodule.exports。それはやっているようなものです:

var TEST = { foo: 1 };
var foo = TEST.foo;
foo = "bar";
console.log(TEST.foo);
// 1

一般的な方法は次のとおりです。

module.exports = exports = function() { ... };

Windows Powershell で動作しない理由がわかりません。正直なところ、それが何であるかさえわかりません。:) ネイティブのコマンド プロンプトをそのまま使用できませんか?

于 2013-03-14T15:42:28.990 に答える