前言
Nodejs学习笔记
在Node环境中运行JS代码
<file>.js
:需要运行的JS文件
Nodejs的模块化规范
- Nodejs遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖
- 在每个模块内部,module对象表示当前模块自身
- module对象中的exports属性,是向外暴露的接口
- 执行
require()
函数引入对象时,实际上就是加载module.exports
模块的分类
- 内置模块:
fs
、path
、http
- 自定义模块:用户自己创建的模块
- 第三方模块:别人分享的自定义模块
引入模块
引入内置模块
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
对象默认为空对象
- 为了简化
module.exports
,可以使用exports
对象向外共享模块作用域的成员,module.exports
和exports
指向的是同一个对象
- 当
module.exports
与exports
同时出现时,无论最后赋值的是哪一个对象,都以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 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
|
快速创建包管理配置文件
依赖包目录
- 安装第三方模块是,第三方模块会被安装在
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
|
完成
参考文献
哔哩哔哩——黑马程序员