Hello,NodeJS

202 阅读2分钟

这是我参与更文挑战的第 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 仅在模块中可用,详情可查看官网说明。

参考链接