博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
module.exports vs exports
阅读量:6008 次
发布时间:2019-06-20

本文共 1722 字,大约阅读时间需要 5 分钟。

很多时候,你会看到,在Node环境中,有两种方法可以在一个模块中输出变量:

方法一:对module.exports赋值:

// hello.jsfunction hello() {    console.log('Hello, world!');}function greet(name) {    console.log('Hello, ' + name + '!');}module.exports = {    hello: hello,    greet: greet};

方法二:直接使用exports:

// hello.jsfunction hello() {    console.log('Hello, world!');}function greet(name) {    console.log('Hello, ' + name + '!');}function hello() {    console.log('Hello, world!');}exports.hello = hello;exports.greet = greet;

但是你不可以直接对 exports 赋值:

// 代码可以执行,但是模块并没有输出任何变量:exports = {    hello: hello,    greet: greet};

如果你对上面的写法感到十分困惑,不要着急,我们来分析Node的加载机制:

首先,Node会把整个待加载的hello.js文件放入一个包装函数load中执行。在执行这个load()函数前,Node准备好了module变量:

 

var module = {    id: 'hello',    exports: {}};

load()函数最终返回module.exports

var load = function (exports, module) {    // hello.js的文件内容    ...    // load函数返回:    return module.exports;};var exported = load(module.exports, module);

也就是说,默认情况下,Node准备的 exports 变量和 module.exports 变量实际上是同一个变量,并且初始化为空对象{},于是,我们可以写:

exports.foo = function () { return 'foo'; };exports.bar = function () { return 'bar'; };

也可以写:

module.exports.foo = function () { return 'foo'; };module.exports.bar = function () { return 'bar'; };

换句话说,Node默认给你准备了一个空对象{},这样你可以直接往里面加东西。

但是,如果我们要输出的是一个函数或数组,那么,只能给module.exports赋值:

module.exports = function () { return 'foo'; };

exports赋值是无效的,因为赋值后,module.exports仍然是空对象{}

结论

如果要输出一个键值对象{},可以利用exports这个已存在的空对象{},并继续在上面添加新的键值;

如果要输出一个函数或数组,必须直接对module.exports对象赋值。

所以我们可以得出结论:直接对module.exports赋值,可以应对任何情况:

module.exports = {    foo: function () { return 'foo'; }};

或者:

module.exports = function () { return 'foo'; };

最终,强烈建议  使用module.exports = xxx  的方式来输出模块变量,这样,你只需要记忆一种方法

转载于:https://www.cnblogs.com/Coldbreath/p/6872588.html

你可能感兴趣的文章
java版b2b2c社交电商spring cloud分布式微服务(二)服务消费者(rest+ribbon)
查看>>
iOS第三方平台集成组件化
查看>>
404 Sum of Left Leaves
查看>>
提供SaaS Launchkit,快速定制,一云多端等能力,一云多端将通过小程序云实现...
查看>>
java b2b2c SpringCloud电子商务平台
查看>>
(十三)企业分布式微服务云SpringCloud SpringBoot mybatis-断路器聚合监控(Hystrix Turbine)...
查看>>
热更新
查看>>
亿万富翁Calvin Ayre梭哈BCH!
查看>>
map/reduce之间的shuffle,partition,combiner过程的详解
查看>>
ubuntu 手动配置interface上网
查看>>
Notes 迁移到SharePoint
查看>>
CentOS6.3修改yum源用本地系统光盘来安装gcc
查看>>
awk
查看>>
从零开始学Python-day5
查看>>
009Linux管理日常使用的基本命令
查看>>
MAC 查看java home目录
查看>>
两数之和(输入为二叉树) Two Sum IV - Input is a BST
查看>>
我的友情链接
查看>>
Java 常见异常类
查看>>
红帆移动OA for iPhone更新v1.0.2
查看>>