require的三种参数格式
'pages/index/index.js'这是我假定的一个地址
- ‘/pages/index/index.js’ 绝对路径形式
- ‘./pages/index/index.js’ 相对路径形式
js文件的文件后缀名可以省略,即‘pages/index/index.js’可以写为‘pages/index/index’
模块module输出的变量不受module内部方法而改变
举个例子
下面是一个模块文件lib.js。
// lib.js
var counter = 3;
function incCounter() {
counter++;
}
module.exports = {
counter: counter,
incCounter: incCounter,
};
//输出内部变量counter和改写这个变量的内部方法incCounter。
然后,加载上面的模块。
// main.js
var counter = require('./lib').counter;
var incCounter = require('./lib').incCounter;
console.log(counter); // 3
incCounter();
console.log(counter); // 3
上面代码说明,counter输出以后,lib.js模块内部的变化就影响不到counter了。counter还是3,没有因为加1而变为4
module.exports和exports
为了方便,node为每一个module提供一个变量,指向module.exports。
//这等同在每个模块头部,有一行这样的命令。
var exports = module.exports;
因此可以认为module.exports等同于exports
但需要注意
要输出的变量不能直接赋值给exports
//无效写法
exports = function(x) {console.log(x)};
因为exports被重新赋值,不再指向moudle.exports。
补充:
模块module对外开放的变量都是module.exports的属性
//example.js
var x = 5;
var addX = function (value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
//上面代码通过module.exports输出变量x和函数addX。
require方法用于加载模块。
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6
所以说require得到的变量都是module.exports的属性。换句话说就是,模块通过module.exports的属性 对外开放 模块的变量
至此,总结结束
内容远无法概括完所有知识,欲了解更多,可参考原文