1.模块的分类
- 文件模块
我们自己写的功能模块文件 - 核心模块
node平台自带的一套基本的功能模块,也称之为node平台的api - 第三方模块
社区或第三方个人开发好的功能模块,可以直接拿回来用
2.模块化开发的流程
- 创建模块
new calc.js
- 导出成员
module.exports = {}
- 载入模板
var calc = require('./calc.js')
- 使用模块
calc.add(1,2)
3.模块内全局环境
- __dirname
用于获取当前文件所在目录的完整路径 - __filename
用来获取当前文件的完整路径
以上在REPL环境无效
module/module.js:
//获取当前脚本所在路径
console.log(__dirname);
//文件路径
console.log(__filename);
test.js:
const module1 = require('./module/module');//会进入到module/module.js执行里面的操作
执行结果:
$ node test
D:\phpStudy\PHPTutorial\WWW\node\module
D:\phpStudy\PHPTutorial\WWW\node\module\module.js
在文件操作中,所有的路径必须是绝对路径(物理路径)
错误示例:
const fs = require('fs');
fs.readFile('../log.txt',(error,content) => {
if(error) throw error;
console.log(content);
});
结果:
$ node test
D:\phpStudy\PHPTutorial\WWW\node\module\module.js:8
if(error) throw error;
^
Error: ENOENT: no such file or directory, open 'D:\phpStudy\PHPTutorial\WWW\log.
txt'
正确:
const fs = require('fs');
//fs.readFile(__dirname+'/../log.txt','utf8',(error,content) => {//这种不需要toString()转换了
fs.readFile(__dirname+'/../log.txt',(error,content) => {
if(error) throw error;
console.log(content.toString());
});
结果:
$ node test
海王
- module-模块对象
node内部提供一个Module构建函数,所有的模块都是Module的实例,属性如下:
module.id
模块的识别符,通常是带有绝对路径的模块文件名。
module.filename
模块定义的文件的绝对路径。
module.loaded
返回一个布尔值,表示是否已经完成加载。
module.parent
返回一个对象,表示该模块用到的其他模块(父级)。
module.children
返回一个数组,表示模块用到的其他模块(子级)。
test.js:
console.log(module);
打印结果:
$ node test
Module {
id: '.',
exports: {},
parent: null,
filename: 'D:\\phpStudy\\PHPTutorial\\WWW\\node\\test.js',
loaded: false,
children: [],
paths:
[ 'D:\\phpStudy\\PHPTutorial\\WWW\\node\\node_modules',
'D:\\phpStudy\\PHPTutorial\\WWW\\node_modules',
'D:\\phpStudy\\PHPTutorial\\node_modules',
'D:\\phpStudy\\node_modules',
'D:\\node_modules' ] }
如果将打印放在module.js中,在test.js引入它
module.js:
console.log(module);
test.js:
require('./module/module');
结果:
$ node test
Module {
id: 'D:\\phpStudy\\PHPTutorial\\WWW\\node\\module\\module.js',
exports: {},
parent:
Module {
id: '.',
exports: {},
parent: null,
filename: 'D:\\phpStudy\\PHPTutorial\\WWW\\node\\test.js',
loaded: false,
children: [ [Circular] ],
paths:
[ 'D:\\phpStudy\\PHPTutorial\\WWW\\node\\node_modules',
'D:\\phpStudy\\PHPTutorial\\WWW\\node_modules',
'D:\\phpStudy\\PHPTutorial\\node_modules',
'D:\\phpStudy\\node_modules',
'D:\\node_modules' ] },
filename: 'D:\\phpStudy\\PHPTutorial\\WWW\\node\\module\\module.js',
loaded: false,
children: [],
paths:
[ 'D:\\phpStudy\\PHPTutorial\\WWW\\node\\module\\node_modules',
'D:\\phpStudy\\PHPTutorial\\WWW\\node\\node_modules',
'D:\\phpStudy\\PHPTutorial\\WWW\\node_modules',
'D:\\phpStudy\\PHPTutorial\\node_modules',
'D:\\phpStudy\\node_modules',
'D:\\node_modules' ] }
可以通过module.parent
判断当前这个文件是否被别的文件加载
module.js:
if(module.parent){
console.log('当前这个文件是被别的文件加载');
}else{
console.log('入口文件');
}
- exports
映射到module.exports的别名,表示模块对外输出的值。
4.模块的定义
- 一个心的JS文件就是一个模块
- 一个合格的模块应该是有导出成员的,否则模块就失去了定义的价值。
- 模块内部是一个独立(封闭)的作用域(模块与模块之间不会冲突)。
- 模块之间必须通过导出或导入的方式协同;
- 导出方式:
exports.name = value
module.exports = {name : value}
网友评论