The practice of exports and module.exports in Nodejs

Source: Internet
Author: User

As long as you write your own file module in the Nodejs, you will encounter the use of module.exports and exports, see other people's code will mostly use "module.exports=exports=< object/function >" Weird concatenation usage , the reason why, seems to be foggy, so the wording is more like a conservative anti-sexual writing.

In addition to the source code, this kind of problem can only write some code to verify.

Wrote two module files, Provider.js produces any type of object, Customer.js returns and outputs provider object.

First case:

Provider.js, set any type of object directly on the exports.

Exports = {name: ' Kxh '}/*exports = function () {  console.log (' kxh ');}; Exports = ' kxh '; */ console.log (' *******provider-module*********** '); Console.log (module); Console.log (' ******* provider-exports*********** '); Console.log (exports) ;

Customer.js

var p = require ('./provider '); Console.log (' *******customer-result*********** '); console.log (p);

Perform customer.js results:

*******Provider-module***********{ID:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', exports: {}, parent: {ID:‘.‘, exports: {}, Parent:NULL, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\customer.js ', Loaded:false, children: [[Circular]], paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',        ' D:\\programdemos\\web\\nodejs\\node_modules ',        ' D:\\programdemos\\web\\node_modules ',        ' D:\\programdemos\\node_modules ',        ' D:\\node_modules ']}, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', Loaded:false, children: [], Paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',     ' D:\\programdemos\\web\\nodejs\\node_modules ',     ' D:\\programdemos\\web\\node_modules ',     ' D:\\programdemos\\node_modules ',     ' D:\\node_modules ' ] }*******Provider-exports***********{name: ' Kxh '}*******Customer-result***********{}

From the result, any type of object that is set directly to exports is not returned to the calling module by require. Require returns an empty object of module.exports.

Second case:

Provider.js, set any type of property for exports.

Exports.name = {firstName: ' xh ', lastName: ' K '}; // exports.name = "Kxh"; /* exports.printname = function () {  console.log ("Kxh");}; */ console.log (' *******provider-module*********** '); Console.log (module); Console.log (' ******* provider-exports*********** '); Console.log (exports) ;

Customer.js not change.

Perform customer.js results:

*******Provider-module***********{ID:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', exports: {name: {firstName: ' XH ', lastName: ' K ' }}, parent: {ID:‘.‘, exports: {}, Parent:NULL, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\customer.js ', Loaded:false, children: [[Circular]], paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',        ' D:\\programdemos\\web\\nodejs\\node_modules ',        ' D:\\programdemos\\web\\node_modules ',        ' D:\\programdemos\\node_modules ',        ' D:\\node_modules ']}, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', Loaded:false, children: [], Paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',     ' D:\\programdemos\\web\\nodejs\\node_modules ',     ' D:\\programdemos\\web\\node_modules ',     ' D:\\programdemos\\node_modules ',     ' D:\\node_modules ' ] }*******Provider-exports***********{name: {firstName: ' xh ', lastName: ' K '}}*******Customer-result***********{name: {firstName: ' xh ', lastName: ' K '}}

From the results, to set any type of properties for exports, module.exports remain synchronized, can be require back out.

The third case:

Provider.js, set any type of property for exports, and set the property of any type with the same name or no name for Module.exports.

Exports.name = {firstName: ' xh ', lastName: ' K '}; // exports.name = "Kxh"; /* exports.printname = function () {  console.log ("Kxh");}; */ // module.exports.name = {firstName: ' wf ', lastName: ' Z '}; Module.exports.mail = "[email protected]"; Console.log (' *******provider-module*********** '); Console.log (module); Console.log (' *******provider-exports*********** '); Console.log (exports) ;

Customer.js not change.

Perform customer.js results:

*******Provider-module***********{ID:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', exports: {name: {firstName: ' XH ', lastName: ' K '}, Mail: ' [email protected] ' }, parent: {ID:‘.‘, exports: {}, Parent:NULL, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\customer.js ', Loaded:false, children: [[Circular]], paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',        ' D:\\programdemos\\web\\nodejs\\node_modules ',        ' D:\\programdemos\\web\\node_modules ',        ' D:\\programdemos\\node_modules ',        ' D:\\node_modules ']}, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', Loaded:false, children: [], Paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',     ' D:\\programdemos\\web\\nodejs\\node_modules ',     ' D:\\programdemos\\web\\node_modules ',     ' D:\\programdemos\\node_modules ',     ' D:\\node_modules ' ] }*******Provider-exports***********{name: {firstName: ' xh ', lastName: ' K '}, Mail: ' [email protected] '}*******Customer-result***********{name: {firstName: ' xh ', lastName: ' K '}, Mail: ' [email protected] '}

From the result, if you set a property that does not have the same name, it is merged into Module.exports and returned, and if the property with the same name require returns all Module.exports.

Fourth case:

Provider.js, any type of object is set directly for Module.exports, regardless of the properties of the exports type.

Exports.name = {firstName: ' xh ', lastName: ' K '}; // exports.name = "Kxh"; /* exports.printname = function () {  console.log ("Kxh");}; */ // module.exports = {name: ' Kxh '}; function () {  console.log (' kxh ');}; Console.log (' *******provider-module*********** '); Console.log (module); Console.log (' ******* provider-exports*********** '); Console.log (exports) ;

Customer.js not change.

Perform customer.js results:

*******Provider-module***********{ID:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', exports: [Function], parent: {ID:‘.‘, exports: {}, Parent:NULL, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\customer.js ', Loaded:false, children: [[Circular]], paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',        ' D:\\programdemos\\web\\nodejs\\node_modules ',        ' D:\\programdemos\\web\\node_modules ',        ' D:\\programdemos\\node_modules ',        ' D:\\node_modules ']}, FileName:' D:\\programdemos\\web\\nodejs\\testnode\\provider.js ', Loaded:false, children: [], Paths: [' D:\\programdemos\\web\\nodejs\\testnode\\node_modules ',     ' D:\\programdemos\\web\\nodejs\\node_modules ',     ' D:\\programdemos\\web\\node_modules ',     ' D:\\programdemos\\node_modules ',     ' D:\\node_modules ' ] }*******Provider-exports***********{name: {firstName: ' xh ', lastName: ' K '}}*******Customer-result***********[Function]

From the results, regardless of the exports set the properties of the type, the Module.exports set any type of object directly, then require will return module.exports.

Judging from the above four practice results:

Require return is Module.exports, on the module.exports can be set functions, object instances, basic types of variables, etc., so the general is module.exports as a module everywhere on the line.

If you want to use exports as the return of the module, set a property for it, and do not set the property with the same name on Module.exports.

End

^-^

The practice of exports and module.exports in Nodejs

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.