学习目标
- 优秀的前端——可以和后端有效的沟通
- 敏捷的全栈——快速开发全栈应用
- 基本的架构师——践行工程化思想
Node是什么?
Node.js 是一个基于 Chrome V8 引擎,异步驱动的 JavaScript 运行时。
处理并发
由于处理器和内存速度快,但是存储速度慢,所以如果单线程的话,需要等待很长时间
几种语言与并发的处理:
- 多进程——C
- 多线程——JAVA
- 异步I/O——JavaScript
- 协程——lua,go
- 下一代——deno
因为node是JavaScript的运行时,所以他也是异步I/O的。
关于协程:
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。
我们知道多个线程相对独立,有自己的上下文,切换受系统控制;
而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
前后端对比
相同点:
JavaScript的核心语法是不变的
不同点:
前端:BOM,DOM
后端:fs,http,buffer,event,os
运行node程序
node 文件名
由于每次修改js文件都需要重新执行才可以生效,为便捷可以安装nodemon来监视文件的改动,以便他可以自动重新执行
nodemon 文件名
小提示:
在进行调试使,最好用console.log或者alert会更好一些,因为debug会产生截断,也会影响实际执行效果。
使用模块
- node内建模块
require(‘os’)
- 第三方模块
先用npm安装模块,然后调用
require(‘cpu-state’);
- 自定义模块
导出
module.exports = {}
导入
require(’./conf’)
核心API
fs
const fs = require('fs');
- 同步
const data = fs.readFileSync('./package.json');// 直接读取为二进制,为buffer对象
console.log(data.toString());// 默认为utf-8的模式
- 异步
fs.readFile('./package.json',(err,data) => {
console.log(data.toString());
})
- 一般异步方法
const {promisify} = require('util');
const readFile = promisify(fs.readFile)
readFile('./package.json').then(data => {
console.log(data.toString())
})
- async await 异步方法
(async => {
const {promisify} = require('util');
const readFile = promisify(fs.readFile)
const data = await readFile('./package.json')
console.log(data.toString())
}) ()
buffer
const buf1 = Buffer.alloc(10); // 开辟内存空间,10个字节
console.log(buf1)
const buf2 = Buffer.from([1,2,3]) // 二进制的1,2,3
console.log(buf2)
const buf3 = Buffer.from('Buffer创建方法');
console.log(buf3.toString())
buf1.write('hello'); // 写入
console.log('buf1:',buf1)
const buf4 = Buffer.concat([buf1,buf3]); // 拼接
console.log(buf4.toString())
console.log(buf4.toJSON())
http
const http = require('http');
const fs = require('fs')
const server = http.createServer((req, res) => {
const {url,method,headers} = req;
console.log('request', url)
console.log('request', method)
if (req.url !== "/favicon.ico") {
// 返回网页
if (url === '/' && method === 'GET') {
fs.readFile('index.html', (err, data) => {
if (err) {
// writeHead 可以设置一组头信息
res.writeHead(500, {
'Content-Type': 'text/plain;charset=utf-8'
})
res.end('Server Error 服务器错误')
} else {
res.statusCode = 200;
// setHeader 只能一组一组设置信息
res.setHeader('Content-Type', 'text/html')
res.end(data)
}
})
}
// 返回ajax请求
else if (url === '/users' && method === 'GET') {
res.writeHead(200, {
'Content-Type': 'application/json;charset=utf-8'
})
res.end(Json.stringify({
name: 'xia'
}))
}
//返回图片
else if (headers.accept.indexOf('image/*') !== -1 && method === 'GET') {
fs.createReadStream('.' + url).pipe(res) //文件流
// res.writeHead(200, {
// 'Content-Type': 'application/json;charset=utf-8'
// })
// res.end(Json.stringify({name:'xia'}))
}
}
})
server.listen(3000) //监听300端口
以上为学习总结。