最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

module.exports是否等于导出

运维笔记admin12浏览0评论

module.exports是否等于导出

module.exports是否等于导出

我是nodejs的新手,试着知道如何从其他文件中包含函数。

我发现qazxsw poi和qazxsw poi可以解决我的问题,但我不知道两者之间有什么不同。

我做了一些研究,发现了module.exports ref:exports

exports = module.exports

但我仍然不确定,所以我做了实验:

index.js

Understanding module.exports and exports in Node.js

lib1.js

var exports = module.exports = {};

lib2.js

const lib1 = require('./lib1.js');
const lib2 = require('./lib2.js');
const lib3 = require('./lib3.js');
const lib4 = require('./lib4.js');

const func = () => {
    return 'attr2';
};

var lib = {};
var lib = {
    attr1: 'attr1',
    attr2_1: func,
    attr2_2: func(),
    attr3: () => {
        return 'attr3 (closure)';
    }
};

// using object variable on local file
console.log(lib.attr1);
console.log(lib.attr2_1());
console.log(lib.attr2_2);
console.log(lib.attr3());

console.log('# Case1 ----');

console.log(lib1.attr1);
console.log(lib1.attr2_1());
console.log(lib1.attr2_2);
console.log(lib1.attr3());

console.log('# Case2 ----');

console.log(lib1.attr1);
console.log(lib1.attr2_1());
console.log(lib1.attr2_2);
console.log(lib1.attr3());

console.log('# Case3 ----');

console.log(lib3.attr1);
console.log(lib3.attr2_1());
console.log(lib3.attr2_2);
console.log(lib3.attr3());

console.log('# Case4 ----');

console.log(lib4.attr1);
console.log(lib4.attr2_1());
console.log(lib4.attr2_2);
console.log(lib4.attr3());

lib3.js

const func = () => {
    return 'attr2';
}

// Case1 : This work
module.exports.attr1 = 'attr1';
module.exports.attr2_1 = func;
module.exports.attr2_2 = func();
module.exports.attr3 = () => {
    return 'attr3 (closure)';
};

lib4.js

const func = () => {
    return 'attr2';
}

// Case2 : This work
module.exports = {
    attr1: 'attr1',
    attr2_1: func,
    attr2_2: func(),
    attr3: () => {
        return 'attr3 (closure)';
    }
};

case4将返回错误:(来自vscode调试)

const func = () => {
    return 'attr2';
}

// Case3 : This work
exports.attr1 = 'attr1';
exports.attr2_1 = func;
exports.attr2_2 = func();
exports.attr3 = () => {
    return 'attr3 (closure)';
};

case1,2,3 =>工作正常。

但为什么case4是错误的? const func = () => { return 'attr2'; } // Case4 : Not work! exports = { attr1: 'attr1', attr2_1: func, attr2_2: func(), attr3: () => { return 'attr3 (closure)'; } }; 不是真的吗?

回答如下:

你在这做什么

...

# Case4 ----
undefined
C:\Users\Scott\Documents\module_export\index.js:49
console.log(lib4.attr2_1());
                 ^

TypeError: lib4.attr2_1 is not a function
    at Object.<anonymous> (C:\Users\Scott\Documents\module_export\index.js:49:18)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:282:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)

将名为var exports = module.exports = {};的变量重新分配给一个全新的对象。名为var exports = module.exports = {}; exports = { attr1: 'attr1', attr2_1: func, attr2_2: func(), attr3: () => { return 'attr3 (closure)'; } }; 的变量不再指向与exports相同的对象; exports保持不变,作为空物。因此,当其他模块尝试从module.exports导入时,它们只会得到一个空对象。

您必须改变module.exports变量,就像您在案例3中所做的那样,或者您必须在lib4上重新分配exports属性,就像您在案例2中所做的那样(或者在案例1中改变现有的exports对象)。

这与进口/出口没有任何关系:在这里可以看到相同的行为:

module

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论