Nodejs
学Node本质不是在学node,是在学服务器(web后台)编程
大前端时代:JavaScript语言也可以运行在服务器端
使用JavaScript这门语言也可以进行服务器编程
JavaScript通过node.js运行在服务器端
简单说nodejs就是运行在服务器端的JavaScript,利用JavaScript在服务端进行编程
node.js就是事件驱动、非阻塞I/O模型
nodejs开发的构成就成利用npm开发的社区提供的大量的第三方包加上基本的ECMAScript脚本语言以及node平台提供的一系列编程接口进行编程。
JavaScript语言本身是指ECMAScript,语言本身不包含BOM、DOM,BOM、DOM是浏览器环境给JavaScript提供的编程接口对象,理论上DOM、window都是属于BOM。
浏览器都有引擎,最少两个,一个是渲染引擎,一个是JavaScript解析执行引擎。
V8引擎就是专门用来解析和执行JavaScript代码的。
在所有浏览器中,Google chroome的V8引擎是最快的js脚本代码解析执行引擎。性能非常好
以前的JavaScript就是只能在浏览器里运行,包含ECMAScript和BOM浏览器的东西。
node不是一门新语言,他只是把chrome V8引擎移植到自己的环境当中,在这个环境之上构建了一系列的底层API,给ECMAScript提供了一些特定环境的编程接口。
I/O:输入与输出,例如在地址栏输入地址(输入),回车,到对应的网页(输出)。
npm托管了大概500000个包,都是JavaScript相关的,没有其他语言的东西。
只要是有规律的事情,都可以利用程序完成。
输入命令,会找到node.exe可执行文件进行解析、执行。为什么在哪里输入命令都会解析执行,原因就是环境变量。环境变量中配置path属性,找到node.exe所属目录,不包含配置文件名,把可执行文件的所属目录的绝对路径复制出来。为什么node安装完之后就可以随处在任何地方都可以使用的原因就是node安装自动配置了path环境变量。哈哈!!否则node命令是使用不了的。
node专注于运行在服务端,浏览器是没有对文件读写的能力的,但是node有,他们不是一个东西
在操作系统中,文件一切都是二进制0、1,需要toString
或者是这样也可以:
服务器就做3件事:
1.接收请求
2.处理请求
3.发送响应
node非常强大,代码本身就能开启一个服务器
什么是请求路径:主机名+端口号,/之后的是请求路径,例如:localhost:8080/ ,请求路径就是/,例如:localhost:8080/index.html ,请求路径就是index.html
IP地址就使用来定位一台计算机的,端口号是用来做什么?每个计算机网卡只有一个,你发了请求,对方的计算机就会收到数据,一个机器上会有好多联网的程序,一个网卡收到的数据,这个数据到底给谁,所以,端口号就是用来指定某个应用程序的。
如何根据不同的请求处理不同的响应?
一切资源对于服务器端来说都需要请求
学服务器端,一定要深刻的认识到路径只是一个标识而已,路径不一定就是能找到真实资源文件,服务端(后端)可能会根据这个标识然后去做处理
静态资源也是经过设计,前后台在一起的项目,路径不是说你想怎么引就怎么引的,后台会告诉你,你的静态资源往哪放,你请求的时候以什么开头。一定是牢牢地经过后台控制的。
判断访问资源是不是路径开头是不是/static,一定要记得结束响应,也就是res.end();
路由就是根据不同的请求做不同的处理,做分发,分发了配置请求的处理,称之为URL路由。
1.node.js组成:谷歌浏览器的V8引擎、C++语言编写的,本质上是一个JavaScript的运行环境。提到js,就能想到浏览器里面的各种交互组件,异步请求等等,它们依靠浏览器 JavaScript 的引擎,来解析页面的js代码。
2.目前流行的后端语言就是PHP、Java、.Net,使用后端语言实现服务器上的开发叫做后端技术。
3.nodejs就是让JavaScript(js)可以实现服务器上的开发。
4.JavaScript(前端语言)+nodejs(JavaScript的运行环境)=实现服务器上的开发(后端技术),也就是说js+nodejs实现了后端开发的技术
入口文件app.js:
var http = require('http'); var fs = require('fs'); var server = http.createServer(); server.on('request',function (req,res) { var url = req.url; if (url === '/') { res.writeHead(200,{ 'Content-Type':'text/html' }); fs.readFile('./views/index.html','utf-8',function (err,data) { if (err) { res.writeHead(404); res.end(); } res.end(data); }); } else if(url.startsWith('/static')){ var staticFilePath = '.' + url; fs.readFile(staticFilePath,function (err,data) { if (err) { res.writeHead(404); res.end(); } res.end(data); }); } else if(url === '/submit'){ res.writeHead(200,{ 'Content-Type':'text/html' }); fs.readFile('./views/submit.html','utf-8',function (err,data) { if (err) { res.writeHead(404); res.end(); } res.end(data); }); } else if(url === '/favicon.ico'){ fs.readFile('./static/img/favicon.ico',function (err,data) { if (err) { res.writeHead(404); res.end(); } res.end(data); }); }else{ res.writeHead(404); res.end('404 Not Found.'); } }); server.listen(3000,function () { console.log('Server is running at port 3000'); });
访问静态资源文件:
<link rel="stylesheet" type="text/css" href="static/css/news.css"> <img src="static/img/y18.gif" width="18" height="18" style="border:1px white solid;"> <a href="submit">submit</a>
整体项目目录结构:
nodejs和浏览器执行环境的不同之处:在控制台输入window,
在node中输入window,是没有的,宿主环境是不一样的。但是有些方法是node有,浏览器没有的,比如process
commonjs
变量被覆盖、方法被重写,JavaScript天生缺少模块管理机制
nodejs是commonjs的产物。
路径结合参数,拿到需要的内容。
querystring序列化参数:
反序列化:
转义和反转义字符:
HTTP
资源加载过程中每个阶段所要耗费的时间,Timing(时间线)
stalled:等待时间,浏览器发出这个请求到这个请求可以发出的等待时间,一般是代理协商,比如配置的脚本,以及要等待可复用的TCP连接释放的时间,不包含DNS查询和建立TCP连接的时间
request sent:请求的第一个字节发出以前到最后一个字节的发出后的时间,可以理解为是请求时间或者上传时间
waiting:请求发出以后到收到响应的第一个字节所花费的时间
content download:收到响应的第一个字节开始到接受完最后一个字节所花费的时间,也就是下载时间
通过分析Timing,就可以找到网页慢的瓶颈是在哪。
Remote Address:远端服务器地址,域名解析后的结果
HTTP1.1里面一共定义了8种方法,以不同的方式操作指定的资源
GET:获取或读取数据
POST:向指定的资源提交数据
PUT:更新,向指定资源位置提交新的内容,比如更新用户的头像,或者是替换掉线上已有的视频
DELETE:删除,请求服务器删除我们标识的某个资源
HEAD:和GET方法一样的,向服务器发出指定资源的请求,好处就是,不用发送全部的内容,就可以获取源信息或者源数据
状态码:1xx,指示信息,表示请求已经接受了,继续处理
2xx,标识请求已经成功处理掉了
3xx,请求重定向
4xx,客户端错误了,请求的时候有语法错误,或者说请求无法实现
5xx,服务器端错误,服务器无法完成合法的请求
- 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
- 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
- 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
- 204 NO CONTENT - [DELETE]:用户删除数据成功。
- 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
- 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
- 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
- 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
- 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
- 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
- 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
同步就是执行一个任务,后一个任务等待前一个任务结束在执行,程序的执行顺序与任务的排列顺序是一致的
什么是I/O,数据的进和出