node.js是构建在Chrome v8 引擎上的一个javascript 运行环境
node和Chrome一样都是基于事件驱动的异步架构!Chrome是基于事件的交互,而node是基于事件的I/O;
node没有HTML、Webkit和显卡驱动等UI技术支持;
实现在控制台进入当前文件夹,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队列执行完毕…
}
const events=require("events"); //使用下面的对象时直接加“.EventEmitter”使用 events获得的是构造函数,用new创建实例
const eventEmitter=require("events").EventEmitter;
const myEmitter=new EventEmitter();
//这里有一个异步
setTimeout(()=>{
//异步的结果出来
},2000);
myEmitter.on("someEvents",()=>{
console.log("这个某个异步的回调执行函数")
}
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:''
}
*/
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")
})