Node.js笔记01

1 Node.js简介

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js之父:Ryan Dahl(瑞安·达尔)

1.1 Node.js的组成

Node.js组成

1.2 Node.js的优点与不足

优点:
异步非阻塞的I/O,(I/O线程池)
适用于I/O密集型<请求容易分析且I/O操作多>,(不适用于cpu密集型<请求需要过多判断,分析>),
简单web交互模型

事件循环机制,
单线程,
跨平台

缺点
会形成回调地狱,回调函数嵌套太多、太深(俗称回调地狱)
单线程,处理不好CPU 密集型任务

与java服务器对比
java专人专用,解决高并发采用增加服务器数量建集群
Node.js始终一个人,给不同请求编号,解决高并发用的时回调

1.3 Node.js中函数的特点

1.Node中任何一个模块(js文件)都被一个外层函数所包裹

  • function (exports, require, module, __filename, __dirname) {}
  •   exports:用于支持CommonJs模块化规范的暴露语法
    
  •   require:用于支持CommonJs模块化规范的引入语法
    
  •   module:用于支持CommonJs模块化规范的暴露语法
    
  •   __filename:当前运行文件的绝对路径
    
  •   __dirname:当前运行文件所在文件夹的绝对路径
    

2.为什么要设计这个外层函数(这个外层函数有什么作用?)

  • 1).用于支持模块化语法
    
  • 2).隐藏服务器内部实现(从作用域角度去看)
    
//console.log(arguments.callee.toString()) //输出外层函数

//如何在一个函数体里,输出函数本身?
/*function demo() {
  console.log(arguments.callee.toString()) //输出demo函数
}*/

1.4 Node.js中的global


1.浏览器端,js由哪几部分组成?

  • 1.BOM ----> window 浏览器对象模型 -------- 很多的API(location,history)
  • 2.DOM ----> document 文档对象模型 ---------- 很多的API(对DOM的增删改查)
  • 3.ES规范 -------------------- ES5、ES6…

2.Node端,js由几部分组成?

  • 1.没有了BOM -----> 因为服务器不需要(服务端没有浏览器对象)
  • 2.没有了DOM -----> 因为没有浏览器窗口
  • 3.几乎包含了所有的ES规范
  • 4.没有了window,但是取而代之的是一个叫做global的全局变量。

3.global的一些常用属性
clearImmediate:清空立即执行函数
clearInterval:清除循环定时器
clearTimeout: 清除延迟定时器

setImmediate:设置立即执行函数
setInterval:设置循环定时器
setTimeout: 设置延迟定时器

在Node中禁止函数的this指向global,而是指向了一个空对象

console.log(this)
console.log(global)

1.5 Node.js中的事件循环机制


┌───────────────────────────────┐
┌─>│ timers │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ pending callbacks │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ idle, prepare │
│ └─────────────┬─────────────┘ ┌───────────────┐
│ ┌─────────────┴─────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └─────────────┬─────────────┘ │ data, etc. │
│ ┌─────────────┴─────────────┐ └───────────────┘
│ │ check │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
└──┤ close callbacks │
└───────────────────────────┘

  • 第一个阶段:timers(定时器阶段–setTimeout,setInterval)
    1.开始计时 对比浏览器的定时器管理模块
    2.执行定时器的回调

  • 第二个阶段:pending callbacks (系统阶段)

  • 第三个阶段:idle, prepare (准备阶段)

  • 第四个阶段:poll(轮询阶段,核心)
    —如果回调队列里有待执行的回调函数
    从回调队列中取出回调函数,同步执行(一个一个执行),直到回调队列为空了,或者达到系统最大限度。
    —如果回调队列为空
    —如果有设置过setImmediate
    进入下一个check阶段,目的:为了执行setImmediate所设置的回调。
    —如果未设置过setImmediate
    在此阶段停留,等待回调函数被插入回调队列。
    若定时器到点了,进入下一个check阶段,原因:为了走第五阶段,随后走第六阶段,随后第一阶段(最终目的)

  • 第五个阶段:check (专门用于执行setImmediate所设置的回调)

  • 第六个阶段:close callbacks (关闭回调阶段)

process.nextTick() ---- 用于设置立即执行函数(“VIP”-----能在任意阶段优先执行)

//延迟定时器
setTimeout(()=>{
  console.log('setTimeout所指定的回调函数执行了')
})

//立即执行函数(回调)
setImmediate(()=>{
   console.log('我是setImmediate指定的回调') 
})

主线程没东西,这俩先后不一定,大概率setTimeout

1.6 包和包管理器npm

npm—>cnpm(服务器)—>yarn(命令 facebook)

1.什么是包?
我们电脑上的文件夹,包含了某些特定的文件,符合了某些特定的结构,就是一个包。

2.一个标准的包,应该包含哪些内容?
1) package.json ------- 描述文件(包的 “说明书”,必须要有!!!)
2) bin -----------------可执行二进制文件
3) lib ---------------- 经过编译后的js代码
4) doc ---------------- 文档(说明文档、bug修复文档、版本变更记录文档)
5) test --------------- 一些测试报告

3.如何让一个普通文件夹变成一个包?
让这个文件夹拥有一个:package.json文件即可,且package.json里面的内容要合法。
执行命令:npm init
包名的要求:不能有中文、不能有大写字母、同时尽量不要以数字开头、不能与npm仓库上其他包同名。

4.npm与node的关系?(npm:node package manager)
安装node后自动安装npm(npm是node官方出的包管理器,专门用于管理包)

5.npm的常用命令?

  一、【搜索】:
        1.npm search xxxxx
        2.通过网址搜索:www.npmjs.com

  二、【安装】:(安装之前必须保证文件夹内有package.json,且里面的内容格式合法)

        1.npm install xxxxx --save   或   npm i xxxx -S   或   npm i xxxx
            备注:
            (1).局部安装完的第三方包,放在当前目录中node_modules这个文件夹里
            (2).安装完毕会自动产生一个package-lock.json(npm版本在5以后才有),里面缓存的是每个下载过的包的地址,目的是下次安装时速度快一些。
            (3).当安装完一个包,该包的名字会自动写入到package.json中的【dependencies(生产依赖)】里。npm5及之前版本要加上--save后缀才可以。

        2.npm install xxxxx --save-dev  或  npm i xxxxx -D  安装包并将该包写入到【devDependencies(开发依赖中)】
          备注:什么是生产依赖与开发依赖?

                1.只在开发时(写代码时)时才用到的库,就是开发依赖 ----- 例如:语法检查、压缩代码、扩展css前缀的包。
                2.在生产环境中(项目上线)不可缺少的,就是生产依赖 ------ 例如:jquery、bootStrap等等。
                3.注意:某些包即属于开发依赖,又属于生产依赖 -------例如:jquery。

        3.npm i xxxx -g  全局安装xxxx包(一般来说,带有指令集的包要进行全局安装,例如:browserify、babel等)
          全局安装的包,其指令到处可用,如果该包不带有指令,就无需全局安装。
          查看全局安装的位置:npm root -g

        4.npm i xxx@yyy :安装xxx包的yyy版本

        5.npm i :安装package.json中声明的所有包

  三、【移除】:
        npm remove xxxxx  在node_module中删除xxxx包,同时会删除该包在package.json中的声明

  四、【其他命令】:
        1.npm aduit fix :检测项目依赖中的一些问题,并且尝试着修复。

        2.npm view xxxxx versions :查看远程npm仓库中xxxx包的所有版本信息

        3.npm view xxxxx version :查看npm仓库中xxxx包的最新版本

        4.npm ls xxxx :查看我们所安装的xxxx包的版本

   五、【关于版本号的说明】:
        "^3.x.x" :锁定大版本,以后安装包的时候,保证包是3.x.x版本,x默认取最新的。
        "~3.1.x" :锁定小版本,以后安装包的时候,保证包是3.1.x版本,x默认取最新的。
        "3.1.1" :锁定完整版本,以后安装包的时候,保证包必须是3.1.1版本。

1.7 cnpm的简介与使用

1.国内使用npm存在的问题

  • 安装npm后,每次我们安装包时,我们的电脑都要和npm服务器进行对话,去npm仓库获取包。

  • npm默认的仓库地址为:http://registry.npmjs.org

  • 查看当前npm仓库地址命令:npm config get registry,提示如下图:
    Alt text

  • 因为npm的远程服务器在国外,所以有时候难免出现访问过慢,甚至无法访问的情况。

  • 为了解决这个问题,我们有以下几个解决办法

2.使用淘宝的cnpm代替npm

淘宝为我们搭建了一个国内的npm服务器,它目前是每隔10分钟将国外npm仓库的所有内容“搬运”回国内的服务器上,这样我们直接访问淘宝的国内服务器就可以了,它的地址是:https://registry.npm.taobao.org

** 使用方法:**

第一种:直接安装cnpm
安装淘宝提供的cnpm,并更改服务器地址为淘宝的国内地址,
命令:npm install -g cnpm --registry=https://registry.npm.taobao.org,以后安装直接采用cnpm替代npm
例如原生npm命令为:npm install uniq --save,cnpm命令为:cnpm install uniq --save

第二种:替换npm仓库地址为淘宝镜像地址(推荐)
命令:npm config set registry https://registry.npm.taobao.org
查看是否更改成功:npm config get registry,以后安装时,依然用npm命令,但是实际是从淘宝国内服务器下载的

1.8 yarn的简介与使用

Yarn发布于2016年10月,截至当前2019年1月,gitHub上的Start数量为:34.3k,已经超过npm很多了,
yarn使用本地缓存,有时甚至无需互联网连接就能安装本地已经缓存过的依赖项,安装方法:npm install -g yarn

特别注意!
由于yarn的全局安装位置与npm不同,所以要配置yarn的全局安装路径到环境变量中,否则全局安装的包不起作用。
具体操作如下:

安装yarn后分别执行 yarn global dir命令,yarn global bin命令。
将上述两步返回的路径配置到电脑环境变量中即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值