【个人笔记】《知了堂》node.js简介及创建应用
Node.js 究竟是什么?
Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。
Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?对,您没有看错,就是Javascript。对于只在客户机上使用 JavaScript 的程序员而言,服务器端 JavaScript 可能是一个新概念,但这个概念本身并非遥不可及,因此为何不能在服务器上使用客户机上使用的编程语言?
什么是 V8?V8 JavaScript 引擎是 Google 用于其 Chrome 浏览器的底层 JavaScript 引擎。实际上,JavaScript 引擎负责解释并执行代码。Google 使用 V8 创建了一个用 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。V8 JavaScript 引擎并不仅限于在一个浏览器中运行。因此,Node 实际上会使用 Google 编写的 V8 JavaScript 引擎,并将其重建为可在服务器上使用。
什么是回调?
回调是一种异步相当于一个函数。回调函数被调用在完成既定任务。Node大量使用了回调。Node所有的API写的都是支持回调的这样一种方式。例如,一个函数读取一个文件可能开始读取文件,并立即返回控制到执行环境 使得下一个指令可以马上被执行。一旦文件 I/O 完成,它会调用回调函数,同时传递回调函数,该文件作为参数的内容。因此不会有堵塞或等待文件I/O。这使得Node.js高度可扩展,因此可以处理大量的请求,而无需等待任何函数来返回结果
事件驱动
创建了服务器,并且向创建它的方法传递了一个函数。无论何时我们的服务器收到一个请求,这个函数就会被调用。我们不知道这件事情什么时候会发生,但是我们现在有了一个处理请求的地方:它就是我们传递过去的那个函数。至于它是被预先定义的函数还是匿名函数,就无关紧要了。这个就是传说中的 回调 。我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行 回调 。
Node.js特性
Node.js库的异步和事件驱动的API全部都是异步就是非阻塞。它主要是指基于Node.js的服务器不会等待API返回的数据。服务器移动到下一个API调用,Node.js发生的事件通知机制后有助于服务器获得从之前的API调用的响应。
非常快的内置谷歌Chrome的V8 JavaScript引擎,Node.js库代码执行是非常快的。
单线程但高度可扩展 - Node.js使用具有循环事件单线程模型。事件机制有助于服务器在一个非阻塞的方式响应并使得服务器高度可扩展,而不是创建线程限制来处理请求的传统服务器。
没有缓冲 - Node.js的应用从来不使用缓冲任何数据。这些应用只是输出数据在块中。
许可证协议 - Node.js 在 MIT 协议 下发布
阻塞非阻塞
同步/异步: 消息通知机制相关=>需要自己关注还是提供callback
阻塞/非阻塞:等待消息时的状态=>是否可以干别的事情
同步阻塞: 劫匪看着衰男把钱装好,不能干其他事情
同步非阻塞:劫匪自己也到处搜索宝贝,但是还要不时跑回来看看钱装好没有。
异步非阻塞:劫匪自己也到处搜索宝贝,衰男把钱装好了自动过来告诉劫匪好了
异步阻塞: 劫匪就在那里傻等着,也不用管钱是否装好,衰男把钱装好了自动过来告诉劫匪好了
我们需要通过它提过的一些支持的库自己编写,无法像Apache那样直接运行,V8引擎本身使用了一些最新的编译技术。这使得用Javascript这类脚本语言编写出来的代码运行速度获得了极大提升,又节省了开发成本。对性能的苛求是Node的一个关键因素。本质上就是为文件系统、数据库之类的资源提供接口。
阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。
例如:
我去买一本书,立即买到了,这就是非阻塞;
如果恰好书店没有,我就等一直等到书店有了这本书买到了才走,这就是阻塞;
模块化
正如我们买了一个智能手机那样,我们总是可以安装第三方软件来扩展手机的功能,听音乐,玩游戏,阅读等等。对于nodejs也是一样一样的。
本身nodejs相当一个平台,您也可以通过安装模块来扩展 Node 的功能。可用于 Node 的模块极大地 增强了这个产品,那些模块非常有用,将使用 Node 的开发人员通常会安装几个模块。因此,模块也就变得越来越重要,甚至成为整个产品的一个关键部分。
编写第一个node程序
代码示例:
// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
var server=http.createServer(function(){
console.log("服务器运行了");
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");
访问第一个服务器程序
1.Localhost:8888 本机
2.127.0.0.1:8888 本机
3.192.168.1.30:8888 其他用户
设置请求响应对象,并且响应给客户端数据
// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
var server=http.createServer(function(request,response){
console.log("服务器运行了");
// request请求对象,response响应对象
// console.log(request)
// 响应数据 ,返回之前要加上响应头信息
response.writeHead(200,{"content-type":"text/html;charset=utf-8"})
response.write("<h1>hello world</h1>");
// 响应结束
response.end();
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");
请求响应对象request,response
Node项目工程目录结构
1.app.js 服务器文件
2.Public(文件夹) 静态资源
3.routes (文件夹) 路由
4.views (文件夹) 视图文件
5.dist (文件夹) 上线后的资源
完整请求响应
// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
// 引入读文件的模块 fs
var fs=require("fs");
var server=http.createServer(function(request,response){
console.log("服务器运行了");
// request请求对象,response响应对象
// console.log(request)
// 响应数据 ,返回之前要加上响应头信息
// response.writeHead(200,{"content-type":"text/html;charset=utf-8"})
// response.write("<h1>hello world</h1>");
// 响应结束
// response.end(); // fs.readFile ("路径",编码,函数(错误,读到的数据){})
var newPath=request.url.split(".");
if(newPath[1]=="html"){
fs.readFile("public"+request.url,"utf-8",function(error,data){
// console.log(data)
if(error==null){
response.writeHead(200,{"content-type":"text/html;charset=utf-8"});
response.write(data);
response.end();
}
})
}else if(newPath[1]=="css"){
fs.readFile("public"+request.url,"utf-8",function(error,data){
// console.log(data)
if(error==null){
response.writeHead(200,{"content-type":"text/css;charset=utf-8"});
response.write(data);
response.end();
}
})
}else if(newPath[1]=="jpg"||newPath[1]=="gif"||newPath[1]=="png"){
fs.readFile("public"+request.url,function(error,data){
// console.log(data)
if(error==null){
response.writeHead(200,{"content-type":"image/"+newPath[1]});
response.write(data);
response.end();
}
})
}
console.log(newPath)
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");
Fs模块 文件解析模块
返回哪个页面,首先要知道用户请求的是什么网页,获得请求路径 两个方法获取请求路径,请求文件: 1.对象自带属性—URL属性:request.url 2.url模块:var mypath=require(“url”) 引入fs var myfs=require(“fs”) 通过fs读取 参数: 1.路径,2.字符串编码集,3.回调函数,读取完毕后调用的函数:成功or失败 myfs.readFile(“路径"+mypath,"utf-8",function(err,data){ response.writeHead(200,{"content-type":"text/html"}); response.write(data); response.end(); });
var fs =require(“fs”);//加载文件系统模块 fs.readFile(“路径"+mypath,“utf-8",function(err,data){ response.writeHead(200,{"content-type":"text/html"}); console.log(err); response.write(data); response.end(); });
【个人笔记】《知了堂》node.js简介及创建应用的更多相关文章
- 01 Node.js简介, 安装&配置
Node.js 简介 Node.js 是什么 Node.js 有着强大而灵活的包管理器(node package manager,npm) 目前, 已经有强大第三方工具模块, 例如数据库连接, 网站开 ...
- 《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- Node.js学习笔记(1) - Node.js简介
近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...
- node.js 简介
简介: Node,是一个可以让 JavaScript 运行在服务器端的平台.它可以让 JavaScript 脱离浏览器的束缚运行在一般的服务器环境下 Node.js 是一个为实时Web ...
- 写给Java开发者的Node.JS简介
前言 今天上推特看见这篇文章,点进去发现是新货. 正好最近想入Node的坑,又有一些Java基础,所以希望翻译出来给大家,同时也让自己加深理解. 才疏学浅,如有不妥之处请指正. 原文链接:Node f ...
- node.js在windows下的学习笔记(5)---用NODE.JS创建服务器和客户端
//引入http模块 var http = require('http'); //调用http的createServer的方法,这个方法有一个回调函数,这个回调数 //的作用是当有请求发送给服务器的时 ...
- [读书笔记]了不起的node.js+实践(一)
环境的变化带来了技术大跃进,机遇和挑战同时到来.基于我js也没有学,只好赶鸭子上架一起学了.(>﹏<) 1.先读读书 一开始就不知死活地看<深入浅出node.js>,弄得团团转 ...
- node.js入门系列(一)--Node.js简介
什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...
- Node.js学习(第一章:Node.js简介)
Node.js是什么? Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl 开发而成, 目前官网最新版本已经更新到 12.0.0版本,最新稳定的是10.15.3.Nod ...
随机推荐
- [日推荐] 『闲聊助手』人工智能小程序,仅此一款!-极乐商店store.dreawer.com
肾phone的siri有用过吗?小编无聊时就撩一下她!但有个问题就是要是没有肾phone在身边怎么撩???现在有伙伴@wx_Volcano_Li76 开发一款小程序,可以等同于siri,想什么时候撩就 ...
- opencv VideoCapture使用示例
在centos7下验证VideoCapture功能. 1 opencv处理视频时要使用ffmpeg,这里使用添加源的方式安装,分为3步 1.1 先安装EPEL Release,使用其他的repo源,所 ...
- Mysql 掌握要点
1. 引擎 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁. 行级锁和表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题. 1.1 I ...
- 面试题收集---grep和find的区别
grep是通过文件找内容 find 是通过内容找文件 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来. 而linux下的find, 在目录结构 ...
- 为Ext添加下拉框和日期组件
Ext.onReady(function(){ var config = { fields:['module'], data:[['新建'],['删除'],['增加']}; var store = n ...
- .NET CORE 学习笔记之安装EF【Microsoft.EntityFrameworkCore】扩展报错
最近在学习.NET CORE ,刚开始就遇到问题了. 安装EF框架的试试就报错, 报错如下: 错误 程序包还原失败.正在回滚“XXX”的程序包更改. 找了好久的方案,网上也没搜到对应的问题和方案,然而 ...
- JMockit使用总结
Jmockit可以做什么 使用JMockit API来mock被依赖的代码,从而进行隔离测试. 类级别整体mock和部分方法重写 实例级别整体mock和部分mock mock静态方法.私有变量.局部方 ...
- 手工删除crfclust.bdb文件
环境:RHEL 6.5 + Oracle 11.2.0.4 RAC 现象:巡检发现自己的测试环境节点2的空间使用率过高,进一步查询,发现大文件是GI目录下crfclust.bdb文件. crfclus ...
- keepalive之LVS-DR架构
author:JevonWei 版权声明:原创作品 Keepalive实战之LVS-DR 实验目的:构建LVS-DR架构,为了达到LVS的高可用目的,故在LVS-DR的Director端做Keepal ...
- Linq 实现sql中的not in和in条件查询
T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID in (1, 2) T-S ...