node学习笔记

一、准备(github地址)

什么是Javascript?

Javascript能做什么?

  • …..

浏览器中的Javascript可以做什么样?

  • 操作DOM(增删改查)
  • AJAX/跨域
  • BOM
  • ECMAScript

浏览器中的Javascript不可能做什么样?

  • 文本操作
  • 从未有过章程操作系统音讯
  • 是因为运行环境
编程语言的力量取决于?
  • 言语本身只是提供了定义变量、定义函数、定义类型、流程控制、循环结构等等的操作
  • 在于运行该语言的阳台(环境)
  • 对此js来说,常常说的JS实际是ES,大多数能力都是由浏览器的施行殷勤决定
  • BOM和DOM可以说是浏览器开放出来的接口
  • 譬如:Cordova中提供JS调用视频头,操作本地文件的API
  • Java既是言语也是平台
  • Java运行在Java虚拟机(跨操作系统)
  • PHP是语言也是阳台
  • C#语言,平台:.net framework
  • C#ECMAScript,可以运行在MONO那样的阳台
  • 因为有人必要将C#运作在Linux平台,所以出现了MONO
Javascript只好运行在浏览器中呢?
  • 不是
  • 能运行在哪里,取决于这几个条件有没有特定的阳台

node是什么?(Ryan Dahl)

  • Node是javascript运行于服务端的运作环境
  • 注意:是Node选拔了Javascript,不是Javascript发展出来一个Node
    ###Node的诞生
  • 二〇〇八年左右,随着AJAX的推广,WEB走向复杂化、系统化
  • 2009年九月赖安 Dahl想要成立一个轻量级,适应现代WEB开的平台
  • 二零零六年11月RyanDahl在GitHub中开源了早期版本,同年四月的JSConf就布署了NODE讲座
  • 二零一零年初Joyent公司援救,Ryan Dahl也加盟了改集团,专门负责NODE的开发
  • 二〇一一年十十7月在微软的支撑下登录Windows平台

Node在web中的用途

  • node开发的Application处理用户的有着请求和给用户的响应
  • 分发数据(调用NODE服务器接口,再去调用传统服务器)请求,渲染HTML页面

总括:Node是Javascript的运行条件(平台),不是一门语言,也不是Javascript的框架。

环境布置

  • 下载安装包
  • 设置进度

makdir .net->创制一个资源管理器无法制造的一对文件 node
–use_strict->必须是严峻形式

匿名函数自推行的办法:
  • (function(){console.log(1)})()
  • +function(){console.log(1)}()
  • !function(){console.log(1)}()

全局对象

  • global(等价于客户端javascript的window对象)
  • process.stdin->标准输入(采集用户的输入)
  • process.stdout.write()->标准输出接近console.log();
模板字符串“中档可以擅自换行
  • var msg=’hello’;
  • var a=1;
  • process.stdout.write(${msg} world);
  • process.stdout.write(${msg} world ${a});

Debug

  • vs code编辑器里面可以调剂
  • node debug XXX.js可以调节
  • node-inspector执行后打开127.0.0.1:8080页面调试(如:node-debug
    d.js此时会活动打开浏览器调试界面google)
  • devtool XXX.js也是调节有BUG

练习

  • ctrl+c终止当前经过
  • 简单易行的人际交互,怎样在控制台接收用户的输入,如:e.js

异步操作

  • 现实
  • 程序>1、setTimeout();2、$.ajax()

node中的异步操作

  • Node接纳Chrome
    V8引擎处理Javascript脚本,V8最大的特点就是单线程运行,四次只进行一个义务。
  • Node多量采纳异步操作(asynchronous
    operation),即任务不是立时执行,而是插在任务队列的尾部,等到前面的天职运行完结后再实施
  • 增进代码的熏陶能力

什么是I/O

  • I/O【input/output】
  • 可以知晓为从输入到输出之间的转化进程
  • 例如:敲键盘(输入),看到编辑器出现字符(输出)
  • 活动鼠标(输入),看到光标移动(输出)

回调函数的安排

  • 对于一个函数倘若急需定义一个回调函数:
    • 回调函数的一定作为参数的最终一个参数出现:1、function
      getFile(name,job,callback){}
    • 回调函数的率先个参数默许接收错误音讯,首个参数才是真的的回调数据(便于外面获取调用的一无所长情形);如:getFile(‘jason’,’coding’,function(error,data){if(error)
      throw error;console.log(data);});
  • Node统一约定
    • 强调错误优先,因为从此的操作一大半都是异步形式,无法通过try
      catch捕获格外,所以错误优先的回调函数第四个参数为上一步的错误音讯
非阻塞I/O–>其实就是Node的主导特性

事件驱动和非阻塞机制

  • Node平台将一个职责及其该任务的回调函数放到一个风浪循环连串中
  • 事件循环高效的保管系统池同时飞快执行每一个职务
  • 当职务执行到位之后活动咨询回调函数

非阻塞的优势

  • 加强代码的响应功用
  • 充裕利用单核CPU的优势
  • 革新I/O的不得预测带来的题材
  • 什么样提升一个人的工作效用
  • 只是:近年来半数以上都是多核CUP

异步回调的题目(相对于传统的代码)

  • 异步事件驱动的代码
  • 不错阅读
  • 科学调试
  • 毋庸置疑维护

进程和线程

1、进程(XXX.exe)
  • 每一个正值周转的应用程序称之为进度
  • 每一个应用程序至少有一个进程
  • 进程是用来给应用程序提供一个运转环境
  • 进程是操作系统为应用程序分配资源的一个单位
2、线程
  • 用来执行应用程序中的代码
  • 在一个进度之中,可以有多少个线程
  • 在一个线程内部,同事只可以做一件事
  • 并且传统的开发方式半数以上都是I/O阻塞的
  • 从而要求八线程来更好的选用硬件资源
  • 给人一种错觉:线程更多越好

二、模块化结构

  • Node完结的CommonJS规范,所以可以应用模块化的法子协会代码结构
  • Node接纳的模块化结果是比照CommonJS规范
  • 模块与公事是种种对应提到,即加载一个模块,实际上就是加载对应的一个模块文件

CommonJS规范概述

CommonJS模块的特性

  • 具有代码都运行在模块成效域,不会污染全局功能域
  • 模块可以频仍加载,然而只会在首次加载时运行一遍,然后运行结果就被缓存了,未来再加载,就径直读取缓存结果,要想让模块再度运行,必须清除缓存
  • 模块加载的依次,按照其在代码中出现的顺序

module对象

  • Node内部提供一个Module构建函数,所有模块都是Module的实例,属性如下:
    • module.id模块的识别符,经常是富含相对路径的模块文件名
    • module.filename模块定义的文本的相对路径
    • module.loaded重回一个布尔值,表示模块是还是不是业已完结加载
    • module.parent重返一个对象,表示调用该模块的模块
    • module.children重回一个数组,表示该模块要用到的其他模块
    • module.exports表示模块对外输出的值!
  • 载入一个模块就是构建一个Module实例

模块的定义

  • 一个新的JS文件就是一个模块
  • 一个过关的模块应该是有导出成员的,否则模块就失去了第一的含义
  • 模块内部是一个单独(封闭)的作用域,模块之间不会争持
  • 模块之间必须通过导出导入的措施一同
  • 导出方式:
    • exports.name=value;
    • module.exports={name:value};
  • 那时候就没要求在模块内部写自实施函数了!!
  • module.exports和exports
  • module.exports是用来为模块导出成员的接口
  • exports是指向module.exports的别名,相当于在模块起首的时候实施:var
    exports=module.exports;
  • 假定为module.exports赋值,就会切断从前双方的相关性
  • 最后模块的导出成员以module.exports为准

模块的分类

  • 文本模块:就是大家团结一心写的效率模块文件
  • 主导模块:Node平台自带的一套基本的作用模块,也有人称之为Node平台的API
  • 其三方模块:社区或第三方个人支出好的功用模块,可以平昔拿来用

模块化开发的流程

  • 成立模块:new some.js
  • 导出成员:module.exports={}
  • 载入模块:var some=require(‘./some.js’);
  • 应用模块:some.add(1,2);

模块内全局环境(伪)

  • 大家今后的文本操作中必须使用相对路径
  • __dirname:用于获取当前文件所在目录的完全路径,在REPL环境无效
  • __filename:用来获取当前文件的总体路径,在REPL环境一致不行
  • module:模块对象
  • exports:映射到module.exports的别名
  • require():require.cache、require.extensions、require.main、require.resolve()

勤学苦练:命令行下的总结器,c.js和e.js

  • c.js里是非模块化的
  • e.js是模块化的(CommonJS规范)
  • module.exports={a,b,c};ES6的’自动属性’

模块的载入:require函数简介

  • node使用CommonJS模块规范,内置的require函数用于加载模块的文件
  • require的基本成效是:读取并实施一个javascript文件,然后回到该模块的exports对象
  • 比方没有发现指定的模块会报错!

require伸张名:规则>描述的越详细越规范,类似CSS的接纳器优先级

  • require加载文件时方可简单增加名:require(‘./module1’)
    • 那会儿会默许先找require(‘./module1.js’);
    • 假诺默许的.js文件不存在接下来会三番五次默许找require(‘./module1.json’);

加载文件规则

  • 由此”./”或”../”初叶:则按照相对路径熊当前文件所在文件夹起来物色模块:require(‘../xxx.js’)>上级目录下找xxx.js文件;
  • 经过/开头:则以种类根目录初叶摸索模块:require(‘/Users/xxx/Documents/sss.js’)>以相对路径的点子找,无意义!;
  • 假若参数字符串不以”./”或者”/”伊始,则代表加载的是一个默许提供的骨干模块(位于Node的种类安装目录中):require(‘fs’)、require(‘http’)、require(‘path’)等等;
  • 或者从当前目录向上搜索node_modules目录中的文件:require(‘my_module’)>各级node_modules夹中搜索my_nodule.js文件;
  • 若是require传入的是一个目录的门径,会活动查看该目录的package.json文件,然后加载main字段指定的入口文件
  • 倘使package.json文件并未main字段,或者根本就没有package.json文件,则默许找目录下的index.js文件作为模块:require(‘./filesModule’)>当前目录下找filesModule目录中的index.js文件;

注意require(‘filename’):

  • 加载的模块名字只要跟系统的模块冲突,系统的优先级最高!
  • 左右原则去找node_modules文件夹下的filename文件

require的完结机制:自定义的的$require,g.js和模块module2.js

  • 将盛传的模块的ID通过加载规则找到相应的模块文件
  • 读取那几个文件之中的代码
  • 由此拼接的方法为该段代码构建私有空间
  • 履行该代码
  • 拿到module.exports返回

__dirname与__filename:如f.js

  • __dirname当前文件所在目录的共同体路径
  • __filename当前文件的完整路径 ###思想与训练:
  • 1、怎么样定义和导入模块?
  • 2、如何利用模块化的办法协会代码结构?
  • 3、载入模块的条条框框
  • 4、精晓模块的加载机制
  • 5、自定义一个$require类似require,如$require下边的:index.js

模块的缓存:如h.js

  • 率先次加载某个模块时,Node会缓存该模块,以后再加载该模块就径直从缓存取出该模块的module.exports属性(不会另行实施该模块);
  • 假若须要频仍执行模块中的代码,一般可以让模块暴光行为(函数)
  • 模块的缓存可以因此require.cache得到,同样也足以去除

缓存是什么样落实(如:i.js)

何以删除缓存(如:i.js),一般不会删除缓存

  • 缓存require.cache ##

三、Node:主旨模块、文件操作、文件流、网络操作

1、宗旨模块

  • 中央模块的含义:

    • 假如只是在服务器运行javascript代码,意义不大,因为不可能已毕其余效用(读写文件,访问网络)
    • Node的用途在于它自己还提供的一密密麻麻效率模块,用于操作系统运动
    • 这几个要旨的功用模块在Node中的内置
  • 内置的有如下模块

    • path:处理公事路径
    • fs:操作文件系统
    • child_process:新建子进程
    • util:提供部分列实用的小工具
    • http:提供HTTP服务器作用
    • url:用于解析URL
    • querystring:解析URL中的查询字符串
    • crypto:提供加密和平解决密功用(MD5是不可逆,不能解密!!)
    • 其他

Node Package

由于Node是一套轻内核的平台,即使提供了一名目繁多的放到模块,不过不足以满意开发者的急需,于是应运而生了包(Package)的定义。与基本模块类似,就是讲一些预先设计好的效用依然API封装到一个文件夹,提需求开发者使用

1):包的加载机制
  • 与内置模块相同,同样选拔require方法,如:const
    express=require(‘express’);
  • 加载机制也和停放模块加载机制一样
  • 加载注意事项:
    • 先在系统焦点(优先级最高)的模块中找
    • 然后再到近来项目中的:node_mocules目录中去找
2):怎样管理好和谐的包
  • 出于Node本身并从未太多的成效性API。所以市面上涌现出大批量的第三方人士付出出来的Package
  • 包的生态圈一旦繁荣起来,就务须有工具去顶替人脑或者文档的不二法门去管理
  • 此时NPM诞生了~

NPM(Node Package Manager)

  • 随着年华的上进,NPM出现了两层概念:
    • 一层韩式是Node的开放式模块登记和管制连串,也可以说是一个生态圈,一个社区
    • 另一层含义是Node默许的模块管理器,是一个限令行下的软件,用来设置和管理Node模块
  • 合法地址:https://www.npmjs.com/
  • 境内加速镜像地址:https://npm.taobao.org/
1):安装NPM
  • NPM不需求独自安装,默许在设置Node的时候会自行同步安装NPM
  • 但是Node附带的NPM可能不是流行版本,最好用下边的指令更新到新型版本:$
    npm install npm -g
  • 默许安装到眼前系统Node所在的目录下
  • 是因为事先使用NVM的艺术安装的Node所以需求重新配置NPM全局目录
2):配置NPM的大局目录?
  • npm config set prefix [filepath]
  • 将NPM目录配置到别的目录时,必须将该目录放到环境变量中,否则不可以在大局使用
3):NPM常用命令->https://docs.npmjs.com/
  • npm config [ls|list|set|get] [name] [value]
  • npm init [–yes|-y]
  • npm search [name]
  • npm info [name]
  • npm install [–global|-g] [name]
  • npm uninstall [–global|-g] [name]
  • npm list [–global|-g]
  • npm outdated [–global|-g]
  • npm update [–global|-g] [name]
  • npm run [task]
  • npm cache [clean]

2、文件操作(important)

Node内核提供了累累与公事操作相关的模块,每个模块都提供了部分最基本的操作API,在NPM中也有社区提供的成效包

fs:
  • 基本功的公文操作API ######path:
  • 提供和路径相关的操作API ######readline:
  • 用于读取大文本文件,一行一行读 ######fs-extra:(第三方)
  • https://www.npmjs.com/package/fs-extra

1):同步如故异步调用(如:day03/code/02.js)

  • fs模块对文本的大概所有操作都有联袂和异步两种样式
    • readFile()
    • readFileSync()
  • 区别:
    • 一头调用会阻塞代码的实践,异步则不会
    • 异步调用会将读取职务下完结职分队列,直到义务履行到位才会回调
    • 非凡处理地点,同步必须采用 try catch
      形式,异步可以经过回调函数的首先个参数
    • 一起比异步尤其用度时间

2):路径模块

在文书操作中,都无法不选取物理路径(相对路径),path模块提供了部分列与路径相关的API

3):什么是缓冲区

  • 缓冲区就是内存中操作数据的器皿
  • 只是数额的器皿而已
  • 通过缓冲区可以很便宜的操作二进制数据
  • 再者在大文件操作时务必有缓冲区
比方读取文件没有点名编码的话,默许读取的是一个Buffer(缓冲区)
  • Buffer的功能,对大家脚下的情景的话只很少使用处境
    • 将图纸转成BASE64编码(code/04.js)
    • 对文字举行BASE64编码

4):为啥要有缓冲区

  • JS是相比较擅长处理字符串,但是早起的利用场景紧要用以拍卖HTML文档,不会有太大批次的数量处理,也不会接触到二进制的数目
  • 而在Node中操作数据、网络通讯是不可以完全以字符串的不二法门操作的
  • 所以在Node中引入了一个二进制的缓冲区的落成:Buffer
  • buf.toString([encoding[, start[,
    end]]])那里也足以安装编码:如code/03.js