一、NodeJS的模块系统
1、为什么使用模块
(1)提供代码的使用效率和可读性。将相应的程序封装在模块中
(2)通过模块打包程序不会改变原有的全局作用域
(3)模块可以发布到npm仓库中与他人共享
2、自定义模块
2.1、遵循CommonJS规范,用于服务器端开发,不用考虑非同步方式
A、CommonJS是一套代码规范,目的是为了构建JavaScript在浏览器之外的生态系统 (服务器端, 桌面端)
B、CommonJS的主要内容:
a、模块必须通过 module.exports 导出对外的变量或接口
b、通过 require() 来导入其他模块的输出到当前模块作用域中(模块一般在文件的顶部导入)。
演示:
自定义模块:
module.exports.name='西安'
module.exports.age=2000
module.exports.getName=function(){
console.log('姓名:'+this.name)//this表示当前模块的name变量所对应的值,也就是西安邮电
}
module.exports.getAge=function(){
console.log('年龄:'+this.age)
}
导入自定义模块:
//是指将demo.js自定义的这个整个模块导入,就是将里面的变量和方法都导进来,然后创建一个对象去引用
var person =require('../module/demo.js')
person.getName()
person.getAge()
console.log(person.name)
2.2、exports和module.exports的关系
演示exports导出:
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])
}
导入模块:
var Hello =require('../module/hello')
Hello.sayHello('张三丰')
改造后:
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类 */
var Hello =require('../module/hello')
var hello =new Hello('张无忌')//实例化后才可以调用方法
hello.sayHello()
二者关系:
(1)、exports在模块的文件级别作用域内有效,它在模块被执行前被赋予module.exports的值。
(2)、exports只是对module.exports的一个全局引用
二者区别:
(3)、使用exports导出的方法返回的是模块函数,可以直接调用
(4)、使用module.exports导出的方法返回的是一个类,需实例化为对象之后才可以调用
3、模块的加载顺序
(1)从缓存中加载
(2)加载核心模块
(3)加载文件模块
(4)文件夹作为模块
(5)从node_modules目录加载
(6)从全局目录加载
二、NodeJS的核心模块
1、os模块:提供基本的计算机系统操作的方法
1.1、使用方式:
const os = require(‘os’)
1.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())
由上图可知,我的电脑是16G的内存,空闲内存为8.5G,CPU为六核十二线程。
2、util模块:实用工具模块
2.1、使用方式:
const util = require(‘util’)
2.2、常用方法:
format():返回格式化的字符串
const util=require('util')
var t='------'
var str=util.format('%s'+t+'%s','唐朝','长安')//%S是一个格式字符串,format/* 对字符串进行格式化 */
console.log(str)
3、path模块:处理和转换文件路径(处理不同平台的路径问题)
3.1、使用方式:
const path = require(‘path’)
3.2、属性
path.delimiter:提供平台特定的路径分隔符
path.sep:提供平台特定的路径分段分隔符
强调:因为’\‘具有转义字符的含义,所以在win32平台下用字符串表示一个路径时,通常使用的路径分段分隔符为’\’
3.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('./path.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的子集。
4.1、使用方式
const url = require('url') //传统方式
const { URL } = require('url') //新的WHATWG API(标准的新的API)
4.2、常用方法
url.parse('url') //传统方式:将url解析成对象
new URL('url') //新的WHATWG API(标准的新的API)
4.3、URL基础知识点:
属性 | 说明 |
---|---|
protocol | 表示url采用的什么协议 |
slashes | 表示是否有斜线 |
host 表示主机 | post 表示端口(默认80端口不显示) |
hostname | 表示主机名称 |
hash | 指的是#号后的内容包含#(锚点) |
search | 指的是?后#前的内容,包含?(查询字符串参数) |
query | 指的是search不包含?的内容(给http服务器发送数据) |
pathname | 指的是路径名称,一般指主域名之后的内容(‘/返回自己的路径名/’) |
path | 路径 |
href | 代表未解析的url地址 |
演示:
第一种方法:
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)
5、querystring模块:解析和处理URL中的查询字符串
5.1、使用方式
const querystring = require(‘querystring’)
5.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、常用指令
2.1、升级npm:参数-g表示全局安装
npm install npm -g
2.2、安装模块
npm install 模块名称@版本号 安装参数
2.3、卸载模块
npm uninstall 模块名称
2.4、将npm定向到淘宝镜像(本地的,所以运行更快)
npm install -g cnpm --registry=https://registry.npm.taobao.org