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 功能
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包默认安装位置。
node 学习笔记 模块和包的管理与使用的更多相关文章
- Python 2.7 学习笔记 模块和包
我们来考虑下如下几种场景: 1.编写一个python程序,如果程序比较简单,则可以把代码放到一个python文件中.但如果程序功能比较多,可能需要多个python文件来组织源代码.而这些文件之间的代码 ...
- node学习笔记2 —— npm包管理
全局模式安装包 将包安装为全局可用的可执行命令, 并非可以从任意地方require 将 package.json中bin定义的文件软链到统一的目录下, 该目录可以通过如下方式推算出来: path.re ...
- python学习笔记-模块和包
模块导入方法 1.import 语句 import module1[,module2[,...moduleN]] 当我们使用import语句的时候,Python解释器是怎么找到对应对文件对呢?答案是解 ...
- [转帖]Linux学习笔记之rpm包管理功能全解
Linux学习笔记之rpm包管理功能全解 https://www.cnblogs.com/JetpropelledSnake/p/11177277.html rpm 的管理命令 之前学习过 yum 的 ...
- node.js中模块和包
node.js中模块和包 什么是模块 如何创建并加载模块 1. 创建模块 2. 单次加载 3. 覆盖 exports 如何创建一个包 1. 作为文件夹的模块 2. package.json 如何使用包 ...
- Node学习HTTP模块(HTTP 服务器与客户端)
Node学习HTTP模块(HTTP 服务器与客户端) Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端.http.Server 是一个基 ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- Node学习笔记之模块实现
一.模块分类 由Node提供的模块,称为核心模块:部分核心模块在Node源代码的编译过程中,编译进了二进制执行文件.在node进程启动时,该部分就直接加载进内存,文件定位和编译执行的步骤可以省略掉,并 ...
- node学习笔记(二)(ajax方式向node后台提交数据)
通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...
随机推荐
- [CF1500E] Subset Trick (平衡树)
题面 洛谷翻译 V a n y a \rm Vanya Vanya 有一个初始大小为 n n n 的集合 S S S 和 q q q 次往集合加数/删数的操作.(集合中每个数字不同) 称一个数 x x ...
- 源码(chan,map,GMP,mutex,context)
目录 1.chan原理 1.1 chan底层数据结构 1.2 创建channel原理 1.3 写入channel原理 1.4 读channel原理 1.5 关闭channel原理 1.6 总结 2.m ...
- KingbaseES 绑定变量与游标共享
对于重复执行的SQL,需要使用绑定变量,避免SQL的重复解析.但是,并不是说使用了绑定变量,就一定能避免硬解析.具体可以参见:https://www.cnblogs.com/kingbase/p/16 ...
- Mysql_索引总结笔记
Mysql 索引总结 1. 聚簇索引 InnoDB 引擎使用的就是聚簇索引,就是主键的索引,是一种数据的存储方式.所有的数据都是存储在索引的叶子结点上(与MySAM 引擎不同,MySAM是传统方式), ...
- 走进Redis-扯扯集群
集群 为什么需要切片集群 已经有了管理主从集群的哨兵,为什么还需要推出切片集群呢?我认为有两个比较重要的原因: 当 Redis 上的数据一直累积的话,Redis 占用的内存会越来越大,如果开启了持久化 ...
- 以软件定义物联网芯片,以技术融合推动LPWAN2.0泛在物联
作为数字化产业重要的基础设施之一,物联网迎来了黄金发展期.物联网通信技术通过数据的采集.分析.输出,从浅层次的互联工具和产品深化,到成为重塑生产组织方式的基础设施和关键要素,正深刻地改变着传统产业形态 ...
- Python数据科学手册-机器学习: 主成分分析
PCA principal component analysis 主成分分析是一个快速灵活的数据降维无监督方法, 可视化一个包含200个数据点的二维数据集 x 和 y有线性关系,无监督学习希望探索x值 ...
- SpringBoot Xml转Json对象
一.导入需要的依赖 <dependency> <groupId>maven</groupId> <artifactId>dom4j</artifa ...
- ProxySQL(5):线程、线程池、连接池
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9281909.html ProxySQL的线程 ProxySQL由多个模块组成,是一个多线程的daemon类程 ...
- Beats:Beats 入门教程 (二)