node学习基础

node特点

js运行时,非阻塞I/O,事件循环

模块导入导出

模块化

  • 导入 require('./xxx')
  • module.exports=xxx
index.js

module.exports = {
  name: 'zhangsan',
  age: 12,
}

导出
const a = require('./index');
console.log(a);

第二种

index.js

exports.msg = {
  name: 'zhangsan',
  age: 12,
}

导出
const {msg} = require('./index');
console.log(msg);

FS 文件的操作

const fs = require('fs');
//同步
fs.readFileSync
//异步的
 fs.readFile('./index.js', (err, data) => {
  console.log(data);
 });
//promise
  const {promisify} = require('util');
  const readFile = promisify(fs.readFile);
  readFile('./index.js').then(data=>{
    console.log(data);
  });
//v10.0
//fs promises API  实验的API(会报一个提示)
const {promises} = require('fs');
promises.readFile('./index.js').then(data => {
  console.log(data);
});
try{
  fs.access('./index.js') //找到这文件不报错,找不到就报错
}catch (e) {
  console.log(e);
}

流的交互

复制一个文件
const fs = require('fs');
const rs = fs.createReadStream('./index.js');
const ws = fs.createWriteStream('./index1.js');
rs.pipe(ws);

HTTP协议

http 是无状态的

跨域
域名协议端口不同
> 代理服务器
	proxy 代理
	cors 跨域资源共享
         * res.setHeader('Access-Control-Allow-Origin','http://localhost:3000')

CO

解决promise问题的   * yield   next
底层 express+koa中间件的原理

基础

global 可以直接访问global 并且没有window的概念 this(文件的打印)

浏览器: window 代理了 global this=>window

process 进程(当前运行的环境)

Buffer 读取的内容 都是二进制

process

process.cwd()
> 在哪执行文件,打印路径

process.env()
// webpack  开发环境(process.env.NODE_ENV)  生产环境

process.argv()
//命令行后面的 参数传入一个数组
process.nextTick()

node事件环

微任务的概念 (promise.then   process.nextTick())
timers  事件 setTimeout的回调
poll  轮询 i/O 回调  fs.readFile()
check  setInmediate 方法

> 默认 会从上到下一次执行,如果代码执行到poll(轮询,I/O,回调,fs.readFIle) 发现check阶段没有
  那就在poll中等待时间到达后在清空代码
  
  setTimeout(()=>{
  console.log('timoute');
    });
    console.log('start');
    process.nextTick(()=>{
      console.log('nextTick');
      setTimeout(()=>{
        console.log('timeout2');
      })
    });
结果start  nextTick timoute   timeout2

setImmediate(()=>{
  console.log(1);
});
setTimeout(()=>{
  console.log(2);
});
//2  ,1

let fs = require('fs');
fs.readFile('./index.js','utf8',()=>{
  setTimeout(()=>{
    console.log('1');
  });
  setImmediate(()=>{
    console.log(2);
  })
});
//2 ,1

切换队列,把队列清空,如果执行了很多个回调,超过了最大限制,也会切换队列

poll 阶段下一个阶段是check 如果check队列中用东西 会先执行check

事件环总结

setTimeout(()=>{
    console.log("我先走一步") 
})
setTimeout(()=>{
    console.log("老司机,等等我")
},10)
setImmediate(()=>{
    console.log("你太慢了,我插个队")
})
setTimeout和setImmediate,触发的阶段不同,因此callback执行时间也不同。但是如果setTimeout的时间过长,那么系统会先执行setImmediate,然后等下一轮询中,如果setTimeout到时间了,那么就运行setTimeout的callbacks。
/**
output:
我先走一步
你太慢了,我插个队
老司机,等等我
*/
Promise.resolve().then(()=>{
  console.log("总有一日,我会上位")
})
process.nextTick(()=>{
  console.log("本宫始终是你望成莫及的")
})
虽然process.nextTick和Promise都是微任务,但是他们的执行的先后顺序是不一样的。无论谁的代码先执行,等到了poll阶段,两者都是可运行的状态时,都是nextTick先于Promise执行。

global

exports   module  require  __dirname    __filename
node实现模块化(命名冲突,代码方便维护,方便协作)
浏览器中实现模块化 var obj={a}  不能完全解决命名冲突
//commonjs 规范 通过文件读取(utf8)  实现了模块化

vm

内置模块 模块 内置/核心 文件模块/自定义模块 第三方模块

let vm=require('vm'); //node中执行字符串  可以采用vm
//他可以提供一个沙箱环境,运行代码
vm.runInThisContext('console.log(hello)');

path

处理文件路径

path.join(__dirname,'a/b','d/c')  拼接起来
__dirname 当前文件所在文件夹的路径
__filename  当前文件的绝对路径

#############..........................................................................................................................................................................................................................................................................................................................................................................................................................

posted @ 2019-05-19 18:05  猫神甜辣酱  阅读(272)  评论(0编辑  收藏  举报