nodejs入门
1.1-学习NodeJS的意义
1.1.1-服务器相关
-
1.
了解客户端浏览器与服务端后台的交互过程
,可以在以后的前端开发工作中与后台人员之间的沟通更加容易理解-
虽然以后工作中不一定用的上nodejs,但是通过对服务端开发的了解,能够让你在日常工作中与公司后台人员之间的沟通变得更加轻松
-
-
2.了解服务端开发的一些特性,可以在以后的工作中,当我们前端与后台交互出现bug问题时,能够更快速的定位bug是出现在自己的客户端还是别人的服务端。
-
作为一名前端人员,如果对后台不了解,那么以后在与后台交互的开发中有可能明明是后台的问题,但是由于自身对后台的不了解再加上前期的经验不足,导致解决问题的时间增加(加班)。
-
-
3.了解服务端开发的过程,可以为以后的职业发展打下一定的基础(全栈工程师)
1.1.2-框架前置课
==圈重点== : vue框架能够正常开发的前提是你的电脑必须要安装node环境
-
1.nodejs作为vue框架之前的一个课程,在学习vue的过程中,需要使用nodejs相关的一些知识点。
-
2.学习nodejs有助于为后续框架课程打下良好的基础
1.2-什么是nodejs
-
1.Node.js官网地址:Node.js
-
1.Node.js 是一个构建于 Chrome V8引擎之上的一个Javascript 运行环境
-
Node
是
一个运行环境
,作用是让js拥有开发服务端的功能
-
-
2.nodejs的作用 : 使用js语言开发服务器
-
说人话: 做后台的,抢java和python饭碗
-
1.3-Node.js环境安装
1.3.1-如何确认当前电脑是否已经安装了Node环境
-
打开终端,输入
node -v
,如果能看到版本号则说明当前电脑已经安装Node环境,如果提示Node不是内部或外部命令
,则表示未安装-
一旦安装了node,则会自动一并安装
npm
-
1.3.2-npm介绍
-
1.npm
-
全称node package manager
-
官方推出的包管理工具
-
不需要额外安装,安装node之后自带
-
因为服务器不在国内,所以有时候安装特别慢,甚至无法成功
-
-
2.npm更改镜像源提升网速
-
打开终端执行命令修改镜像源
npm config set registry https://registry.npm.taobao.org/
-
查看当前npm得镜像源:
npm config list
-
==1.3-如何运行Node.js程序==
-
1.REPL:交互解释器
-
Node运行环境的另一种叫法,作用是解析执行js代码
-
用法
-
第一种方式:直接双击打开 node.exe,然后写js代码
-
第二种方式:
-
先在终端先执行node,进入node环境
-
然后写js代码
-
-
-
-
2.使用终端命令
node [js文件路径]
开始运行js文件-
(1)其实当我们在终端执行Node命令时,并不是我们终端去编译解释js代码,而是电脑会自动打开Node安装包中Node.exe应用程序来打开js文件
-
Node.exe是一个类似于终端的应用程序,没有界面(CLI程序:command-line interface,命令行界面)
-
Node.exe工作环境称之为REPL环境,也就是交互式解释器
-
-
(2)REPL才是真正解释执行我们js代码的解释器
-
node开发之友,当你的js文件发生变化的时候,nodemon会自动帮你启动node程序
-
3.nodemon
-
-
安装:
npm install -g nodemon
-
使用:
nodemon [js文件名]
-
1.4-服务端js与客户端js区别
-
1.客户端JS由三部分组成
-
ECMAScript:确定js的语法规范
-
DOM:js操作网页内容
-
BOM:js操作浏览器窗口
-
-
2.服务端JS只有ECMAScript
-
因为服务端是没有界面的
-
==在nodejs中使用dom与bom的api程序会报错==
-
-
1.5-nodejs模块化介绍
-
1.nodejs是一个渐进式框架, 我们后面要学习的vue框架也是渐进式框架
-
2.什么是渐进式框架呢 : 一个功能对应一个模块(js文件), 需要用的时候导入即可
-
说人话:
-
非渐进式框架 : 套餐, 一次性导入所有的功能。 无论是的项目用还是不用(浪费资源)
-
渐进式框架 : 自助餐。 吃什么用什么,不浪费。(节省资源)
-
-
02-fs模块
1.1-fs文件模块(读写文件)
1.1.1-readFile读取文件
//1.导入文件模块 const fs = require('fs') //2.读取文件 /** * 第一个参数:文件路径 * 第二个参数:编码格式 (可选参数,默认为buffer二进制) * 第三个参数:读取回调操作(异步操作) * err:如果读取成功,err为null, 否则读取失败(一般文件路径错误或者找不到文件) * data:读取到的数据 */ fs.readFile('./data/aaa.txt','utf-8',(err,data)=>{ if(err){ console.log(err) //抛出异常,throw的作用就是让node程序终止运行,方便调试 throw err }else{ console.log(data) } }) console.log('11111') //3.同步读取文件(了解即可,几乎不用,一般在异步的api后面加上Sync就是同步) let data = fs.readFileSync('./data/aaa.txt','utf-8') console.log(data) console.log('2222')
1.1.2-writeFile写入文件
//1.导入文件模块 const fs = require('fs') //2.写文件 /** * 第一个参数:文件路径 * 第二个参数:要写入的数据 * 第三个参数:文件编码 默认utf-8 * 第四个参数: 异步回调函数 * err: 如果成功,err为null.否则读取失败 */ fs.writeFile('./data/bbb.txt','黑马程序员','utf-8',(err)=>{ if(err){ throw err }else{ console.log('写入成功') } })
1.2-同步与异步区别(掌握)
-
1.同步会阻塞线程,异步不会
-
2.同步有序执行,异步无序执行
-
3.同步没有回调函数,异步有回调函数
//1.导入模块 const fs = require('fs') /*js从上往下解析代码流程 1.判断是同步还是异步 2.如果是同步,则立即执行 3.如果是异步,则不执行,而是放入事件循环中(Event Loop) 4.所有代码解析完毕之后,开始执行事件循环中的异步代码 */ /*异步操作 1.不会阻塞线程(性能高) 2.无序执行 3.有回调函数 */ //异步操作 // console.log('55555555'); // fs.readFile('./data/aaa.txt','utf8',(err,data)=>{ // console.log('1111111') // if(err){ // throw err // }else{ // // console.log(data) // } // }) // console.log('666666'); // fs.readFile('./data/aaa.txt','utf8',(err,data)=>{ // console.log('222222') // if(err){ // throw err // }else{ // // console.log(data) // } // }) // console.log('777777'); // fs.readFile('./data/aaa.txt','utf8',(err,data)=>{ // console.log('333333') // if(err){ // throw err // }else{ // // console.log(data) // } // }) // console.log('8888888') // fs.readFile('./data/aaa.txt','utf8',(err,data)=>{ // console.log('4444444') // if(err){ // throw err; // }else{ // // console.log(data) // } // }) //同步操作 /* 1.会阻塞线程(性能低) 2.有序执行 3.没有回调函数 */ let data1 = fs.readFileSync('./data/aaa.txt','utf8'); console.log(data1) console.log('11111') let data2 = fs.readFileSync('./data/aaa.txt','utf8'); console.log('22222') console.log(data2) let data3 = fs.readFileSync('./data/aaa.txt','utf8'); console.log('33333') console.log(data3) let data4 = fs.readFileSync('./data/aaa.txt','utf8'); console.log('44444') console.log(data4)
1.3-try-catch捕捉异常(了解)
//1.导入模块 const fs = require('fs') /* try-catch作用:捕捉代码异常,且不影响后面代码执行 try{ 需要执行的代码 }catch(err){ 如果try中的代码执行错误了,就会执行catch代码 }) */ try { let data1 = fs.readFileSync('./data/aaa.txt', 'utf8') console.log(data1) } catch (err) { console.log(err) } console.log('11111')
-
fs模块一些方法
API | 作用 |
---|---|
fs.access(path, callback) | 判断路径是否存在 |
fs.appendFile(file, data, callback) | 向文件中追加内容 |
fs.copyFile(src, callback) | 复制文件 |
fs.mkdir(path, callback) | 创建目录 |
fs.readDir(path, callback) | 读取目录列表 |
fs.rename(oldPath, newPath, callback) | 重命名文件/目录 |
fs.rmdir(path, callback) | 删除目录 |
fs.stat(path, callback) | 获取文件/目录信息 |
fs.unlink(path, callback) | 删除文件 |
fs.watch(filename, options) | 监视文件/目录 |
fs.watchFile(filename[, options], listener) | 监视文件 |
fs.existsSync(absolutePath) | 判断路径是否存在 |
03-path路径模块
1.1-nodejs中的相对路径介绍
-
node中的相对路径: ./ 不是相对于当前文件所在路径,而是相对于执行node命名的文件夹路径
在服务端开发中,一般不要使用相对路径,而使用绝对路径
-
解决方案:在nodejs中,每一个js文件都有两个全局属性,它可以帮助我们获取到文件的绝对路径
-
__filename:当前js文件所在目录的绝对路径
-
__dirmame:当前js文件的绝对路径
-
//1.导入文件模块 const fs = require('fs') //2.读取文件 /*a.注意点: node中的相对路径: ./ 不是相对于当前文件所在路径,而是相对于执行node命名的文件夹路径 在服务端开发中,一般不要使用相对路径,而使用绝对路径 b.解决方案:在nodejs中,每一个js文件都有两个全局属性,它可以帮助我们获取到文件的绝对路径 __filename:当前js文件所在目录的绝对路径 __filema,e:当前js文件的绝对路径 */ console.log(__dirname) console.log(__filename) /*2.如果想要获取当前文件夹下其他文件绝对路径,可以使用 __dirname属性来拼接 */ const path = __dirname + '/aaa.txt' console.log(path) fs.readFile(path,'utf-8',(err,data)=>{ if(err){ console.log(err); //抛出异常,throw的作用就是让node程序终止运行,方便调试 throw err }else{ console.log(data) } })
1.2-path路径模块拼接路径
//1.导入路径模块 const path = require('path') //2.合并路径 /*使用path模块拼接文件路径与 使用 '+'连接符拼接的好处 1.会自动帮我们正确添加路径分隔符 '/',我们无需手动添加 2.当我们路径格式拼接错误的时候,能自动帮我们转换正确的格式 */ // path.join(路径1,路径2,路径3,……………………) let filePath = path.join(__dirname,'aaa.txt') console.log(filePath) console.log(__dirname + '/aaa.txt') let path1 = path.join(__dirname,'bbb','ccc.txt') console.log(path1); //获取上级目录 path.dirname(文件路径) let path2 = path.dirname(path1) console.log(path2) let path3 = path.dirname(path2) console.log(path3) let path4 = path.dirname(path3) console.log(path4)
-
path模块一些方法
方法 | 作用 |
---|---|
path.basename(path[, ext]) | 获取返回 path 的最后一部分(文件名) |
path.dirname(path) | 返回目录名 |
path.extname(path) | 返回路径中文件的扩展名(包含.) |
path.format(pathObject) | 将一个对象格式化为一个路径字符串 |
path.join([...paths]) | 拼接路径 |
path.parse(path) | 把路径字符串解析成对象的格式 |
path.resolve([...paths]) | 基于当前工作目录拼接路径 |
04-http模块(搭建服务器)
1.1-http模块搭建服务器
//知识点回顾: 如何让你电脑成为服务器? 按照软件即可 //1.导入模块(安装软件) const http = require('http') //2.创建服务器(运行软件) /* 参数:回调函数 req: request 客户端请求对象 res:response 服务端响应对象 */ let server = http.createServer((req,res)=>{ //获取客户端请求路径 console.log(req.url) }) //3.启动服务器(开启软件的服务器功能) /*第一个参数:端口号 一般1000-60000之间 第二个参数:ip地址 默认不写 就是本地ip 第三个参数:成功回调 */ server.listen(3000,()=>{ console.log('服务器开启成功') })
1.2-响应客户端请求
/* WEB开发本质 请求 处理 响应 */ //1.导入模块 const http = require('http') //2.创建服务器 /* req:请求对象 负责处理客户端请求 res:响应对象 负责响应客户端请求 */ let server = http.createServer((req,res)=>{ //客户端每发送一个请求,这个函数都会执行一次(执行多次) console.log(req.url) //响应客户端数据 res.end('hello world') }) //3.启动服务器 server.listen(3000,()=>{ console.log('服务器开启成功') })
1.3-根据不同请求响应不同数据
//1.导入模块 const http = require('http'); //2.创建服务器 let server = http.createServer((req,res)=>{ console.log(req.url) //需求: 如果请求路径是/ ,响应 index 如果请求路径是/login,响应 登录页 if(req.url == '/'){ res.end('index.html') }else if(req.url == '/login'){ //设置响应头解决中文乱码问题: 响应头作用:告诉浏览器我返回给你的数据是什么类型 /*第一个参数:状态码 第二个:响应头 */ res.writeHead(200,{ 'Content-Type': 'text/plain;charset=utf-8'// text/plain 普通文本 }) res.end('登录页') }else{ res.end('404 not found') } }) //3.开启服务器 server.listen(3000,()=>{ console.log('服务器开启成功') })
1.4-http响应客户端HTML文件
//1.导入模块 const http = require('http') //文件模块 const fs = require('fs') //路径模块 const path = require('path') //2.创建服务器 let server = http.createServer((req,res)=>{ //需求: 如果请求路径是 / 返回首页html 如果是login返回登录html //1.获取客户端请求路径 let url = req.url //2.处理请求 //一般如果响应的是文件,不需要设置响应头,直接返回二进制数据。浏览器会自动识别数据类型并且加载 if(url == '/'){ //响应首页 fs.readFile(path.join(__dirname,'index.html'),(err,data)=>{ if(err){ throw err }else{ console.log(data) //3,将读取好的文件数据响应给客户端 res.end(data) } }) }else if(url == '/login'){ //响应登录页 fs.readFile(path.join(__dirname,'login.html'),(err,data)=>{ if(err){ throw err }else{ //3,将读取好的文件数据响应给客户端 res.end(data) } }) }else{ res.end('404 not found') } }) //3.开启服务器 server.listen(3000,()=>{ console.log('服务器开启成功') })