6

编写我们可以编写的最简单的模块,我们写入 hello.js:

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

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

我运行 Node 并需要模块

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

{}当我应该得到时,会返回一个空数组[Function]

我尝试用 替换exportsmodule.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;

如果只是导出一件事,我通常会在一行中完成所有操作

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不起作用的原因是因为引用冲突。每个文件中的顶部变量是module具有属性的module.exports。加载模块时,会在后台创建新变量。会发生这样的事情:

var exports = module.exports;

显然exports是参考module.exports,但是做

exports = function(){};

强制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 回答