导入模块
默认得到的是对象, 使用对象中的成员必须
.
点儿某个成员来访问
//在没有下面导出的模块是不能直接require模块的
var fooExports = require('./foo')
// ReferenceError: foo is not defined
// console.log(foo)
console.log(fooExports)
导出模块
如果一个模块需要直接导出某个成员,而非挂载的方式,必须使用下
module.exports= 值或者对象
//foo.js
// 这种方式不行。
// exports = add
//1.到出数据
module.exports = 'hello'
//2.导出方法,会覆盖上面的 hello 值
module.exports = function (x, y) {
return x + y
}
//main.js
var fooExports = require('./foo')
console.log(fooExports); //输出 :hello
原理:
- 在 Node 中,每个模块内部都有一个自己的
module
对象, 该module
对象中,有一个成员叫:exports
也是一个对象
var module = {
exports: {},
...
}
- 每次导出接口成员的时候都通过
module.exports.xxx = xxx
的方式很麻烦,点儿的太多了, 所以,Node 为了简化你的操作,专门提供了一个变量:var exports = module.exports
也就是说在底层模块中还有这么一句代码
var exports = module.exports
- 我们可以简写
exports.属性='值'
其实就是module.exports.属性='值'
。那么我们如果直接exports='值'
,就相当于重新给exports
赋值。那么应用的就不是module.exports
的导出方式。
//这种操作是错误的
exports = {}
//这种正确
exports.foo = 'bar'
//给 exports 赋值会断开和 module.exports 之间的引用。同理,给 module.exports 重新赋值也会断开
// 这里导致 exports !== module.exports
module.exports = {
foo: 'bar'
}
// 但是这里又重新建立两者的引用关系
exports = module.exports
exports.foo = 'hello'
结论:
导出多个成员:
exports.xxx = xxx
或者module.exports = {}
导出单个成员必须
为:module.exports={}
require
文件不会重复加载, 但是会得到导出的文件内部的对象
require加载规则
- 核心模块
直接引入模块名
var http = require('http');
- 第三方模块
直接引入模块名
var template = require('art-template');
- 自定义模块
引入路径
路径形式的模块:
./
当前目录,不可省略
../
上一级目录,不可省略
/xxx
几乎不用
d:/a/foo.js
几乎不用
/
在这里表示的是当前文件模块所属磁盘根路径
.js
后缀名可以省略
var myModule = require('./myModule');
- 如何把自定义模块当做第三方模块加载
前提不能与核心模块和第三方模块重名
比如定义一个my-module
node_modules
->node_modules/my-module
->node_modules/my-module/package.json
->first.js
没有`main` 就直接定义一个`index.js`
{
main:'first.js'
}
module.exports= function (){
console.log('这就是我导出的内容');
}
node_modules/my-module/package.json
文件中的main
属性,main
属性中就记录了 my-module 的入口模块, 这样就可以使用第三方包的导入方式直接无路径导入
实际上最终加载的还是文件>如果 package.json 文件不存在或者 main 指定的入口模块是也没有
则 node 会自动找该目录下的 index.js
也就是说 index.js 会作为一个默认备选项
导入
var my-module = require('my-module')