编写最简单的模块,我们写入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]
。
我尝试用exports
替换module.exports
,但这不适用于我的Windows Powershell。它适用于我的Amazon EC2 Ubuntu实例,那么为什么exports
不起作用? API有变化吗? Powershell可能会发生什么,这些都不起作用?
我知道Windows并不是最理想的开发环境,但我无法理解这样一个简单的事故。
答案 0 :(得分: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!
这允许您以最适合该特定模块的方式编写模块。耶!
答案 1 :(得分: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下不起作用。说实话,我甚至不确定那是什么。 :)你不能只使用本机命令提示符吗?