NodeJS模块化

什么是NodeJS

  • 1.Node.js官网地址:https://nodejs.org/en/
  • 中文:http://nodejs.cn/api/
  • 1.Node 是一个构建于 Chrome V8引擎(编译器)之上的一个Javascript 运行环境
    • Node是一个运行环境,作用是让js拥有开发服务端的功能
  • 2.Node使用事件驱动、非阻塞IO模型(异步读写)使得它非常的轻量级和高效
    • Node中绝大多数API都是异步(类似于ajax),目的是提高性能
  • 3.Node中的NPM是世界上最大的开源库生态系统(类似于github)
  • 4.Node运行环境的另一种叫法,作用是解析执行js代码(Node.exe工作环境称之为REPL环境)
  • 5 .nodemon
    • node开发之友,当你的js文件发生变化的时候,nodemon会自动帮你启动node程序
  • 安装: npm install -g nodemon
    • 使用:nodemon [js文件名]

NodeJS模块化

模块:其实就是前端的第三方库(别人写的js文件)

内置模块/核心模块:nodejs作者自己写的模块

第三方模块:热心网友写的模块

核心模块

nodejs模块的使用方法:

  • 1.导包(下载):得到一个对象,存储框架中的API
    • require('模块路径');
  • 2.用包:调用对象的方法
fs文件读取模块
  • readFile读取文件
    1.导入模块
    (1)参数: 模块路径 (2)返回值对象 , 存储模块所有的api
const fs = require('fs');
  1. 使用模块
/**
* @description:
* @param {string} path:文件路径 
* @param {string} option:可选参数 文件编码默认二进制 utf-8:中文 
* @param {function} callback:读取回调 (err,data)=>{err:错误信息 data:读取数据}
* @return: 
*/
fs.readFile('./a.txt','utf-8',function(err,data){
    if(err){
        // 抛出异常:程序终止运行,并且会告诉你报错的原因和具体的行数
        throw err;

        // console.log(err);
        // console.log('读取失败');
        // 成功,err就是null,data就是文件数据
    }else{
        console.log('读取成功');
        console.log(data);
    }
});

在这里插入图片描述

  • writeFile写入文件
// 1.导入模块
const fs = require('fs');
//2. 使用模块
/**
* @description:写入文件
* @param {string} path :文件路径
* @param {string} data :要写入的数据
* @param {string} option :文件编码 自动根据数据识别,一般不用传
* @param {function} callback : 写入回调(err)=>{err:错误信息}
* @return: 
*/
fs.writeFile('./b.txt','helloworld',err=>{
    if(err){
        throw err;
    }else{
        console.log('写入成功');
    }
})
  • 同步与异步的区别
  1. 编译器执行代码流程
    • 从上往下解析代码
    • 判断代码是同步还是异步
      同步:立即执行
      异步:不执行,放入一个事件队列池(EventLoop)
  2. 同步与异步的区别
    • API不同,异步有回调函数,同步一般没有(前端有两个API是异步,定时器和ajax)
    • 执行顺序不同同步有序且优先执行异步无序执行
    • 性能不同,异步性能高(不能阻塞线程),同步阻塞线程
/* 
    1.编译器执行代码流程
        1.1 从上往下解析代码
        1.2 判断代码是同步还是异步
            同步:立即执行
            异步:不执行,放入一个事件队列池(EventLoop)
        1.3 当页面所有同步执行完毕之后,才会执行事件队列池中的代码

    2.同步与异步区别
        2.1 API不同,异步有回调函数,同步一般没有
            * 前端有两个API是异步,定时器和ajax
        2.2 执行顺序不同,同步有序且优先执行,异步是无序执行
        2.3 性能不同,异步性能高(不能阻塞线程),同步阻塞线程
*/

// 导入模块
const fs = require('fs');

/* 
    异步api的特点:
        1.有回调函数
        2.无序执行
        3.不阻塞线程:性能高
*/
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
	console.log(11111);
});
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
	console.log(22222);
});
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
	console.log(33333);
});
fs.readFile('./a.txt', 'utf-8', (err,data)=> {
	console.log(44444);
});
/* 
// nodejs中所有的api都是异步的,如果希望同步就会在后面加上sync即可
    同步的特点:
        1.没有回调
        2.有序
        3.阻塞线程:性能低
*/
let data1 = fs.readFileSync('./b.txt','utf-8');
console.log('55555');
let data2 = fs.readFileSync('./b.txt','utf-8');
console.log('666666');
let data3 = fs.readFileSync('./b.txt','utf-8');
console.log('777777');
let data4 = fs.readFileSync('./b.txt','utf-8');
console.log('8888888');

在这里插入图片描述

path路径模块
  • NodeJS中的相对路径与绝对路径
    • 前端相对路径 ./ :相当于当前文件所在的文件夹
    • nodejs相对路径 ./:相对于执行node命令所在的文件夹
    • 在node中,每个js文件都有两个全局变量
      • __dirname:当前js文件所在的文件夹绝对路径
      • __filename:当前文件本身的绝对路径
  • path路径模块作用
    作用和自己拼接差不多,但是容错率更高
    • 自动识别当前操作系统的磁盘分隔符,会自动添加
    • 纠错功能:如果磁盘分隔符写错了,path模块会自动纠正
// 导入path模块
const path = require('path');
let aPath = `${__dirname}/a.txt`;
console.log(aPath);


let bPath = path.join(__dirname, '\\/data', '///\\a.txt');
console.log(bPath);

// 1.导入模块
// (1)参数: 模块路径 (2)返回值:对象,储存模块所有的api
const fs = require('fs');
// (2)使用模块
fs.readFile(aPath, 'utf-8',  (err, data)=> {
	if (err) throw err;
	console.log(data);//测试
});

http服务器模块
  • http模块搭建服务器
    1. 导入模块
    2. 创建服务器
    3. 打开服务器
// 1.导入模块(相当于安装phpstudy软件)
const http = require('http')

// 2.创建服务器(相当于运行phpstudy打开一个窗口)
let server = http.createServer((req,res)=>{
    // 监听客户请求的回调函数:每收到一次客户请求,就会调用一次(类似于事件触发)
    // req:请求对象,负责获取客户端的请求信息 res:响应对象。负责响应客户端的数据的
    console.log(req.url);
    // 了解即可:url中文会被进行urlencode转码
    console.log(decodeURI(req.url));
});

// 3.打开服务器(相当于点击phpstudy的开启按钮)
/**
* @description:
* @param {type} post:端口号 :系统给每一个应用程序一个编号,称之为端口号
    * 默认就是本机ip
* @param {type} hostname :主机名(ip地址) 每一台计算机网络唯一身份标识符(人的身份证号)
* @param {type} callback: 开启服务器
* @return: 
*/
server.listen(3000,()=>{
    console.log('服务器开启成功');
});

  • http模块响应请求
    注意:
  1. end()参数只能是两种类型 字符串二进制
  2. 如果想要响应对象,需要转成json格式字符串
// 1.导入模块
const http = require('http');

// 2.创建服务器
let server = http.createServer((req, res) => {
	//  req:请求对象
	console.log(req.url);

	// res:响应对象
	// 注意点 end()参数只能是两种类型 字符串 | 二进制
	// 如果想要响应对象,需要转成json格式字符串 JS->JSON.stringify()

	res.writeHead(200, {
		'Content-Type': 'text/html;charset=utf8',
	}); //text/html文本});
	res.end(JSON.stringify({ name: '二傻子', age: 20 }));
});


//  3.开启服务器
server.listen(3000, () => {
	console.log('服务器开启成功');
});

  • http模块根据不同的请求响应不同的数据
  • http模块响应html文件
    需求:
    (1)请求路径为首页 : / . 响应:index.html
    (2)请求路径为: /login 响应: login.html
    (3)请求路径为: /list 响应: list.html
    (4)其他路径 : 响应: 404.html
// 1.导入模块
const http = require('http');
const fs = require('fs');
const path = require('path');

// 2.创建服务器
let server = http.createServer((req, res) => {
	// (1)请求:req
	console.log(req.url);
	// (2)处理:根据不同的请求响应不同的数据
	if (req.url == '/') {
		// 响应:index.html
		// fs模块读取文件
		fs.readFile(
			path.join(__dirname, 'www', 'index.html', (err, data) => {
				if (err) throw err;
				// (3)响应
				res.end(data);
			})
		);
	} else if (req.url == '/login') {
		//响应login
		// fs模块读取文件
		fs.readFile(
			path.join(__dirname, 'www', 'login.html', (err, data) => {
				if (err) throw err;
				// (3)响应
				res.end(data);
			})
		);
	} else if (req.url == '/list') {
		// 响应 :list.html
		fs.readFile(
			path.join(__dirname, 'www', (err, data) => {
				if (err) throw err;
				// 响应
				res.end(data);
			})
		);
	} else {
		fs.readFile(
			path.join(__dirname, 'www', '/404.html', (err, data) => {
				if (err) throw err;
				res.end(data);
			})
		);
    }
    // 3.开启服务器
    server.listen(3000,()=>{
        console.log('服务器成功开启');
    })
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值