乐趣区

Node

尚硅谷 -Node.js 基础入门
一杯茶的时间,上手 Node.js

Node 简介

  1. Node 可以在后台编写服务

    • 进程
      进程负责为程序运行提供必要的环境
      进程就相当于工厂中的车间
    • 线程
      线程是计算机中最小的计算单位,线程负责执行进程中的程序
      线程就相当于工厂中的工人
    • 单线程
      js 是单线程
    • 多线程
      Java/Python 都是多线程语言
  2. 传统的服务器都是多线程的
    每进来一个请求,就创建一个线程去处理请求
  3. Node 服务器是单线程的
    Node 处理请求时是单线程,但是在后台拥有一个 I / O 线程池
  4. 特征
    异步、事件驱动、非阻塞 IO

模块化

  1. 在 node 中,一个 js 文件就是一个模块
  2. 在 node 中每一个 js 代码都是独立运行在一个函数中
    而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
    不要总是往全局中写东西,会污染全局作用域,污染全局命名空间,这种模块化的方式可以避免污染全局命名空间
  3. CommonJs 对模块的定义十分简单

    • 模块的引用 reuqire()
    • 模块的定义 创建一个 js 文件 export 添加属性或方法进行输出
    • 模块的标识

01.helloNode.j

// 引入其他模块
/*
    1、在 node 中,通过 require()函数引入外部模块
    2、require()可以传递一个文件的路径作为参数,node 将会自动根据该路径来引入外部模块
       这里的路劲,如果是相对路劲,必须以./ 或者 ../ 开头
    3、使用 require()引入一个模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
    4、我们使用 require()引入外部模块时,使用的就是模块标识,我们可以通过标识来找到指定的模块
       - 没看分为两大类
           核心模块
             - 由 node 引擎提供的模块
                 // var fs = require('fs');  console.log(fs)  // 文件模块 不用写路劲直接写名字就行
                 // var path = require('path');  // 路劲模块
                 // var http = require('http');  // 服务模块
             - 核心模块的标识就是模块的名字
           文件模块
             - 由用户自己创建的模块
             - 文件模块的标识就是文件的路径(绝对路径,相对路径)相对路径使用 ./ 或者 ../ 开头
*/
var md = require("./02.module.js");
console.log(md)

02.module.js

console.log('我是一个模块,我是 02.module.js');

/*
    我们可以通过 exports 来向外部暴露暴露变量和方法
        只需要将需要暴露给外部的变量或方法设置为 exports 的属性即可
*/
// 向外部暴露属性或者方法
export.x = "我是 02.module.js 中得 x";
export.y = "我是 02.module.js 中得 y";

包 package

  1. 包结构
    – package.json:描述文件,必须
    – bin:可执行二进制文件 这里边的文件都是可以直接在系统中运行的 // 一般不会有这个文件,除非是一些工具 webpack
    – lib:依赖的其他 js 代码,library(图书馆,库),非必须
    – doc:文档,非必须
    – test:单元测试,非必须
  2. 包规范

npm

  1. npm -v:查看 npm 版本
  2. npm version:查看所有模块的版本
  3. npm seaarch math:搜索 math 包
  4. npm init:初始化 package.json
  5. npm install math(npm i math):安装 math 包,安装包的时候是根据 package.json 来识别的,没有该文件的话不能识别这是一个包,就会全局安装
  6. npm remove math(npm r math):删除 math 包
  7. npm i math –save(npm i math -S):安装到生成依赖
  8. npm install:自动根据 package.json 中的依赖下载所有的包
  9. npm install math -g:全局安装包(全局安装的包一般都是一些工具)
  • 通过 npm 下载的包都放到 node_modules 文件夹中
    我们通过下载的包,直接通过包名引入即可 // var express = require(‘express’)
  • node 在使用模块名字引入模块时,他会首先在当前目录的 node_modules 中寻找是否含有该模块
    如果有则直接使用,如果没有则去上一层的 node_modules 中寻找
    如果有则直接使用,如果没有则在去上一层寻找,直到找到为止
    直到磁盘根目录中,如果依然没有找到,则报错

index.js 入口文件

var math = require('math');
console.log(math);  // 查看 math 包的所有方法

cnpm

淘宝镜像 https://developer.aliyun.com/…

npm install -g cnpm --registry=https://registry.npm.taobao.org

Buffer(缓冲区)

文档地址 http://nodejs.cn/api/buffer.html
视频地址 https://www.bilibili.com/vide…

  • 中间传送数据的容器 用来缓存二进制数据
    node 作为服务器,接受到的数据是二进制的所以要存到 buffer 中,给用户发送数据也是二进制,先存到 buffer 中然后在发送
  1. Buffer 的结构和数组很像,操作的方法也和数组类似,

    • js 的原生数组性能相对来说比较差,这也是 js 被其他语言诟病的一个原因
  2. 数组中不能存储:图片、MP3、视频(等这类二进制文件),而 Buffer 就是专门用来存储二进制数据的,而且性能比数组要好

    • 他的元素为 16 进制的两位数
    • 一个元素就表示内存中的一个字节。
    • 实际上 Buffer 中的内存不是通过 JavaScript 分配的,而是在底层通过 c ++ 申请的
    • 也就是我们可以直接通过 Buffer 来创建内存中的空间
  3. Buffer 是 node 中的一个核心对象,使用 Buffer 不需要引入模块,直接使用即可
  4. 在 Buffer 中存储的都是二进制数据、(计算机中所有的二进制数据在显示时都是以 16 进制显示的)

    • 数据最终呀发生给客户端,数据在传输过程中都是以二进制传输的
    • Buffer 中每一个元素的范围是从 00 – ff(16 进制) 0-255(10 进制)00000000-11111111(2 进制八个 0 到八个 1)
      计算机中一个 0 或者一个 1 我们称为 1 位(bit)
      8bit = 1byte(字节)
      1024kb = 1kb
      1024kb = 1mb
      1024mb = 1gb
      1024gb = 1tb
      字节是数据传输的最小单位

      buffer 中的一个元素,占用内存中的一个字节

  5. Buffer 一但确定大小,则不能改变,Buffer 实际上是对底层内存的直接操作,一但创建就在内存中开辟了一个固定大小的空间,如果增大的话,就需要开辟新的空间,内存地址就不连续了。性能极其不好,所有一但确定大小就不能改变

创建一个 buffer.js 文件 并运行下列代码

// 将一个字符串保存到 buffer 中
  var str = "Hello Buffer";   // 一个英文 1 个字节
  var str = "Hello 尚硅谷";    // 一个汉字 3 个字节 3 个汉字 9 个字节,在内存中总共占用 15 个字节
  var buf = Buffer.from(str);
    //console.log(buf);  //Buffer 实际上就是做了一件事把 str 转化成二进制数据来保存
    //console.log(buf.length);  // 占用内存的大小
    //console.log(buf.length);  // 字符串的长度


// 创建一个 10 个字节长度的 buffer
  //var buf2 = new Buffer(10);  //buffer 构造函数都是不推荐使用的
  
  var buf2 = Buffer.alloc(10);
    // 通过索引来操作 buf
    buf2[0] = 88;
    buf2[1] = 255;
    buf2[2] = 0xaa; // 设置 16 进制的 aa 前边要加 0x
    buf2[15] = 255;//buf2 长度为 10, 一但创建不能改变大小,所以设置也没用
    buf[3] = 556;  //566 转化成二进制是   
                   //1000101100 超过 8 位,只会保留后 8 位 
                   //  00101100(16 进制是 2c)//console.log(buf2);
    //console.log(buf2[2]); // 输出 170(0xaa 对应的 10 进制)只要数字在控制台输出一定是 10 进制
    // 只要是数字永远输出的都是 10 进制。转换成字符串,并传递 16 就可以输出对应的 16 进制了
    //console.log(bug2[2].toString(16));  

    //for(var i =0;i<buf2.length;i++){//    console.log(buf[i]);  // 输出的全部转化为 10 进制
    //}
    
    // 只分配空间不会将原有的数据清 0,可能会含有敏感数据,但是性能会更好
    var buf3 = Buffer.allocUnsafe(10);
    console.log(buf3); //<Buffer 18 1e 4a 00 00 00 00 00 00 00>
    
    var buf4 = Buffer.from("我是一段文本数据");
    console.log(buf4.toString());// 使用 toString 方法才能将字符串重新打印出来
退出移动版