node 是一个js 的运行时 js BOM DOM ECMASCRIPT => node中只有ECMASCRIPT + 模块
- import export babel-> commonjs mjs
- node 干什么? 写些脚本(比如说webpack,都是用node写的) 中间层 服务端渲染(vue react)可以实现前后端分离 可以解决前端跨域问题、数据处理
- 实现高性能的web服务
浏览器事件环和node事件环
v10+执行的效果是一样的。给每个宏任务对应的都配置了一个队列 timer poll check (每个执行完后清空一次微任务)
进程和线程的区别 (node中的进程)
- node执行一旦报错整个都会断掉,现在电脑都是多核 node可以开启多个子进程,监听同一个服务,其中一个挂了还能继续 pm2
- 一个进程中可以有多个线程,比如渲染线程、JS 引擎线程、HTTP 请求线程等等
- 进程表示一个程序,线程是进程中的单位 主线程只有一个
- 1个进程可以占用1核cpu
- 多线程在单核cpu中其实也是顺序执行的,不过系统可以帮你切换哪个执行而已,没有提高速度
- 多个cpu的话就可以在多个cpu中同时执行
单线程优点:解决切换上下文时间,没有锁的问题(因为只有一个线程,不会两个线程操作同一个文件),节省内存(切换上下文,多线程感觉是同一时间干了好多事,其实不是,你做一点,他再做一点,其实是多个线程不停的切换)
node是单线程的 主进程,再开多个子进程,里面包含着一个线程
单线程
多线程
node中的全局对象 (可以直接调用的)
- process,buffer
- process.cwd() 可以改变 process.nextTick process.pid process.argv commander process.env 环境变量
- require,exports,module,__filename,__dirname (可以直接在模块内部被访问)
node中的模块
- 模块分类 ES6module,commonjs规范 amd,cmd,umd
- commonjs规范
- 一个文件就是一个模块
- 如果模块想给别人使用 module.exports / exports 同一个对象但是最终导出的是module.exports
- 如果想使用这个模块 require (同步读取文件,包一个自执行函数,vm.runInthisContext,传入export对象,最终返回的是exports 对象,所以就可以拿到其他模块的内容)
- 模块的查找规范
- 第三方模块 module.paths
- 如果文件和文件夹重名 先取文件,文件不能取到,找文件夹 package.json => main => index.js
node中模块的分类
- 核心模块 require(‘moduleName’)
- fs fs.readFileSync ReadFile fs.existsSync fs.access
- vm vm.runInThisContext
- path path.resolve() join extname basename dirname (process.cwd())
- util util.inherits util.promisify (转化成promise) async + await
- events on(addListener) once(绑定一次) off(关闭绑定) newListener emit
- 发布订阅优势 解耦合
- 文件模块/自定义模块 (同步读取文件,包一个自执行函数,vm.runInthisContext,传入export对象,最终返回的是exports 对象,所以就可以拿到其他模块的内容)
- 第三方模块 module.paths
- commander , chalk , mime 1.jpg
如果文件和文件夹重名 先取文件,文件不能取到,找文件夹 package.json => main => index.js