这是我参与「第四届青训营 」笔记创作活动的第25天,也是课程结束后的第三天,本篇将讲述青训营期间学到的nodejs知识。
node.js简介
Node.js是基于V8引擎的js运行环境-后端运行环境
浏览器-前端运行环境
node.js中的JS运行环境
-
V8引擎(解析)
-
内置API(提供引用)
nodejs无法调用DOM和BOM等浏览器内置API
node.js可以做什么
-
基于Express框架快速构建Web应用
-
基于Electron框架构建跨平台桌面应用
-
基于resify框架快速构建API接口项目
nodejs学习路径
- js基础语法
- nodejs内置API模块(fs、path、http等)
- 第三方API模块(express、mysql)
nodejs安装
-
LTS为长期稳定版,适用追求稳定性和企业级项目(推荐)
-
current尝新,但会有可能有bug
- 查看版本号
node -v
什么是终端 为开发人员设计的人机交互的一种方式
nodejs环境中执行JavaScript代码
-
打开终端
-
node + 执行的js文件
旧版终端 cmd 新版终端 powershell tab 补全路径 esc 清空当前输入命令 cls 清空终端
模块化
解决一个复杂问题,自顶向下逐层将系统划分为若干模块的过程 模块是可组合、分解和更换的单元
- 编程中的模块化:遵守固定的规则,将一个大文件拆成独立并相互依赖的多个小模块
优点: 提高代码复用性 提高代码可维护性 实现按需加载
nodejs模块化
-
内置模块 nodejs官方提供
-
自定义模块 用户创建的.js文件
-
第三方模块 使用前需下载,第三方开发的模块
加载模块
require()方法 当加载require中代码时,会执行加载模块中代码
const fs = require('fs'); //1. 内置模块
const custom = require('./custom.js') //2. 自定义模块(.js可不加)
模块作用域
在自定义模块定义的变量、方法等成员,只能在当前模块被访问,
优点: 防止全局变量污染问题
向外共享作用域中的成员
- module对象
每个.js自定义模块中都有个module对象,里面储存了和当前模块有关的信息
module.exports对象
自定义模块中可使用module.exports对象,将模块内成员共享
外界用require()方法导入自定义模块,得到module.exports所指对象
- 注意:
require()方法导入模块时,导入结果以module.exports指向对象为准
- exports对象
默认情况下exports和modules.exports指向同一对象,最终结果是module.exports为准
使用误区!!
模块化规范
nodejs遵循CommonJS模块化规范 CommonJS规定了模块的特性和各模块间如何相互依赖
- 每个模块内部,module变量代表当前模块
- module变量是一个对象,它的exports属性是对外的接口
- 加载某个模块是加载
module.exports属性,require()方法用于加载模块
模块加载机制
优先从缓存中加载
模块第一次缓存后会被缓存,意味着多次调用require()不会导致模块的代码被执行多次
不论是 内置模块、用户自定义模块、第三方模块,都会优先缓存加载,从而提高模块的加载效率
内置模块加载机制
由Node.js提供的模块,加载优先级最高
require('fs')返回始终内置的fs模块
自定义模块的加载机制
使用require()加载时,必须以./或../开头,不然node会将其作为内置模块或第三方模块
如果省略了文件扩展名。Node.js按顺序分别尝试加载以下文件:
- 按确切文件名加载
- 补全.js扩展名进行加载
- 补全.json扩展名进行加载
- 补全.node扩展名进行加载
- 加载失败,终端报错
第三方模块的加载机制
传递给require()的标识符不是一个内置模块,也没有以'./'或'../'开头,则Node.js会当前模块的父目录开始,尝试从/node_modules文件夹中加载
若无对应第三模块,则移动到上一层父目录中,直到文件系统的根目录
假设C:\Users\wy\project\foo.js 文件调用require('tools');
- C:\Users\wy\project\node_modules\tools
- C:\Users\wy\node_modules\tools
- C:\Users\node_modules\tools
- C:\node_modules\tools
目录作为模块
把目录作为模块标识符,传递给require()进行加载时,有三种加载方式:
- 被加载目录下找package.json文件,寻找main属性,作为require()的加载入口
- 没有package.json文件或main入口不存在或无法解析,Nodejs会试图加载index.js文件。
- 都失败,打印错误消息
Error:Cannot find module 'xxx'