版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
介绍
- global对象
node模块采用CommonJS规范,每个js文件是一个模块,内部变量、函数、类私有。
可以使用global对象分享变量,但不推荐
// a.js
global.x = 1
// b.js
require('a')
x // 1
- module对象
// one.js
var two = require('two')
console.log(module)
// 输出
Module {
id: '.',
exports: {},
parent: null,
filename: 'G:\\temp\\one.js',
loaded: false,
children:
[ Module {
id: 'G:\\temp\\two.js',
exports: [Object],
parent: [Circular],
filename: 'G:\\temp\\two.js',
loaded: true,
children: [],
paths: [Array] } ],
paths:
[ 'G:\\temp\\node_modules',
'G:\\node_modules' ]
}
id: 当前模块为’.’,引用模块为filename
filename: 绝对路径
exports: 模块导出的对象,即对外输出接口,默认为{}
parent: 引用该当前模块的其他模块,默认为null,可据此判断当前module是否是程序入口
loaded: module是否已加载
children: 当前模块引用的模块
paths: 当前模块目录直到根目录的node_modules目录
- exports变量
每个module内部exports指向module.exports
exports === module.exports // true
// 相当于在模块内定义了exports变量
var exports = module.exports
导出模块
// one.js
var x = 1
var addX = (val) => val + x
// 正确导出module
module.exports = {x, addX}
exports.x = x
exports.addX = addX
module.exports.x = x
module.exports.addX = addX
// 错误方法,只是改变了exports变量的指向
exports = {x, addX}
require命令
使用方法
- 基本用法
// two.js
var x = 1
var addX = (val) => val + x
var increX = () => ++x
module.exports = {x, addX, increX}
// one.js引用two,文件扩展名默认为js,以下都正确
var two = require('two')
var two = require('two.js')
var two = module.require('two')
- 模块缓存
// 不使用var,存在变量提升(variable hoisting),下面清空缓存会无效
const two = require('./two')
const three = require('./two')
two.x = 3
two === three // true,加载的是缓存
three.x // 3
// 模块缓存保存在require.cache对象中,使用delete删除
delete require.cache['G:\\temp\\two.js'] // 使用绝对路径,且G为大写
// 删除所有模块缓存,这里是当前one.js模块和two.js
for (const key in require.cache) {
delete require.cache[key]
}
two.x = 3
two === three // false,重新加载
three.x // 1
- 模块加载机制
const two = require('./two')
two.increX() // 2
two.x // 1,x的值未改变
require对象
- require.main访问主模块(accessing the main module)
// 直接运行one.js
node one.js
// one.js
const two = require('./two')
require.main === module // true,main属性指向当前模块
// two.js
require.main === module // false,main属性指向one.js
require.main.filename // 'G:\\temp\\one.js',获取程序入口(the entry point)
参考:
http://javascript.ruanyifeng.com/nodejs/module.html
https://nodejs.org/dist/latest-v10.x/docs/api/modules.html
http://nodejs.cn/api/modules.html