一、什么是模块系统
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。
换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
1、Node核心模块(path,fs,http,ect)
const fs = requrie('fs')
2、通过npm下载的第三方模块或者安装包
const express = require('express')
3、自定义模块(文件)
const myFile = require('./myFile')
一个简单的模块创建引用demo
首先创建两个文件index.js、person.js
person.js
//创建一个自定义模块
//创建一个对象
const person = {
name:'yaobinggt',
age:28
}
//文件模块化
module.exports = person;
index.js
//引用模块 还要创建一个变量进行接收对象模块
const person = require('./person')
console.log(person.name);
//打印出来: yaobinggt
####稍微复杂一点的模块创建引用 首先创建两个文件index.js、person.js
person.js
//创建person类
class Person{
//创建一个构造函数
constructor(name,age){
this.name = name;
this.age =age;
}
//创建一个方法
greething(){
console.log(`My name is ${this.name},age is ${this.age}`)
}
}
//模块化
module.exports=Person;
index.js
//创建一个变量并引入自定义模块
const Person = require('./person');
//对象实例化
const person1 = new Person('IUU',2);
//调用方法
person1.greething();
//结果:My name is IUU,age is 2
__dirname 、 __filename
console.log(__dirname,__filename)
//结果D:\myCode\node\node_module D:\myCode\node\node_module\index.js
二、路径模块
path 模块提供了一些用于处理文件与目录的路径的实用工具。
//引入核心模块
const path =require('path');
//path.basename() 返回path的最后一部分
console.log(__filename); //结果: D:\myCode\node\node_module\reference\path_demo.js
console.log(path.basename(__filename)); //结果:path_demo.js
//path.dirname() 返回path的目录名
console.log(path.dirname(__filename)); //结果: D:\myCode\node\node_module\reference
//path.extname() 返回文件的扩展名
console.log(path.extname(__filename)); //结果:.js
//path.parse()返回一个对象
console.log(path.parse(__filename));
//结果:
// {
// root: 'D:\\',
// dir: 'D:\\myCode\\node\\node_module\\reference',
// base: 'path_demo.js',
// ext: '.js',
// name: 'path_demo'
// }
//path.join() 串联路径
//../test/hello.html
console.log(path.join(__dirname,'test','hello.html')) //结果: D:\myCode\node\node_module\reference\test\hello.html
三、文件系统模块
fs 模块提供了用于与文件系统进行交互(以类似于标准 POSIX 函数的方式)的 API。
所有的文件系统操作都具有同步和异步的形式。
//引入模块
const fs = require('fs');
const path = require('path');
//fs.mkdir() 异步创建目录文件夹
fs.mkdir(path.join(__dirname,'/test'),{},(err)=>{
if (err) throw err;
console.log('文件夹创建成功...');
});
//fs,wirte() 异步写入创建文件
fs.writeFile(path.join(__dirname,'/test','hello.txt'),'hello yaobinggt',(err)=>{
if(err) throw err;
console.log('文件创建成功。。。');
//fs,appendFile() 内容添加
fs.appendFile(path.join(__dirname,'/test','hello.txt'),'I love UU',(err)=>{
if(err) throw err;
console.log('文件写入成功。。。');
})
})
//fs.readFile() 读取文件
fs.readFile(path.join(__dirname,'/test','hello.txt'),'utf8',(err,data)=>{
if(err) throw err;
console.log(data);
})
//fs.rename() 文件夹重名
fs.rename(path.join(__dirname,'/test','hello.txt'),path.join(__dirname,'/test','yaobinggt.html'),err=>{
if (err) throw err;
console.log(`文件名修改成功`)
})
四、操作系统模块
//引入模块
const os =require('os');
//os.platform() 返回标示操作系统平台的字符串
console.log(os.platform());
//os.arch() 返回CPU架构信息
console.log(os.arch());
//os.cpus() 返回内核信息
console.log(os.cpus());
//os.freemem() 返回系统空闲内存(以字节为单位)
console.log(os.freemem());
//os.totalmem() 返回系统总内存(以字节为单位)
console.log(os.totalmem());
//os.homedir()返回用户的主目录的字符串路径
console.log(os.homedir())
//os.uptime() 返回系统的正常运行时间(以秒为单位)
console.log(os.uptime())
五、URL模块
//引入模块
const url = require('url');
//实例化url对象
const myUrl =new URL('http://yaobinggt.com:8080/hello.html?id=100&status=active');
//序列化URL
console.log(myUrl.href); //结果: http://yaobinggt.com/hello.html?id=100&status=active
//转换成字符串
console.log(myUrl.toString()); //结果: http://yaobinggt.com/hello.html?id=100&status=active
//host
console.log(myUrl.host); //结果:yaobinggt.com:8080
//hostname
console.log(myUrl.hostname); //结果:yaobinggt.com
//pathname
console.log(myUrl.pathname); //结果:/hello.html
//search
console.log(myUrl.search); //结果:?id=100&status=active
//searchparams 返回一个对象
console.log(myUrl.searchParams); //返回:URLSearchParams { 'id' => '100', 'status' => 'active' }
//append()
myUrl.searchParams.append('number','123654');
console.log(myUrl.searchParams); //返回:URLSearchParams { 'id' => '100', 'status' => 'active','number' => '123654' }
//froEach
myUrl.searchParams.forEach((value,name) => {
console.log(`${name}:${value}`)
})
//结果:
// id:100
// status:active
// number:123654
六、事件模块
//引入模块
const EventEmitter = require('events');
//创建MyEmitter类
class MyEmitter extends EventEmitter{};
//实例化对象
const myEmitter = new MyEmitter();
//注册事件(同步)
myEmitter.on('event',(msg)=>{
console.log(msg);
})
//注册事件(异步)
myEmitter.on('event',(msg)=>{
setImmediate(()=>{
console.log(msg);
})
})
myEmitter.emit('event','实现事件并传递此参数到注册事件的回调函数中');
console.log(1)
// 结果:
// 实现事件并传递此参数到注册事件的回调函数中(同步)
// 1(同步)
// 实现事件并传递此参数到注册事件的回调函数中(异步)
七、http模块
http模块小demo
//引入模块
const http = require('http');
//创建服务器
http.createServer((req,res)=>{
if(req.url === '/'){// 判断以后就不显示/favicon.ico
console.log(req.url);
res.write('hello yaobinggt')
res.end();
}
}).listen('5000',()=>{
console.log('服务器已运行');
})
稍微复杂的demo 入口文件index.js
// // //引用模块 还要创建一个变量进行接收对象模块
// // const person = require('./person')
// // console.log(person.name);
// //创建一个变量并引入自定义模块
// const Person = require('./person');
// //对象实例化
// const person1 = new Person('IUU',2);
// //调用方法
// person1.greething();
// console.log(__dirname,__filename)//结果D:\myCode\node\node_module D:\myCode\node\node_module\index.js
//----------------------------------------------------
//引入模块
const http = require('http');
const path = require('path');
const fs = require('fs');
//创建变量,储存服务器对象
const serve =http.createServer((req,res)=>{
// if(req.url === '/'){
// fs.readFile(path.join(__dirname,'public','index.html'),(err,data)=>{
// if(err) throw err;
// //设置响应头
// res.writeHead(200,{'Content-type':'text/html;charset=UTF8'});
// res.end(data);
// })
// }
// if(req.url === '/about'){
// fs.readFile(path.join(__dirname,'public','about.html'),(err,data)=>{
// if(err) throw err;
// //设置响应头
// res.writeHead(200,{'Content-type':'text/html;charset=UTF8'});
// res.end(data);
// })
// }
// if(req.url === '/api/user'){
// const user =[
// {name:'yaobinggt',age:28},
// {name:'aixinxin',age:29},
// {name:'aiuu',age:2}
// ];
// //writeHead向请求的客户端发送响应头。
// res.writeHead(200,{'Content-type':'application/json'});
// //返回的数据转换成字符串格式
// res.end(JSON.stringify(user));
// }
//创建变量存储文件路径
let filePath=path.join(__dirname,'public',req.url === '/' ? 'index.html':req.url);
//初始化content type
let contentType = 'text/html';
//得到文件扩展名extname
let extname=path.extname(filePath);
//通过验证拓展名设置content type
switch(extname){
case 'js':
contentType='text/javascript';
break;
case '.css':
contentType='text/css';
break;
case '.json':
contentType='application/json';
break;
case '.png':
contentType='image/png';
break;
case '.jpg':
contentType='image/png';
break;
}
//读取文件
fs.readFile(filePath,(err,data)=>{
if(err){
if(err.code==='ENOENT'){
//没有找到页面
fs.readFile(path.join(__dirname,'public','404.html'),(err,data)=>{
if(err) throw err;
res.writeHead(200,{'Content-type':'text/html'});
res.end(data,'utf8');
})
}else{
//其他服务器错误
res.writeHead(500);
res.end(`服务器错误:${err.code}`)
}
}else{
//成功情况下加载的页面
res.writeHead(200,{'Content-type':contentType});
res.end(data,'utf8');
}
})
// console.log(filePath);
// res.end();
});
//端口号
const PORT = process.env.PORT || 9999;// process.env.Post 在我们启动node的时候如果有环境变量的要求就先运行环境变量端口
//监听端口号
serve.listen(9999,()=>{
console.log(`服务器已经在${PORT}端口号运行...`);
})
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>主页</title>
<style>
body{background-color: skyblue;color:#fff ;}
h1{text-align: center;}
</style>
</head>
<body>
<h1>欢迎来到万能胶囊公司主页</h1>
</body>
</html>
about.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>关于</title>
<style>
body{background-color: skyblue;color:#fff ;}
h1{text-align: center;}
</style>
</head>
<body>
<h1>欢迎来到关于我们页面</h1>
</body>
</html>
404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Not Found</title>
<style>
body{background-color: skyblue;color:#fff ;}
h1{text-align: center;}
</style>
</head>
<body>
<h1>404 NOT FOUNT</h1>
</body>
</html>