Node.js初学笔记

Node.js简介

node.js是构建在Chrome v8 引擎上的一个javascript 运行环境

node和Chrome一样都是基于事件驱动的异步架构!Chrome是基于事件的交互,而node是基于事件的I/O;

node没有HTML、Webkit和显卡驱动等UI技术支持;

运行使用nodejs

实现在控制台进入当前文件夹,node + 文件名 回车执行

文件引入

如果当前文件夹下有index.js和2.js
2.js 里包含变量a(let a=1)

//2.js
let a=1
global.b=ouyang; //挂载在global全局下,node的全局是global不是window

//index.js
const obj=require("./2.js"); //require请求的就是module.exports的内容
console.log(obj.a); //输出2.js里的a不会成功
console.log(global.b); //ouyang  这样才会成功

node在执行时会把代码重新编译,编译时会把代码打包成字符串放入一个函数里进行编译,所以直接在全局var 或者let声明的变量并不能通过全局直接调用!

模块

//02.js
module.exports=function(){
    console.log("666")
};  //被覆盖
module.exports=123123123; //为模块赋值
// module.exports.num=123;  //可以为模块定义属性

//index.js
const obj=require("./2.js");  //如果不加./ 则在核心模块或第三方依赖模块里找,就不再当前文件夹下找了
console.log(obj); //123123123

重新定向

//2.js
exports=module.exports
exprots.fn=function(){
    
};   //对exports重新定向,并添加新的属性fn,方便index.js的require访问;

node把所有抽象成了事件,node执行时,同步异步差异如下:

// 同步
process.nextTick(()=>{ 
    console.log("1")    //2
})
process.nextTick(()=>{
    console.log("2")    //3
})
//异步
setImmediate(()=>{
    console.log("3")    //6
    process.nextTick(()=>{
        console.log("4")//8
    }
})
setImmediate(()=>{
    console.log("5")    //7
})
setTimeout(function(){
    console.log("8")    //5
},0)
//同步
process.nextTick(()=>{
    console.log("7")    //4
})
console.log("6")        //1

node 输出结果 6 1 2 7 8 3 5 4

事件队列,自动排队

node执行初期执行一个无限循环
while(true){
1.scipt(全部代码),产生同步异步;
2.执行完script后 将micro-task 队列里的事件全部执行;
3.再次执行macro-task 队列里的第二层script,产生第二层的micro-task的
4.紧接着执行micro-task里新产生的事件队列
一直到最里层的macro-task代码产生的micro-task队列执行完毕…
}

node原生模块

事件模块 events

const events=require("events"); //使用下面的对象时直接加“.EventEmitter”使用 events获得的是构造函数,用new创建实例

const eventEmitter=require("events").EventEmitter;
const myEmitter=new EventEmitter();

//这里有一个异步
setTimeout(()=>{
    //异步的结果出来
},2000);

myEmitter.on("someEvents",()=>{
    console.log("这个某个异步的回调执行函数")
}

path模块

const path=require('path')
console.log(path.join("a","b"))//用于拼接路径 a/b

console.log(__dirname); //返回文件夹路径
console.log(__filename); //返回文件路径,包含文件名
console.log(path.resolve(__dirname,"test"); //返回一个绝对路径

console.log(path.parse(__filename));  //序列化传入的参数如下格式

/*
{
    root:'/',
    dir:'',
    base:'',
    name:''
}
*/

URL模块

const {URL} = require("url"); //建议加上.URL,不适用node自己实现的方法
const myUrl=new URL("https://www.baidu.com");
console.log(myUrl); //解析出整个url的各种值并转化为json数据

//search:'' 为查询部分
//URLsearchParams:'' 这是一个类似的map对象 

//如果用parse序列化
const myUrl2=url.parse("https://www.baidu.com");

文件操作

const js = require('fs')

fs.readFile('路径',(err,data)=>{
    if(err) threw err;
    console.log(data);
}); //有Sync 同步 没有回调, 没有Sync 异步有回调 ,错误对象err永远是第一个参数位;
//如果读取错误,err是个json对象,不为null,包含路径,结果,权限等键与值

//输出的data一般是个buffer数据,如果添加第二个参数(进制编码),可以将data转换为其他文字编码,如UTF-8

1
//异步读取
const js = require(‘fs’)

const fn=async()=>{
      
    const data =await new Promise((resolve,reject)=>{
        fs.readFile("./1.txt","utf8",(err,data)=>{
            if(err) return reject(err)
            resolve(data)
        }
    }
    console.log(data); //取不到
}

2

//写
const js = require('fs');
const data="fengyu";
fs.writeFile("./2.txt",data,'utf8',err=>{
    if(err) throw err;
    console.log("写入成功");
}) //utf8 编码参数可选

创建服务器实例

const http=require('http')
const fs=require('fs')
const server=http.createServer((req,res)=>{
    res.writeHead(200,{
    "Content-Type:"text/plain;charset=utf-8"
    "}); //响应头,text/plain 是纯文本,charset设置文字编码
    res.write("向客户端返回数据"); //数据响应,返回值
    res.end()l//结束响应
}); //req requeset, res response
//修改后打断^C,重新执行, 或者安装 npm全局安装nodemon
server.listen(3000); //建议监听1024以上




//返回页面

if(req.method==="GET"){
    res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})
    switch(req.url){
        case "/":
        res.write(fs.redFileSync("index.html","utf8"));
        
        
    }
    
}

.

const http=require('http')
const server=http.createServer((req,res)=>{
    const obj={
        a:1,
        b:2
    }
    res.write(JSON.stringfy(obj)
})
server.listen(3000,()=>{
    console.log("服务器监听在localhost:3000")
})

你可能感兴趣的:(学习笔记,nodejs,js)