Node.js模块的导出

在Node.js中,module.exportsexports 是两种导出模块的方式,它们的作用是使得模块中的内容可以被其他模块引用和使用。

  1. module.exports:
    • module.exports 是一个指向当前模块所导出内容的对象的引用。你可以通过给 module.exports 赋值来导出一个对象、函数、类或者任何其他的JavaScript类型。
// example.js
module.exports = {
  foo: 'bar',
  baz: function() {
    console.log('baz');
  }
};
  1. exports:
    • exportsmodule.exports 的一个引用,它是一个特殊的变量,指向了 module.exports
// example.js
exports.foo = 'bar';
exports.baz = function() {
  console.log('baz');
};

不要同时使用exports和module.exports

虽然 exportsmodule.exports 都可以用来导出内容,但是在同一个模块中不应该同时使用它们。因为在模块加载完成后,Node.js 会返回 module.exports 而不是 exports。如果你同时使用了它们,但只有其中一个被赋值,那么最终导出的内容只会是 module.exports 所指向的对象,而 exports 上的属性将被忽略。

// example.js
// 此处使用 exports 导出变量
exports.baz = function() {
  console.log('baz');
};
// 此处使用 module.exports 导出对象
module.exports = {
  foo: 'bar'
};

当在同一个模块中同时使用 module.exportsexports 时,只有 module.exports 的赋值会生效,而 exports 上的属性将被忽略。这可能会导致一些意想不到的结果。下面是一个示例来说明这一点:

// example.js
// 此处使用 module.exports 导出对象
module.exports = {
  foo: 'bar'
};

// 此处使用 exports 导出变量
exports.baz = function() {
  console.log('baz');
};

在上面的例子中,module.exports 导出了一个对象 { foo: 'bar' },而 exports 导出了一个函数 baz。但是,由于最终模块导出的是 module.exports 所指向的对象,而不是 exports,所以 exports 上的属性不会被导出。

因此,在这个例子中,其他模块引入 example.js 后只能访问到 foo,而不能访问到 baz

正确的做法是要么只使用 module.exports,要么只使用 exports

不要直接给exports赋值

exports正确的用法是给他添加属性,如果直接赋值,将会导出空对象。

exports是module.export的一个引用。给exports添加属性就等于是给module.exports添加属性,直接给exports赋值,就改变了变量exports的指向,就是说exports不再是module.exports的引用。那么此时module.exports就是空对象。

// example.js
exports=123

导入example.js模块的文件,得到的是一个空对象。这是因为只有 module.exports 指向的对象才会被导出,而不是 exports

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 C++ 代码导出Node.js 模块,可以使用 Node.js 的 C++ Addons API。以下是简单的步骤: 1. 创建一个 C++ 文件,编写 C++ 代码。 2. 在 C++ 文件中包含 node.h 头文件,该文件包含 Node.js 的 C++ Addons API。 3. 编写和导出 Node.js 模块的函数。可以使用 NODE_MODULE 宏将其导出Node.js 模块。 例如,以下是将 C++ 函数 add 导出Node.js 模块的示例代码: ```c++ #include <node.h> namespace demo { using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::String; using v8::Value; void Add(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); // 检查参数个数 if (args.Length() < 2) { isolate->ThrowException( Exception::TypeError( String::NewFromUtf8(isolate, "Wrong number of arguments"))); return; } // 检查参数类型 if (!args[0]->IsNumber() || !args[1]->IsNumber()) { isolate->ThrowException( Exception::TypeError( String::NewFromUtf8(isolate, "Wrong arguments"))); return; } // 计算结果 double value = args[0]->NumberValue(isolate) + args[1]->NumberValue(isolate); Local<Number> num = Number::New(isolate, value); // 返回结果 args.GetReturnValue().Set(num); } void Initialize(Local<Object> exports) { NODE_SET_METHOD(exports, "add", Add); } NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) } // namespace demo ``` 在上面的示例中,我们使用 NODE_MODULE 宏将 Initialize 函数导出Node.js 模块。其中,NODE_GYP_MODULE_NAME 是 Node.js 模块的名称,可以在 binding.gyp 中配置。 最后,使用以下命令将 C++ 代码编译为 Node.js 模块(假设 C++ 文件名为 addon.cc): ``` node-gyp configure build ``` 编译成功后,将生成一个名为 build/Release/addon.node 的文件,即为 Node.js 模块。在 Node.js 中使用 require 函数加载该模块即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值