js运行时在浏览器端,nodejs运行中服务器端
nodejs
/**
前端工程师
- 低门槛
- 学习成本低
- 前端工具,脚手架
- LAMP --> js趋势
后端: web = linux + Apache + php + mysql
ssr = php + js
ssr = react + nodejs
*/
能做什么?
- web svr 接入层
- 命令行工具
- 批处理脚本
局限性
- 性能差 单线程
- 进程守护
- 安全性
- 动态语言
- 生态
版本管理工具
- nvm
- n
- nvs
全局对象
/**
global全局对象
- require,module,export,__filename,__dirname
- process,buffer
- console
- setTimeout,clearSetTimeout,setInterval,setImmediate
*/
阻塞
同步阻塞,异步非阻塞
/**
同步: 指的做一件事,一步一步执行,第一件事情做完了,再去做第二件事,以此类推
异步: 指的是多件事情同时进行
举个例子: 家里的滚筒洗衣机,你可以把衣服丢进去然后去看电视这就是异步执行,你要是把衣服丢进去就一直盯着洗衣机,洗完了再去看电视,这就是同步执行
*/
const fs = require('fs')
// 同步执行
const data = fs.readFileSync('./conf.js')
// 异步执行
// 1. readFile
fs.readFile('./conf.js',(err,data)=>{
...
})
// 2.promisify
const {promisify} = require('util')
const readFile = promisify(fs.readFile)
readFile('./conf.js').then(data=> ... )
// 3.promises
const fsp = require("fs").promise
fsp.readFile('./conf.js').then().catch()
// 4. async/await
(async ()=>{
const fs = require('fs')
const { promisify } = require('util')
const readFile = promisify(fs.readFile)
const data = await readFile('./index.html')
})()
缓冲区
// 创建长度为10字节以0填充的Buffer
const buf1 = Buffer.alloc(10)
// 创建一个buffer包含ascii
const buf2 = Buffer.from('a')
// 创建包含utf-8
const buf3 = Buffer.from('Buffer创建方法');
// 写入数据
buf1.write('hello');
// 读取Buffer数据
console.log(buf3.toString());
// 合并Buffer
const buf4 = Buffer.concat([buf1, buf3]);
http服务
// 创建一个http服务
const http = require('http');
const server = http.createServer((request, response) => {
console.log('there is a request');
response.end('a response from server');
});
server.listen(3000);
stream流
const fs = require('fs')
const rs2 = fs.createReadStream('./01.jpg')
const ws2 = fs.createWriteStream('./02.jpg')
rs2.pipe(ws2);
//响应图片请求,05-http.js
const {url, method, headers} = request;
else if (method === 'GET' && headers.accept.indexOf('image/*') !== -1) {
fs.createReadStream('.'+url).pipe(response);
}
通过nodejs复制文件
var fs = rquire('fs')
function copy(src,dst){
fs.writeFileSync(dst,fs.readFileSync(src))
}
function copy2(src,dst){
fs.createReadStream(src).pipe(fs.createWriteStream(dst))
}
function copy3(src,dst){
const bufferSize = 1024*1024
const buffer = Buffer.alloc(bufferSize)
const readStream = fs.createReadStream(src)
const writeStream = fs.createWriteStream(dst)
readStream.on('data',(chunk)=>{
let offset = 0;
while(offset < chunk.length){
const bytes = Math.min(buffer.length,chunk.length-offset)
chunk.copy(buffer,0,offset,offset+bytes)
writeStream.write(buffer.slice(0,bytes))
offset += bytes
}
})
readStream.on('end',()=>{
writeStream.end()
})
}
/**
process.argv()
- 返回启动的js文件的绝对路径
- 当前执行的js文件路径
- 其余的都是参数
- process.cwd(): 执行目录
*/
网路
web,svr,http,client,rpc