【笔记】Nodejs学习笔记

前言

Nodejs学习笔记

在Node环境中运行JS代码

<file>.js:需要运行的JS文件

1
node <file>.js

Nodejs的模块化规范

  • Nodejs遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖
    • 在每个模块内部,module对象表示当前模块自身
    • module对象中的exports属性,是向外暴露的接口
    • 执行require()函数引入对象时,实际上就是加载module.exports

模块的分类

  • 内置模块:fspathhttp
  • 自定义模块:用户自己创建的模块
  • 第三方模块:别人分享的自定义模块

引入模块

引入内置模块

  • 加载内置模块只需要指定模块名
1
const fs = require("fs");

引入自定义模块

  • 加载自定义模块需要指定模块的路径
1
const diy = require("./diy.js");
  • 在加载自定义模块时,可以省略文件后缀
1
const diy = require("./diy");

引入第三方模块

  • 加载第三方模块只需要指定模块名
  • 在加载第三方模块时,会自动执行模块中的所有代码
1
const third = require("third");

模块的作用域

  • 模块的作用域:模块内的变量只能在模块内访问,这样能方式全局变量污染问题

向外共享模块作用域的成员

  • 利用module.exports对象向外共享模块作用域的成员,在通过require()调用模块时,会得到module.exports对象
  • 在自定义模块中,module.exports对象默认为空对象
1
module.exports = {};
  • 为了简化module.exports,可以使用exports对象向外共享模块作用域的成员,module.exportsexports指向的是同一个对象
1
exports = {};
  • module.exportsexports同时出现时,无论最后赋值的是哪一个对象,都以module.exports为准
1
2
exports = {};
module.exports = {};

模块的加载机制

  • 模块在第一次加载后会被缓存,这也就意味着多次require()不会导致代码被多次执行

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

  • 内置模块的加载优先级最高

  • 加载自定义模块时,必须以./../开头,否则Nodejs就会从内置模块和第三方模块中加载

  • 加载自定义模块时,如果省略了后缀名,Nodejs将会自动依次以无扩展名、.js.json.node进行补全,如果都找不到文件,将会报错

  • 加载第三方模块时,Node会按照../node_modules/模块名../../node_modules/模块名等以此拼接上级目录,查找node_modules目录,如果都找不到文件,将会报错

  • 如果将一个目录作为参数传递给require()函数作为模块的加载,Nodejs会首先查找是否存在package.json并查找是否有main属性

    • 如果有main属性指定的入口文件,则加载模块下指定的入口文件
    • 如果没有main属性制定入口文件,则加载模块根目录下的index.html文件
    • 如果以上都找不到模块的入口文件,则报错:Error: Cannot find modules 'xxx'

Npm与包

包管理配置文件

  • 在使用Npm的项目根目录中,必须提供package.json的包管理配置文件,用来记录项目的配置信息
  • 在使用Npm的项目,根目录名不能包含中文和空格,否则创建包管理配置文件时会报错

所记录的内容

  • package.json文件中通过dependencies属性记录项目中所依赖的第三方模块
    • 通过npm install <package>安装依赖包
  • package.json文件中通过devDependencies属性记录项目中仅开发阶段所依赖的第三方模块
    • 通过npm install --save-dev <package>安装开发阶段的依赖包

创建包管理配置文件

1
npm init
  • 按需输入表单,什么也不输入就是默认值或留空
1
2
3
4
5
6
7
8
9
package name: # npm包名
version: # 版本号,默认1.0.0
descripthon: # 描述
entry point: # 入口文件,默认index.js
test command: # 测试命令
git repository: # Git仓库地址
keywords: # 搜索关键字
author: # 作者
license: # 开源许可协议,默认ISC
快速创建包管理配置文件
1
npm init -y

依赖包目录

  • 安装第三方模块是,第三方模块会被安装在node_modules目录下
  • 在引入node_modules目录下的第三方模块时,只需要直接指定模块名即可引入

package-lock配置文件

  • 用来记录安装node_modules目录下所下载的包的信息,包括下载的包的名称、版本、地址等信息

包的分类

  • 项目包:只在当前项目使用的包,被安装在node_modules目录下
    • 开发依赖包:被记录在devDependencies的依赖包,只会在开发阶段使用
    • 核心依赖包:被记录在dependencies的依赖包,在开发阶段和生产阶段都使用
  • 全局包:通常只有工具性的包才被安装在全局
    • Windows平台会被安装在C:\Users\用户名\AppData\Roming\npm\node_modules文件夹下
    • MacOS(Intel)平台会被安装在/usr/local/lib/node_modules目录下
    • MacOS(Apple Silicon)平台会被安装在/opt/homebrew/lib/node_modules目录下

开发第三方模块

规范的包结构

  • 每个包必须以单独的目录存在
  • 包的根目录必须包含package.json配置文件,在package.json配置文件中必须包含name(名称)、version(版本)、main(入口文件)三个属性
  • 如果一个模块有多个功能,可以把多个功能拆分成单独的JS文件,存放在src目录下,通过入口文件引入所有JS文件并向外暴露接口
1
2
3
4
5
6
7
+ node_modules
+ 包
+ src
- 功能文件.js
- package.json
- index.js
- README.md

完成

参考文献

哔哩哔哩——黑马程序员