node 学习笔记 模块和包的管理与使用
1、前言
对于各种编程语言,代码组织是很重要的。而模块是node中的代码组织机制,node中的很多功能都以模块划分,而模块中又封装了许多方法,而且不会改变全局作用域,极大的方便了各开发者的需求。
2、模块操作
2.1 自定义模块
举个例子:
hello.js
var daysarr = new Array('星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日');
var now = new Date();
var day = now.getDay();
exports.sayhello= function (name) {
console.log('你好!' + name);
console.log('今天是' + daysarr[day - 1]);
};
test.js
let hello = require('./hello')
hello.sayhello("Tom")
运行结果:
你好!Tom
今天是星期二
上面的hello.js中,exports对象只设置了一个sayhello属性,因此,导入该模块的只能访问sayhello方法,而不能访问daysarr ,now等私有变量。
2.2 模块的导入和定义
2.2.1 模块的导入
通常我们导入模块使用require()方法,该方法中需要明确文件路径,可以是相对路径或绝对路径,JS文件的扩展名可省略不写。如:
let hello = require('./hello')
hello.sayhello("Tom")
注意:require是同步操作。通常只在程序加载是使用require,因此模块在文件顶部导入
2.2.2 模块的定义
使用module.exports定义模块
举个例子,四则运算的实现:
math.js
module.exports={
add:function(a,b){
return a+b
},
sub:function(a,b){
return a-b;
},
mul:function(a,b){
return a*b
},
dev:function(a,b){
return a/b
}
}
test.js
let methods = require('./math')
console.log(methods.sub(1,2))
console.log(methods.add(1,2))
console.log(methods.mul(1,2))
console.log(methods.dev(1,2))
运行结果:
-1
3
2
0.5
2.3 module.exports与exports的关系
exports只是对module.exports的一个全局引用。最终返回给程序调用的是module.exports,若创建了一个既有module.exports又有exports的模块,那么exports就不起作用了。
2.4 模块加载顺序
- 从缓存加载
- 加载核心模块
- 加载文件模块
- 文件夹作为模块
- 从node_modules目录加载
- 从全局加载
- 循环加载
3、OS模块
3.1 功能
3.1 功能
OS模块提供了基本的系统操作方法
3.2 常用方法
方法
描述
os.type()
查询操作系统类型
os.hostname()
查询操作系统的主机名
os.uptime()
查询操作系统的上线时间(秒)
os.platform()
查询操作系统平台名称
os.totalmem()
查询系统内存总量(字节)
os.freemem()
查询空闲内存量(字节)
os.cpus()
查询CPU内核信息
os.constants()
返回一个包含错误码,处理信号等通用的操作系统特定常量对象
| 方法 | 描述 |
|---|---|
| os.type() | 查询操作系统类型 |
| os.hostname() | 查询操作系统的主机名 |
| os.uptime() | 查询操作系统的上线时间(秒) |
| os.platform() | 查询操作系统平台名称 |
| os.totalmem() | 查询系统内存总量(字节) |
| os.freemem() | 查询空闲内存量(字节) |
| os.cpus() | 查询CPU内核信息 |
| os.constants() | 返回一个包含错误码,处理信号等通用的操作系统特定常量对象 |
左右滑动查看完整表格
3.3 示例
javascriptconst os = require('os');
console.log('操作系统类型:' + os.type());
console.log('操作系统平台: ' + os.platform());
console.log('系统内存总量:' + os.totalmem() + " 字节");
console.log('空闲内存量:' + os.freemem() + " 字节");
console.log('CPU信息:' + os.cpus());
console.log("系统上线时间是:" + os.uptime() + '秒')
const os = require('os');
console.log('操作系统类型:' + os.type());
console.log('操作系统平台: ' + os.platform());
console.log('系统内存总量:' + os.totalmem() + " 字节");
console.log('空闲内存量:' + os.freemem() + " 字节");
console.log('CPU信息:' + os.cpus());
console.log("系统上线时间是:" + os.uptime() + '秒')
运行结果:
操作系统类型:Windows_NT
操作系统平台: win32
系统内存总量:12729044992 字节
空闲内存量:6448615424 字节
CPU信息:[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
系统上线时间是:301526秒
4、util模块
4.1 功能
util模块只要用于支持node中API的需求,提供的使用工具。
4.2 常用方法
方法
描述
util.inspect(object[,options])
返回字符串表示,主要用于调试
util.format(format[,...args])
返回一个格式化后的字符串,format表示一个类似printf的格式化字符串,包括占位符。如果第一个参数不是字符串,则返回一个将所有参数用空格分格并连在一起的字符串。
| 方法 | 描述 |
|---|---|
| util.inspect(object[,options]) | 返回字符串表示,主要用于调试 |
| util.format(format[,...args]) | 返回一个格式化后的字符串,format表示一个类似printf的格式化字符串,包括占位符。如果第一个参数不是字符串,则返回一个将所有参数用空格分格并连在一起的字符串。 |
左右滑动查看完整表格
4.3 示例
javascriptconst util= require('util');
console.log(util.format(1,2,3));
const util= require('util');
console.log(util.format(1,2,3));
运行结果:
'1 2 3'
5、path模块
5.1 功能
path模块用于处理和转换文件路径
5.2 常用方法
方法
描述
path.normalize(path)
格式化路径
path.join([...path])
连接路径
path.resolve([...path])
将一个路径或路径片段解析成一个绝对路径
path.extname(path)
获取扩展名
path.join(path)
连接路径
| 方法 | 描述 |
|---|---|
| path.normalize(path) | 格式化路径 |
| path.join([...path]) | 连接路径 |
| path.resolve([...path]) | 将一个路径或路径片段解析成一个绝对路径 |
| path.extname(path) | 获取扩展名 |
| path.join(path) | 连接路径 |
左右滑动查看完整表格
5.3 示例
javascriptconst path = require('path');
let file = "file.js"
console.log(path.resolve(file))
const path = require('path');
let file = "file.js"
console.log(path.resolve(file))
运行结果:
D:\code\Workspace\node_projects\work\file.js
6、url模块
6.1 功能
url模块用于URL处理和解析
6.2 常用方法
方法
描述
url.hash
获取及设置 URL 的片段部分
url.host
获取及设置 URL 的主机部分
url.href
获取及设置序列化的 URL
url.username
获取及设置 URL 的用户名部分
url.hostname
获取及设置 URL 的主机名部分。 url.host 和 url.hostname 之间的区别是 url.hostname 不包含端口。
url.password
获取及设置 URL 的密码部分
url.port
获取及设置 URL 的端口部分
url.protocol
获取及设置 URL 的协议部分
url.search
获取及设置 URL 的序列化查询部分
url.toString()
在 URL 对象上调用 toString() 方法将返回序列化的 URL。 返回值与 url.href 和 url.toJSON() 的相同
url.toJSON()
在 URL 对象上调用 toJSON() 方法将返回序列化的 URL。 返回值与 url.href 和 url.toString() 的相同
| 方法 | 描述 |
|---|---|
| url.hash | 获取及设置 URL 的片段部分 |
| url.host | 获取及设置 URL 的主机部分 |
| url.href | 获取及设置序列化的 URL |
| url.username | 获取及设置 URL 的用户名部分 |
| url.hostname | 获取及设置 URL 的主机名部分。 url.host 和 url.hostname 之间的区别是 url.hostname 不包含端口。 |
| url.password | 获取及设置 URL 的密码部分 |
| url.port | 获取及设置 URL 的端口部分 |
| url.protocol | 获取及设置 URL 的协议部分 |
| url.search | 获取及设置 URL 的序列化查询部分 |
| url.toString() | 在 URL 对象上调用 toString() 方法将返回序列化的 URL。 返回值与 url.href 和 url.toJSON() 的相同 |
| url.toJSON() | 在 URL 对象上调用 toJSON() 方法将返回序列化的 URL。 返回值与 url.href 和 url.toString() 的相同 |
左右滑动查看完整表格
7、fs模块
7.1 功能
fs模块可用于读写本地文件和目录,所有的fs操作都具有同步的、回调的、以及基于 promise 的形式
7.2 常用方法
方法
描述
fs.mkdir
创建目录
fs.readdir
查看目录的内容
fs.appendFile
追加文件
fs.createReadStream
读取文件,两个参数,第一个为读取文件的路径,第二个为highWaterMark 最高水位线,默认最多读取64K
fs.open
打开文件
fs.readFile
异步读取文件
fs.readFileSync
同步读取文件
fs.unlink
异步删除文件
fs.unlinkSync
同步删除文件
fs.copyFile
异步复制文件
fs.rename
文件重命名
fs.stat
获取文件信息
fs.watch
侦听目录的改变
fs.watchFile
侦听文件的改变
| 方法 | 描述 |
|---|---|
| fs.mkdir | 创建目录 |
| fs.readdir | 查看目录的内容 |
| fs.appendFile | 追加文件 |
| fs.createReadStream | 读取文件,两个参数,第一个为读取文件的路径,第二个为highWaterMark 最高水位线,默认最多读取64K |
| fs.open | 打开文件 |
| fs.readFile | 异步读取文件 |
| fs.readFileSync | 同步读取文件 |
| fs.unlink | 异步删除文件 |
| fs.unlinkSync | 同步删除文件 |
| fs.copyFile | 异步复制文件 |
| fs.rename | 文件重命名 |
| fs.stat | 获取文件信息 |
| fs.watch | 侦听目录的改变 |
| fs.watchFile | 侦听文件的改变 |
左右滑动查看完整表格
7.3 示例:更改文件内容
要求:
1、把person.json中的钱七的年龄更新为35岁。
2、将新记录['王五','18'],['张三','28'] 把person.csv文件里。
首先要先安装OS模块
npm install os --save
person.json
[
{
"name": "张三",
"ages": 9999
},
{
"name": "李四",
"ages": 25
},
{
"name": "王五",
"ages": 30
},
{
"name": "赵六",
"ages": 24
},
{
"name": "钱七",
"ages": 22
}
]
新建index.js文件
const fs = require("fs")
fs.readFile("person.json", "utf8", function (err, res) {
if (err) throw err
let data = JSON.parse(res)
for (var i = 0; i < data.length; i++) {
if (data[i].name == "钱七") {
data[i].ages = 35
}
}
console.log(data);
})
fs.readFile("person.csv", "utf8", function (err, res) {
if (err) throw err
let data = ['王五', '18'].toString() + "\n" + ['张三', '28']
fs.writeFile("person.csv", data, function (err) {
if (err) throw err
console.log("数据写入成功");
})
})
运行结果:
[
{ name: '张三', ages: 9999 },
{ name: '李四', ages: 25 },
{ name: '王五', ages: 30 },
{ name: '赵六', ages: 24 },
{ name: '钱七', ages: 35 }
]
数据写入成功
再来看看这两个文件内容是否改变。
person.json
[
{
"name": "张三",
"ages": 9999
},
{
"name": "李四",
"ages": 25
},
{
"name": "王五",
"ages": 30
},
{
"name": "赵六",
"ages": 24
},
{
"name": "钱七",
"ages": 35
}
]
person.csv
王五,18
张三,28
这就完成了这些修改。
7.4 需要注意
在读取文件时,可以使用文件系统标识,如:
r+ 表示以读写模式打开,文件不存在则抛出异常
w+ 表示以读写模式打开,文件不存在则创建,等等。
8、npm 以及包的使用
8.1 npm简介
- npm即node package manager , 包管理工具。全球开发者社区,包含全球所有包(框架、插件)
- 包是一组 模块组合成的一套工具,例如: jquery 、 bootstrap 、 less 、 express

