Node.js学习 (八)模块系统

导入模块

默认得到的是对象, 使用对象中的成员必须 . 点儿某个成员来访问

//在没有下面导出的模块是不能直接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
 

原理:

  1. 在 Node 中,每个模块内部都有一个自己的 module 对象, 该 module 对象中,有一个成员叫:exports 也是一个对象
var module = {
   exports: {},
   ...
}
  1. 每次导出接口成员的时候都通过 module.exports.xxx = xxx 的方式很麻烦,点儿的太多了, 所以,Node 为了简化你的操作,专门提供了一个变量:var exports = module.exports

也就是说在底层模块中还有这么一句代码

  var exports = module.exports
  1. 我们可以简写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加载规则
  1. 核心模块
    直接引入模块名
var http = require('http');
  1. 第三方模块
    直接引入模块名
var template = require('art-template');
  1. 自定义模块
    引入路径

路径形式的模块:
./ 当前目录,不可省略
../上一级目录,不可省略
/xxx 几乎不用
d:/a/foo.js 几乎不用
/ 在这里表示的是当前文件模块所属磁盘根路径
.js 后缀名可以省略

var myModule = require('./myModule');
  1. 如何把自定义模块当做第三方模块加载

前提不能与核心模块和第三方模块重名

比如定义一个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')

猜你喜欢

转载自blog.csdn.net/qq_39043923/article/details/89234173