node 学习笔记 模块和包的管理与使用

发布于 2021-05-11  1,791 次阅读


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包默认安装位置。

活的像诗一样