前言

JS 是脚本语言, 脚本语言需要依赖解析器运行; 写在 HTML 中的 JS, 浏览器充当了解析器角色, 而相对于需要独立运行的 JS, NodeJS 就是解析器

解析器的本质是一个运行环境(runtime), 允许 JS 定义数据结构、进行计算、使用其内置方法和对象, 如浏览器中的 doucment 和 NodeJS 中的 fs、http 等

NodeJS 的目的: 实现高性能 Web 服务器, 重点是事件机制和异步 IO 模型的优越性, 而不是 JS, 只是 JS 和作者的需求(不带 IO 功能、支持事件机制、使用范围广)

模块化

  1. require: 用于在当前模块加载和使用别的模块, 传入模块名, 返回模块导出对象
    1
    2
    3
    const events = require('events')
    const myModule = require('./index.js')
    const data = require('./data.json')
  2. exports: 当前模块的导出对象, 用于导出模块的公有方法和属性
    1
    exports.hello = function() {}
  3. module: 访问=当前模块的一些相关信息, 但最多的用途是替换当前模块的导出对象
    1
    2
    // 模块默认导出对象被替换成了一个函数
    module.exports = function () {}

模块初始化: 模块中的 JS 代码仅在模块第一次被使用时执行一次, 并在执行过程中初始化模块的导出对象, 之后会被缓存起来的导出对象被重复利用

主模块: 通过命令行参数传递给 NodeJS 以启动程序的模块被称为主模块, 主模块负责调度组成整个程序的其它模块完成工作, 如 node main.js

二进制模块

NodeJS 支持使用 C/C++ 编写二进制模块, 编译好的二进制模块除了文件拓展名是 .node, 和 JS 模块使用方式相同, 二进制模块能使用操作系统提供的所有功能, 有极强的拓展性, 但是编写困难、难以跨平台使用, 推荐死月的《Node.js:来一打 C++ 扩展》

NodeJS 常用 & 核心模块

Node 环境下的 EventLoop

url

url2

url3

PM2