Node.js模块系统

153 阅读5分钟

一、什么是模块系统

为了让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>