node是什么?
- Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台的JavaScript运行环境
- Node采用Google开发的V8引擎来运行Js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模
node服务常用命令小记
1、项目热启动方式:
nodejs模块化
global属性
在node中有个全局对象global,它的作用和网页中的window类似,在全局中创建的变量都会作为global的属性保存
在全局中创建的函数都会作为global的方法保存
nodejs的模块
本质上上是一个函数。函数具有属性arguments。我们可以通过arguments.callee来查看函数体内容
//定义一个最简单的模块,我们打印看看结果a = 10;console.log(global.a);console.log(arguments.callee+'');
输出结果如下:
function (exports, require, module, __filename, __dirname) {// 当用var修饰时,变量就不是全局变量a = 10;console.log(global.a);console.log(arguments.callee+'');}
因为模块中的代码都是包装到了一个函数里,所以里面的变量都是局部变量
分析一下参数的含义
- exports
该对象用来将变量或函数暴露到外部 - require
函数,用来引入外部的模块 - module
- module代表的是当前模块本身
- exports就是module的属性
- 既可以用exports导出,也可以使用module.exports导出 - __filename
- 代表的是当前文件路径 - __dirname
- 代表的是当前文件夹路径
数据类新和存储位置
1、基本数据类型
常用的有:String、Number、Boolean、Null、Undefined
基本数据类型存放在栈内存中
2、引用数据类型
常用的有:Object、Array、Function
NodeJs包
包结构
包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:
- package.json 描述文件,必须有
- bin 可执行二进制文件
- lib js代码
- doc 文档
- test 单元测试npm(Node Package Manager)
包管理工具
- npm命令
- npm -v 查看npm的版本
- npm version 查看所有模块的版本
- npm search 包名 搜索包
- npm install/i 包名 安装包
- npm remove/r 包名 删除包
- npm install 包名 —save 安装包并添加到依赖中
- npm install 下载当前项目所依赖的包
- npm install 包名 -g 全局安装包 - node_modules文件夹
- node在使用模块名字来引入模块时,它首先在当前目录的node_modules中寻找是否含有该模块
如果有则直接使用,如果没有则取上一级目录的node_modules中寻找
反复向上一级查找node_modules直到找到为止,如果一直到磁盘根目录都没找到,则报错buffer缓冲区
async await处理异步
1、let,const是一个块级作用域
2、箭头函数
setTimeout(function(){console.log('信息')},1000)//箭头函数简写形式setTimeout( () => {console.log('信息')},1000)
3、promise的使用
function getData(){setTimeout( () => {var name = '张三'},1000)return name}console.log(getData())//这是控制台会报错//当修改成如下代码时function getData(){setTimeout( () => {var name = '张三'return name},1000)}console.log(getData())//控制台会显示undefined,主要是因为异步引起的,当遇到{}时调用就会结束,但这时因为定时任务并没有结束,所以没有返回值//解决方法:通过回调函数获取数据function getData(callbck){setTimeout( () => {var name = '张三'callbck(name)},1000)}//将callbck当做函数传递进去,然后得到想要的数据getData(function(parm){console.log(parm)})//用promise解决异步问题的方法//resolve执行成功的回调函数,reject执行失败的回调函数var p = new Promise(function(resolve,reject) => {setTimeout( () => {var name = '张三'resolve(name)},1000);})//获取数据p.then(function(data){console.log(data)})//将promise中的function进行封装function getData(resolve,reject){setTimeout( () => {var name = '张三'resolve(name)},1000);}var p = new Promise(getData)p.then((data) => {console.log(data)})
3、async await 的含义
async是异步的简写,await是async 和 wait的简写。所以可以理解为async用于申明一个异步的function,而await用于等待一个异步方法执行完成
async:让一个方法变成异步
await:等待异步方法执行完成
4、JavaScript为什么要有异步方法?
因为js是单线程,同一时间只能做同一件事,当遇到等待就会卡住,而异步不会阻塞代码执行,可以提高效率
5、async和await的使用
//先看代码async function test(){console.log('你好zce');return '返回值'}console.log( test() );//我们返回的是一个Promise对象//如果想拿到字符串我们该怎么做呢?async function test(){return '返回值'}// console.log( await test() )//会报错:因为await只能在异步方法里面使用async function get(){//注意await必需用在异步方法里面console.log(await test())}get()
Promise的原理
1、promise状态、结果、参数
Promise是一个构造函数,通过new 关键字实例化对象
语法:
new Promise((resolve,reject)=>{})
3、Promise的状态
- 第一种状态:pending(准备,待解决,进行中)
- 第二种状态:fulfilled(已完成,成功)
- 第三种状态:rejected(已拒绝,失败)
4、promise状态的改变
const p = new Promise((resolve,reject) => {resolve() //调用resolve将Promise状态改成fulfilledreject() //调用reject将状态改成rejected,但是因为状态只能改变一次,所以这个改变不起作用})console.dir(p)
promise的状态的改变是一次性的,也就是说resolve()和reject()函数只能选择一个进行执行
5、promise的结果的改变
const p = new Promise((resolve,reject) => {resolve('resolve传递参数了') //调用resolve将Promise状态改成fulfilled//resolve传递参数改变结果})
6、promise的方法
- then方法
- then方法传递两个参数,两个参数都是函数。当调用成功时,执行第一个函数,当调用失败时执行第二个函数 ```javascript const p = new Promise((resolve,reject) => { resolve(‘resolve传递参数了’) //调用resolve将Promise状态改成fulfilled //resolve传递参数改变结果 }) p.then(()=>{ //当promise的state是fulfilled时会被调用 console.log(‘调用成功了’) },()=>{ //当promise的state是rejected时会被调用 console.log(‘调用失败了了’) })
const p = new Promise((resolve,reject) => { // resolve(‘调用改变状态成fulfilled’) reject(‘调用改变状态成rejected’) })
console.log(p); p.then( (value) => { //传递的参数value就是fulfilled时传递的参数 console.log(‘state=fulfilled时调用’,value); },(reason) => { //传递的参数value就是rejected时传递的参数 console.log(‘state = rejected时调用’,reason); })
- then的返回值<br />- then方法的返回值是一个新的promise实例<br />- 在控制台设置断点进行调试就可以看到t的pending初始状态和基本信息<br />```javascriptconst t= p.then( (value) => {//传递的参数value就是fulfilled时传递的参数console.log('state=fulfilled时调用',value);},(reason) => {//传递的参数value就是rejected时传递的参数console.log('state = rejected时调用',reason);})console.dir(t)
