• 进击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
    ');
    });
    
    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
    odejs 目录
    
    Yiibai.Com 
    创建一个名为test.js 的js文件在 D:>yiibai_worksp
    odejs
    
    var fs = require("fs");
    var data = fs.readFileSync('test.txt');
    console.log(data.toString());
    console.log("Program Ended");
    现在运行 test.js 看到的结果:
    
    D:yiibai_worksp
    odejs>node test.js
    验证输出结果:
    
    Yiibai.com
    Program Ended
    非阻塞代码示例
    创建一个 txt 文件:test.txt 在 D:>yiibai_worksp
    odejs 目录
    
    Yiibai.Com 
    更新 test.js 的内容在目录D:>yiibai_worksp
    odejs
    
    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
    odejs> 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])

    技术灌水!!!

  • 相关阅读:
    JDBC
    「题解」:串串香
    「题解」:树
    「题解」:最近公共祖先
    「题解」:集合论
    「题解」:位运算
    「题解」:序列
    「总结」浅谈主席树
    $My$ $template$(持续更新)
    「题解」:毛三琛
  • 原文地址:https://www.cnblogs.com/cndotabestdota/p/5751272.html
Copyright © 2020-2023  润新知