一、基础
1、模块化
1.1、说明:
- 在Node.js中,一个模块中定义的变量,函数等都只能在这个文件内部有效,当需要从此JS文件外部引入这些变量、函数时,必须使用exports进行暴露,使用require引用
示例:
//test.js
let str = "hello world";
exports.str = str;
exports.fn = (...nums)=> {
let sum = 0;
for(let i=0; i<nums.length; i++) {
sum += nums[i];
}
return sum;
};
//==================
//test1.js
let ff = require("./test");
console.log(ff.str);
let sum = ff.fn(1, 2, 5);
console.log(sum);
打印结果
1.2、exports和module.exports的异同
- 值类型和引用类型
exports为值类型,module.exports为引用类型 - 区别:
- exports只能使用“.”语法来向外暴露内部变量
- module.exports既可以使用“.”语法,也可以直接复制一个对象
module.exports.xxx = xxx;
module.exports = {xxx: yyy}
- module.exports包含了exports的所有功能,因为module.exports等于的就是exports(从源码中可以看出)
示例1:
//test20.js
exports = {
str: "zs",
fn: (...nums)=> {
let sum = 0;
for(let i=0; i<nums.length; i++) {
sum += nums[i];
}
return sum;
},
obj: {name: "ls", age: 15}
};
//===================
//test21.js
let test = require("./test20");
console.log(test); //打印结果为:{}
示例2
//test20.js
module.exports = {
str: "zs",
fn: (...nums)=> {
let sum = 0;
for(let i=0; i<nums.length; i++) {
sum += nums[i];
}
return sum;
},
obj: {name: "ls", age: 15}
};
//===================
//test21.js
let test = require("./test20");
console.log(test); //打印结果为:{ str: 'zs', fn: [Function: fn], obj: { name: 'ls', age: 15 } }
1.3、exports为何不能像module.exports一样通过直接赋值的操作?
- exports和module都是global中的属性,只不过module是一个对象,而exports是一个变量
- exports和module.exports指向的是同一地址,经过验证,exports和module.exports是相等的,都是
{}
- exports是值类型,而module.exports则是引用类型,module就是一个对象,其中有一个名为exports的属性变量
网友评论