目录
一、NodeJS的模块系统
1、为什么使用模块
(1)提供代码的使用效率和可读性。将相应的程序封装在模块中
(2)通过模块打包程序不会改变原有的全局作用域
(3)模块可以发布到npm仓库中与他人共享
2、自定义模块
(1)遵循CommonJS规范,用于服务器端开发,不用考虑非同步方式
A、CommonJS是一套代码规范,目的是为了构建JavaScript在浏览器之外的生态系统 (服务器端, 桌面端)
B、CommonJS的主要内容:
a、模块必须通过 module.exports 导出对外的变量或接口
b、通过 require() 来导入其他模块的输出到当前模块作用域中(模块一般在文件的顶部导入)。
☀️举个例子( module.exports 导出):
自定义模块:demo.js 代码
module.exports.name='西安邮电'
module.exports.age=78
module.exports.getName=function(){
console.log('姓名:'+this.name)//this表示当前模块的name变量所对应的值,也就是西安邮电
}
module.exports.getAge=function(){
console.log('年龄:'+this.age)
}
app.js导入demo.js这个模块:
//是指将demo.js自定义的这个整个模块导入,就是将里面的变量和方法都导进来,然后创建一个对象去引用
var person =require('../module/demo.js')
person.getName()
person.getAge()
console.log(person.name)
运行结果:
(2)exports和module.exports的关系
☀️举个例子(exports导出):
自定义模块:hello.js 代码:
var show_day=new Array('星期一','星期二','星期三','星期四','星期五','星期六','星期七')
var nowTime =new Date()
var day=nowTime.getDay()
exports.sayHello=function(name){
console.log('你好,'+name)
console.log('今天是'+show_day[day-1])
}
test.js导入hello.js这个模块:
var Hello =require('../module/hello')
Hello.sayHello('张三丰')
运行结果:
改造:
自定义模块:hello.js 代码:
var show_day=new Array('星期一','星期二','星期三','星期四','星期五','星期六','星期七')
var nowTime =new Date()
var day=nowTime.getDay()
/* exports.sayHello=function(name){
console.log('你好,'+name)
console.log('今天是'+show_day[day-1])
} */
function Hello(name){//Hello是一个构造方法
this.name=name
this.sayHello =function(){
console.log('你好,'+this.name)
console.log('今天是'+show_day[day-1])
}
}
module.exports= Hello//导出一个构造方法名字Hello,也就是hello类 */
test.js导入hello.js这个模块:
var Hello =require('../module/hello')
var hello =new Hello('张无忌')//实例化后才可以调用方法
hello.sayHello()
同样也可以输出相同的结果(推荐此方法):
关系:
A、exports在模块的文件级别作用域内有效,它在模块被执行前被赋予module.exports的值。
B、exports只是对module.exports的一个全局引用
区别:
C、使用exports导出的方法返回的是模块函数,可以直接调用
D、使用module.exports导出的方法返回的是一个类,需实例化为对象之后才可以调用
3、模块的加载顺序
(1)从缓存中加载
(2)加载核心模块
(3)加载文件模块
(4)文件夹作为模块
(5)从node_modules目录加载
(6)从全局目录加载
二、NodeJS的核心模块
1、os模块:提供基本的计算机系统操作的方法
(1)使用方式:
const os = require(‘os’)
(2)常用方法
type():返回操作系统的类型
platform():返回操作系统的平台
totalmem():返回内存空间
freemem():返回空闲的内存空间
cpus():返回CPU的信息
☀️举例说明:
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())
由上图可知:我有8g的内存(内存越大,所存储的东西越多,cpu一次取得数据就多,系统运行速度就越快),空闲内存是2.9g,8核cpu
2、util模块:实用工具模块
(1)使用方式:
const util = require(‘util’)
(2)常用方法:
format():返回格式化的字符串
const util=require('util')
var t='----'
var str=util.format('%s'+t+'%s','西安邮电大学','长安校区')//%S是一个格式字符串,format/* 对字符串进行格式化 */
console.log(str)
3、path模块:处理和转换文件路径(处理不同平台的路径问题)
(1)使用方式:
const path = require(‘path’)
(2)属性
path.delimiter:提供平台特定的路径分隔符
path.sep:提供平台特定的路径分段分隔符
强调:因为’\‘具有转义字符的含义,所以在win32平台下用字符串表示一个路径时,通常使用的路径分段分隔符为’\\’
‘c:\\demo\\code’
(3)常用方法
path.normalize():路径格式化
path.parse(path):返回完整路径的一个对象
const path =require('path')
console.log(path.delimiter)//win32平台下的路径分隔符;
console.log(path.sep) //win32平台下的路径的分段分隔符是‘\’
console.log(path.normalize('/test/tt/t1/t2'))
console.log(path.parse('./app.js'))//返回完整路径的一个对象
4、URL(统一资源定位符)模块:用于对url的解析和处理
前提小知识:
绝对URI
比如:‘http://user:pass@www.example.com:80/dir/index.html?uid=1#ch1’
协议 登录信息 服务器地址 端口 文件路径 查询字符串 片段标示符
URI :Uniform Resource Identifier,统一资源标识符;
URL:Uniform Resource Locator,统一资源定位符;
URN:Uniform Resource Name,统一资源名称。
其中,URL,URN是URI的子集。
(1)使用方式:
const url = require('url') //传统方式
const { URL } = require('url') //新的WHATWG API(标准的新的API)
(2)常用方法
url.parse('url') //传统方式:将url解析成对象
new URL('url') //新的WHATWG API(标准的新的API)
☀️举个例子(传统):
const url=require('url')//传统方式
var myUrl =url.parse('http://users:pass@sub.host.com:8080/p/a/t/h?query=string#hash')//传统方式
console.log(myUrl)
☀️举个例子(新的):
const{URL}=require('url')//新的WHATWG API(标准的新的API)
var myUrl=new URL('http://users:pass@sub.host.com:8080/p/a/t/h?query=string&addr=西安#hash')//新的
console.log(myUrl)
Url基础指点:
属性 | 说明 |
---|---|
protocol | 表示url采用的什么协议 |
slashes | 表示是否有斜线 |
host | 表示主机 |
post | 表示端口(默认80端口不显示) |
hostname | 表示主机名称 |
hash | 指的是#号后的内容包含#(锚点) |
search | 指的是?后#前的内容,包含?(查询字符串参数) |
query | 指的是search不包含?的内容(给http服务器发送数据) |
pathname | 指的是路径名称,一般指主域名之后的内容(‘/返回自己的路径名/’) |
path | 路径 |
href | 代表未解析的url地址 |
5、querystring模块:解析和处理URL中的查询字符串
(1)使用方式:
const querystring = require('querystring')
(2)常用方法:
方法 | 说明 |
---|---|
querystring.parse() | 将一个URL查询字符串解析成一个键值对的集合 |
querystring.stringify(obj[, sep[, eq[, options]]]) | 将一个对象转换成URL查询字符串 |
☀️举个例子:
const{URL}=require('url')//新的WHATWG API(标准的新的API)
const querystring=require('querystring')
var myUrl=new URL('http://users:pass@sub.host.com:8080/p/a/t/h?query=string&addr=西安#hash')//新的
console.log(myUrl)
console.log(myUrl.searchParams.get('addr'))
var qs=querystring.parse(myUrl.search)
console.log(qs)
var temp={
id:'12345',
hobby:'AA',
addr:'BB'
}
console.log(querystring.stringify(temp))
三、NodeJS的包管理器 ---- npm(Node Package Manager)
1、使用npm安装模块后,会自动生成node_modules文件夹,将安装的模块存放在该文件夹中会自动生成package.json文件,给出的项目运行的依赖关系(项目中的模块、版本号)
2、常用指令:
(1)升级npm:参数-g表示全局安装
npm install npm -g
(2)安装模块
npm install 模块名称@版本号 安装参数
(3)卸载模块
npm uninstall 模块名称
(4)将npm定向到淘宝镜像(本地的,所以运行更快)
npm install -g cnpm --registry=https://registry.npm.taobao.org