这是我参与更文挑战的第 3 天,活动详情查看: 更文挑战
从今天开始,我打算开启一段关于 Node 的学习旅程,通过了解 JS 的语言能力,走出浏览器的范围、在计算机系统层去做些事情,挥动 JS 「隐形的翅膀」。
基本概念
首先我们了解 NodeJS 是什么?来官网定义:
- 基于 chrome V8 引擎的 JS 运行环境
- 使用 事件循环,非阻塞 I/O 模型
(这些字都认识,可是组合在一起怎么读不懂??)
事件循环
NodeJS 主线程负责事件调度,不断驱动事件执行。在主线程之外会有一个任务队列,主线程将需要执行或计算的任务放到队列中,由子进程去执行,处理完成之后,主线程会从任务队列中获取执行结果。
常说 NodeJS 是单线程的,主要是指她的主线程是单线程,并不意味她的执行效率就很低。
非阻塞 I/O
I/O(input/output)即输入/输出。阻塞与非阻塞之间区别在于,从输入到输出这个过程中,系统是否能接受其他输入
与 chrome 有什么不同?
- nodejs 中没有 document,window 等浏览器 API
- 内置了 fs,process,http 等 API 用来操作文件,读取进程信息,网络通信等
应用场景有哪些?
- 同构渲染,next/nuxt
- 构建打包,webpack/gulp
- 开发工具,vsCode/electron
commonJS 模块规范
关键字
- require:
const game = require('./game');
- exports:
exports.port = 4000;
- module.exports:
- 模块默认导出是一个空对象
- 如果要改变导出对象为函数,可以使用 module.exports 关键字
module.exports = function () {
console.log('change :>> ');
};
注意
-
exports 导出的变量与 require 引入的变量,指向同一个引用
-
在引入 lib.js 的文件中打印 exports,与在 lib.js 中打印 exports 结果不一样
// lib.js exports.hello = 'test'; exports.add = function(a, b) { return a + b } module.exports = function() { console.log('change :>> '); } setTimeout(() => { console.log('exports :>> ', exports); }, 2000); // 导出到外部的 exports:>> [Function (anonymous)] // 内部的 exports :>> { hello: 'test', add: [Function (anonymous)] }因为一旦为 exports 赋予了新值,它将不再绑定到 module.exports,exports 仅在模块中可用,详情可查看官网说明。
参考链接