前后端
客户端:
硬件:手机、平板、笔记本、台式机、电视机、智能手表、电器、售货机;
软件:浏览器、QQ、微信、各种APP等;
服务器端:
硬件:服务器,就是电脑,配置非常好,设备;
软件:Apache、Nginx、MySQL、IIS、Tomcat等,nodejs可以创建服务器。
前端(客户端界面开发):界面端 app web(页面html+css+js)
后端: PHP java node C C++等等
Web服务器: 提供网页访问的;
云服务器:可以理解为就是买了一个主机,远程控制云服务器(云电脑),把项目传过去并启动,这样就所有人都可以访问了
认识node.js
nodejs只是一个基于V8引擎的js运行环境而已
nodejs不是一个框架
nodejs可以写服务器,也可以用于创建webpack包(vue)...
node js文件路径:运行js文件
node.js的特点
模块
1.node.js的开发是模块化开发的思想
2.具有一些相同功能的代码,集成为一个模块
3.模块主要是由 node系统自带的模块 第三方模块 自定义模块组成
4.大部分第三方模块都是由npm来管理 (npm是一个集成了当前世界上最多开源库的生态系统)
非阻塞I/O操作模型
底层c/c++是多线程 为上层js提供编程接口
单线程
上层js业务代码是单线程
三个模块
nodejs主要是模块化开发:
nodejs的模块主要分为三类:
(1)系统模块:底层自带的,直接用 fs path http
(2)第三方模块:别人写好的,我们直接拿过来用
(3)自定义模块:自己写的
如何引入导出模块
引入模块:模块必须引入require
导出模块:module.exports
系统模块
fs模块(filesystem文件系统)
__dirname:当前文件所在目录的字符串表示
异步文件读取API:fs.readFile(‘file’,[options],callback(err,data))
第一个参数为文件路径,
第二个参数为option选项(对象)(encoding为编码形式),
第三个参数为回调函数
let fs = require('fs'); //引入fs模块
console.log(1);
fs.readFile('./b.txt',{encoding: 'utf-8'},(err, data)=>{
console.log(err, data); //err参数:报错,没报错时值为null
}); //data参数:文件的内容
console.log(2);
//1 2 console.log(err, data); 所以这个API是异步的
异步文件写入API:fs.writeFile(‘file’,‘data’,[options],callback(err))
第一个参数为文件路径,
第二个参数为需要往文件里面写入的内容,
第三个参数option选项(对象)(flag:”a”在文件内容的后面写入内容,不把之前的内容覆盖掉),
第四个参数为回调函数
let fs = require('fs'); //引入fs模块
console.log(1);
fs.writeFile('./a.txt',"需要往文件里面写入的内容",{flag: 'a'},(err)=>{
console.log(err);
});
console.log(2);
//1 2 console.log(err); 所以这个API是异步的
异步创建目录API:fs.mkdir(‘file’,[options],callback(err))
第一个参数为目录创建位置,
第二个参数option选项(对象)(要创建多级目录,那么就必须把recursive设为true),
第三个参数为回调函数
let fs = require('fs'); //引入fs模块
console.log(1);
//fs.mkdir('./public',(err)=>{
//console.log(err);
//});
//fs.mkdir('./public/js',(err)=>{
//console.log(err);
//}); //逐级创建不会报错,因为recursive默认值为false
fs.mkdir('./upload/20220829',{recursive: true},(err)=>{ //创建多级目录也要设置recursive
console.log(err);
});
console.log(2);
//1 2 console.log(err); 所以这个API是异步的
path模块
__dirname:当前文件所在目录的字符串表示
path.dirname(“路径”):表示获取路径中最后一段文件 或 文件夹所在的路径
let path = require('path'); //导入path模块
console.log(path.dirname(__dirname)); //F:code
console.log(path.dirname('F:code/day1')); //F:code
path.basename(“路径”):表示获取路径中最后一部分(最后一个文件名或者文件夹名)
let path = require('path');
console.log(path.basename(__dirname)); //day1
console.log(path.basename('F:/code/day1')); //day1
http模块
let http = require('http'); //导入http模块,返回一个http对象
// 创建一个服务器
let server = http.createServer(); //这个对象里面有一个API:createServer()可以创建服务器,返回一个对象
// 监听请求
server.on('request',(req,res)=>{ //返回的这个对象里面有一个API:on()监听
res.end('响应给客户端的内容'); //response响应有一个API:end('字符串')响应给客户端的内容
console.log(req.url); //request请求 req.url 路由(请求的地址)默认为 '/'
});
// 设置端口号
server.listen('8080',()=>{
console.log("服务器启动成功就会执行...");
});
本地自己创建的服务器怎么访问?
http://127.0.0.1:端口号
http://localhost:端口号
http://本地IP地址:端口号
例:如何根据不同的请求地址,响应的内容不一样
let http = require('http');
let fs = require('fs'); //引入fs模块
let server = http.createServer();
server.on('request',(req,res)=>{
console.log(req.url);
if(req.url == '/'){
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); //固定设置防止乱码
fs.readFile('./index.html','utf-8',(err,data)=>{ //读取html文件
res.end(data); //data参数为文件的内容
});
}else if(req.url == '/login'){
res.writeHead(200, { 'Content-Type': 'application/json' }); //固定设置防止乱码(Content-Type:内容形式)
res.end(JSON.stringify({code: 1,data: '登录成功'}));
}else if(req.url == '/register'){
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({code: 1,data: '注册成功'}));
}else{
res.end('111');
}
});
server.listen('8080',()=>{
console.log("服务器启动成功就会执行...");
});
一个电脑上面可以启动多个服务器,通过端口号定位到访问的服务器
第三方模块
npm :(node package manager)node包管理器
npm init: 初始化项目,会产生一个配置文件:package.json
npm install md5@版本号 --save: 下载md5模块(指定版本)
简写=>npm i md5
npm uninstall 模块:卸载某个模块
npm update 模块: 更新某个模块
var md5 = require('md5'); //导入md5模块
console.log(md5('message')); //API:md5()参数可以是字符串,Buffer,Array或者Unit8Array(8位无符号整数值的类型化数组)
自定义模块
自定义模块
let mdl = {
name: 'Tom',
age: 22,
sayname(){
return this.name;
}
}
// 导出
module.exports = mdl;
使用
// 导入
let mymodule1 = require('./mymodule/mymodule1'); //用路径导入 ,而不是名字
console.log(mymodule1);
console.log(mymodule1.sayname());