进击Node.js基础(一)
一.前言
1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境
2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等。
3:有很多借助NODE.JS完成的项目如appjs跨平台桌面应用,Jade和node.js组合使用便捷管理后台html模板,grunt自动化运行工具,express.js
4:nodejs.org,npmjs.com模块社区,github,stackoverflow
5:gitbash:类似cmd,但是可以执行git命令,高亮和封装好的系统命令比cmd好用
二:例子
1:官网例子
const http = require('http'); const hostname = '127.0.0.1';
const port = 3000; const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
}); server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
一个web服务器,仅需要传入一个匿名的回调函数,服务器创建成功后,代码并没有阻塞,而是继续执行,这就是事件驱动模型的编程风格,在nodejs中将会大量采用这种方式,在命令行中调用此js文件就开始监听了。
JS的执行环境:①浏览器,在浏览器中解析类似在console中运行。②nodejs环境。两者区别在于分别有一些特有的全局变量。
三.JS模块管理和COMMONJS规范
1:JS天生缺乏一套模块管理功能,只能人为规定命名空间从而保证代码的安全执行。
2:COMMONJS定义了一套JS编写规范,对于一个模块分成定义,标识,引用三个部分。
3:NODEJS借鉴了COMMONJS实现了一套模块管理系统NPM,每个模块中的内容不需要担心命名空间什么的。
4:模块的分类:核心模块,本地模块,通过NPM引入的第三方模块。
NODEJS中可以通过文件路径引用模块,模块名引用(如果引入的是非核心模块的话,NODE最终会把模块名映射到对应的路径;而核心模块会在NODE启动时预加载)。
5:简单的NODEJS模块
①使用exports.add = add;将模块内的方法暴露出去;
②使用
//student
function add(sty) {
console.log('ADD student'+sty);
} exports.add = add;
//teacher
function add(sty) {
console.log('ADD teacher'+sty);
} exports.add = add;
//class
var student = require('./student');
var teacher = require('./teacher'); function add(t,s){
teacher.add(t); s.forEach(function(item,index){
student.add(item);
});
} exports.add = add;
//index
var klass = require('./class'); klass.add('ffsama',['a','b']);
四.NODEJS API解析
1:URI侧重标识,URL侧重定位,URL是URI的子集
URL模块
urlAPI:①parse,format,resolve
url.parse('url');对url进行解析返回一个对象;
url.format('url.parse返回的对象')将对象解析成url;
url.resolve('a','b')将两段字符串合并解析成一个正确的url;
url.parse('url',false,false);第二个参数选择用来指定解析对象query属性是用url自身还是querystring这个模块。(默认使用url自身,即false),第三个参数是否//后面的作为host,并且以host为key加入到返回值中,默认是false。
2:queryString模块—var querystring = require('querystring');
①querystring.stringify(x,y,z);序列化
querystring.stringify({name:'ffsama',course['jade','node']},',')
//序列化结果如下
'name=ffsama,course=jade,course=node'
//y修改红色符号,z修改绿色等号
第一个参数是传入进行序列化的对象,第二个是序列化后两个属性的间隔符,第三个也是修改符号'
②querystring.parse('');反序列化
后面的参数用来设置序列化符号,保证正确解析。
③querystring.escape('');转义querystring.escape('');反转义
3:HTTP简介
http客户端发起请求,创建端口
http服务器在端口监听客户端请求
http服务器向客户端返回状态和内容
HTTP头+正文
当我们打开一个网页时发生了什么?
1:浏览器搜索自身的DNS缓存(在chrome中输入chrome://net-internals/#dns)
2:搜索操作系统自身的DNS缓存(如果浏览器中没有)
3:读取本地HOST文件
4:浏览器发起一个DNS的一个系统调用,一般由宽带运营商发起一个域名解析请求
①:运营商服务器查看本身缓存(若没有)
②:运营商服务器发起一个迭代DNS解析的请求,拿到结果IP返回操作系统内核同时缓存起来,操作系统把结果返回浏览器,浏览器拿到域名的IP地址
5:浏览器获得对应域名的IP地址后发起HTTP三次握手,建立起TCP/IP连接
6:TCP/IP建立起来后,浏览器就可以向服务器发送HTTP请求,比如用HTTP的GET方法请求一个根域里的一个域名。
7:服务器端接受到了这个请求,根据路径参数,经过后端的一些处理之后把处理后的结果的数据返回给浏览器。
8:浏览器拿到了内容后解析渲染页面。
请求方法
1:GET 获取
2:POST 提交
3:PUT 更新
4:DELETE 删除
5:HEAD 获取元信息
6:TRACE !@#!@#
7:OPTIONS !#!!@#!
状态码
1:100-199 用于指定客户端应相应的某些动作。
2:200-299 用于表示请求成功。
3:300-399 重定向状态码用来告诉浏览器客户端,它们访问的资源已被移动, Web服务器发送一个重定向状态码和一个可选的Location Header, 告诉客户端新的资源地址在哪。
4:400-499 用于指出客户端的错误。
5:500-599 用于支持服务器错误。
4:HTTP模块
支持更多特性,不缓冲请求和响应,处理流相关
同步和异步:同步是任务按顺序执行,后面等待前面任务执行。
单线程,多线程:一次谈一个女朋友/多个。
IO:文件,数据库的接口
阻塞,非阻塞:阻塞就是一直等待
Node.js - 回调概念 什么是回调?
回调是一种异步相当于一个函数。回调函数被调用在完成既定任务。Node大量使用了回调。Node所有的API写的都是支持回调的这样一种方式。例如,一个函数读取一个文件可能开始读取文件,并立即返回控制到执行环境 使得下一个指令可以马上被执行。一旦文件 I/O 完成,它会调用回调函数,同时传递回调函数,该文件作为参数的内容。因此不会有堵塞或等待文件I/O。这使得Node.js高度可扩展,因此可以处理大量的请求,而无需等待任何函数来返回结果。 阻塞代码示例
创建一个 txt 文件:test.txt 在 D:\>yiibai_worksp\nodejs 目录 Yiibai.Com
创建一个名为test.js 的js文件在 D:\>yiibai_worksp\nodejs var fs = require("fs");
var data = fs.readFileSync('test.txt');
console.log(data.toString());
console.log("Program Ended");
现在运行 test.js 看到的结果: D:\yiibai_worksp\nodejs>node test.js
验证输出结果: Yiibai.com
Program Ended
非阻塞代码示例
创建一个 txt 文件:test.txt 在 D:\>yiibai_worksp\nodejs 目录 Yiibai.Com
更新 test.js 的内容在目录D:\>yiibai_worksp\nodejs var fs = require("fs"); fs.readFile('test.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("Program Ended");
现在运行 test.js 看到的结果: D:\yiibai_worksp\nodejs> node test.js
验证输出 Program Ended
Yiibai.Com
反正对于单线程的nodejs来说,我们可以通过事件驱动,回调进行异步编程,达到非阻塞的效果。
HTTP源码解读:
//global和window的区别
JavaScript的运行需要JavaScript解释器,解释器运行的时候,会创建一个全局对象(Global Object)。 2.
浏览器中包含JavaScript解释器,是JavaScript的一个运行环境。
对于运行在浏览器中的Javascript ,这个全局对象就是window对象。(The Global Object is object window) 3.
除了在浏览器中运行,Javascript也可以运行在Node.js中。
在Node.js中,这个全局对象就是global对象。(The Global Object is object global)
Apache ab进行压力测试
HTTP爬虫
npm install cheerio 利用类似jquery的方法对爬到的数据进行处理
spilt("")里面可以填字符串!而不是字符
【插播小知识】select下拉框,点击按钮变成想要的选项用$().attr("select",false).attr("select",true);如果不先用false再用true的话只能使用一次。
5:事件events模块
Nodejs中不存在浏览器中的冒泡,捕获等行为
事件模块只暴露了eventemitter-包括了时间的发射和监听(一个时间最好不要超过十个监听器(即10个函数对应一个事件))
var EventEmitter = require('events').EventEmitter; var life = new EventEmitter();
//addEventListener和on可以替换使用
life.on('haha',function (who) {
console.log(who);
}); var tt = function(){
alert("tt");
} life.on('haha',tt); //事件解绑
life.removeListener('haha',tt);
//可以传递参数细化解绑的时间
life.removeAllListeners(); //触发事件
life.emit('haha','ff'); //获取绑定事件数量两种方法
life.listeners('haha').length;
EventEmitter.listenerCount(life,'haha');
6:HTTP-get/request(在NODEJS中get是对request的封装,所以get可以做的request也都可以完成)
http.request(options,[callback])
技术灌水!!!
进击Node.js基础(一)的更多相关文章
- 10慕课网《进击Node.js基础(一)》初识promise
首先用最简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</titl ...
- 进击Node.js基础(二)
一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...
- 07慕课网《进击Node.js基础(一)》HTTP小爬虫
获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...
- 03慕课网《进击Node.js基础(一)》API-URL网址解析
url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...
- 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
版本:偶数位为稳定版本,基数为非稳定版本 - 0.6.x - 0.7.x - 0.8.x -0.9.x -0.10.x -0.11.x 概念:Node.js采用谷歌浏览器的V8引擎,用C ...
- 02慕课网《进击Node.js基础(一)》——CommonJs标准
是一套规范管理模块 每个js 为一个模块,多个模块作为一个包 node.js和Couchdb是对其的实现: 不同于jQuery 模块:定义.标识.引用(地址/模块名称) 模块类型: 核心模块http ...
- 进击Node.js基础(二)promise
一.Promise—Promise似乎是ES6中的规范 PROMISE的语言标准,PROMISE/A+规范,如何使用,在什么场景下使用 Promise时JS对异步操作场景提出的解决方案(回调,观察者模 ...
- 04慕课网《进击Node.js基础(一)》HTTP讲解
HTTP:通信协议 流程概述: http客户端发起请求,创建端口默认8080 http服务器在端口监听客户端请求 http服务器向客户端返回状态和内容 稍微详细解析: 1.域名解析:浏览器搜素自身的D ...
- 11慕课网《进击Node.js基础(一)》Buffer和Stream
Buffer 用来保存原始数据 (logo.png) 以下代码读取logo.png为buffer类型 然后将buffer转化为string,新建png 可以将字符串配置: data:image/png ...
随机推荐
- Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美
Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...
- MongoDB之Java测试代码(DAO层)
MongoInit.java是数据库初始化及连接类 MongoUtils.java是对mongodb的各种操作方法 MongoInit.java package com.wlwcloud.datate ...
- MaterialDesign学习项目
概述 该项目主要用来学习Material Design Support Library和一些android其他技术,也借鉴了网上一些其他优秀的学习资源.该项目目前主要分为俩大部分(后期可能会有一些增加 ...
- SSH框架项目开发命名规范
SSH 框架项目开发命名规范 一.各层包及类命名规范 总体原则:包名所有字母小写,类名采用 "驼峰标识",具体如下: 1. Action 类 包命名规范:co ...
- C# 如何合并Excel工作表
文档合并.拆分是实现文档管理的一种有效方式.在工作中,我们可能会遇到需要将多个文档合并的情况,那如何来实现呢,本文将进一步介绍.关于拆分Excel工作表,可参见这篇文章--C#如何拆分EXCEL工作表 ...
- RHEL6 不重启扫描新添加硬盘
First find your host bus number grep mpt /sys/class/scsi_host/host?/proc_name Which should return a ...
- pyqt5 动画在QThread线程中无法运行问题
自己做了一个tcp工具,在学习动画的时候踩了坑,需求是根据上线变绿色,离线变灰色,如果连接断开了,则变为灰色 问题现象: 可以看到点击"连接","离线"的时候动 ...
- 使用 focus() 和 blur()
<html> <head> <style type="text/css"> a:active {color:green} </style& ...
- 温故而后知新——对ado.net中常用对象的一些解释
在使用ado.net连接数据库获取数据,一般的步骤是: 1.设置好web.config //用来设置服务器数据库的地址以及登录名密码 2.创建Connection对象 //用来创建访问数据 ...
- 关于Apple开发者的D-U-N-S Number
企业开发者需要这个信息,中文译名叫邓白氏编码,很多攻略给的那个申请地址已经失效,这个组织官方也有地址可以提交申请资料,不过得注册,苹果目前可用的地址是:https://developer.apple. ...