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 功能
OS模块提供了基本的系统操作方法
3.2 常用方法
方法 | 描述 |
---|---|
os.type() | 查询操作系统类型 |
os.hostname() | 查询操作系统的主机名 |
os.uptime() | 查询操作系统的上线时间(秒) |
os.platform() | 查询操作系统平台名称 |
os.totalmem() | 查询系统内存总量(字节) |
os.freemem() | 查询空闲内存量(字节) |
os.cpus() | 查询CPU内核信息 |
os.constants() | 返回一个包含错误码,处理信号等通用的操作系统特定常量对象 |
3.3 示例
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的格式化字符串,包括占位符。如果第一个参数不是字符串,则返回一个将所有参数用空格分格并连在一起的字符串。 |
4.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) | 连接路径 |
5.3 示例
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() 的相同 |
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 | 侦听文件的改变 |
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
8.2 npm的安装和使用
- 由于npm 已经集合在 node 安装包内,因此在我们安装好node时就已经默认安装了npm 了。
- 可以通过:npm -v (查看版本)查看是否安装好
- 在创建node项目时,可通过npm init 初始化命令生成 配置文件 package.json,再通过npm install –save安装所需要的包
- npm 的服务器在海外,所以下载速度 理论上会比较慢。可以通过安装 cnpm(npm install -g cnpm –registry=https://registry.npm.taobao.org)和修改淘宝镜像源(npm config set registry https://registry.npm.taobao.org)来解决。
- 在cmd中执行npm config set prefix"node_global 路径名",和npm config set cache "node_cache 路径名"可以实现npm包默认安装位置。