nodejs总结 | 青训营笔记

99 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第25天,也是课程结束后的第三天,本篇将讲述青训营期间学到的nodejs知识。

node.js简介

Node.js是基于V8引擎的js运行环境-后端运行环境

浏览器-前端运行环境

node.js中的JS运行环境

  1. V8引擎(解析)

  2. 内置API(提供引用)

nodejs无法调用DOM和BOM等浏览器内置API

node.js可以做什么

  1. 基于Express框架快速构建Web应用

  2. 基于Electron框架构建跨平台桌面应用

  3. 基于resify框架快速构建API接口项目

nodejs学习路径

  • js基础语法
  • nodejs内置API模块(fs、path、http等)
  • 第三方API模块(express、mysql)

nodejs安装

  1. LTS为长期稳定版,适用追求稳定性和企业级项目(推荐)

  2. current尝新,但会有可能有bug

  • 查看版本号 node -v

什么是终端 为开发人员设计的人机交互的一种方式

nodejs环境中执行JavaScript代码

  1. 打开终端

  2. node + 执行的js文件

旧版终端 cmd 新版终端 powershell tab 补全路径 esc 清空当前输入命令 cls 清空终端

模块化

解决一个复杂问题,自顶向下逐层将系统划分为若干模块的过程 模块是可组合、分解和更换的单元

  • 编程中的模块化:遵守固定的规则,将一个大文件拆成独立并相互依赖的多个小模块

优点: 提高代码复用性 提高代码可维护性 实现按需加载

nodejs模块化

  1. 内置模块 nodejs官方提供

  2. 自定义模块 用户创建的.js文件

  3. 第三方模块 使用前需下载,第三方开发的模块

加载模块

require()方法 当加载require中代码时,会执行加载模块中代码

const fs = require('fs'); //1. 内置模块

const custom = require('./custom.js')  //2. 自定义模块(.js可不加)

模块作用域

在自定义模块定义的变量、方法等成员,只能在当前模块被访问,

优点: 防止全局变量污染问题

向外共享作用域中的成员

  1. module对象

每个.js自定义模块中都有个module对象,里面储存了和当前模块有关的信息

  1. module.exports对象

自定义模块中可使用module.exports对象,将模块内成员共享

外界用require()方法导入自定义模块,得到module.exports所指对象

  • 注意: require()方法导入模块时,导入结果以module.exports指向对象为准
  1. exports对象

默认情况下exports和modules.exports指向同一对象,最终结果是module.exports为准

使用误区!!

模块化规范

nodejs遵循CommonJS模块化规范 CommonJS规定了模块的特性和各模块间如何相互依赖

  1. 每个模块内部,module变量代表当前模块
  2. module变量是一个对象,它的exports属性是对外的接口
  3. 加载某个模块是加载module.exports属性,require()方法用于加载模块

模块加载机制

优先从缓存中加载

模块第一次缓存后会被缓存,意味着多次调用require()不会导致模块的代码被执行多次

不论是 内置模块、用户自定义模块、第三方模块,都会优先缓存加载,从而提高模块的加载效率

内置模块加载机制

由Node.js提供的模块,加载优先级最高

require('fs')返回始终内置的fs模块

自定义模块的加载机制

使用require()加载时,必须以./或../开头,不然node会将其作为内置模块或第三方模块

如果省略了文件扩展名。Node.js按顺序分别尝试加载以下文件:

  1. 按确切文件名加载
  2. 补全.js扩展名进行加载
  3. 补全.json扩展名进行加载
  4. 补全.node扩展名进行加载
  5. 加载失败,终端报错

第三方模块的加载机制

传递给require()的标识符不是一个内置模块,也没有以'./'或'../'开头,则Node.js会当前模块的父目录开始,尝试从/node_modules文件夹中加载 若无对应第三模块,则移动到上一层父目录中,直到文件系统的根目录

假设C:\Users\wy\project\foo.js 文件调用require('tools');

  1. C:\Users\wy\project\node_modules\tools
  2. C:\Users\wy\node_modules\tools
  3. C:\Users\node_modules\tools
  4. C:\node_modules\tools

目录作为模块

把目录作为模块标识符,传递给require()进行加载时,有三种加载方式:

  1. 被加载目录下找package.json文件,寻找main属性,作为require()的加载入口
  2. 没有package.json文件或main入口不存在或无法解析,Nodejs会试图加载index.js文件。
  3. 都失败,打印错误消息 Error:Cannot find module 'xxx'