模块加载 相关知识
模块说明
在 node.js 中模块分为 3 种:内置模块、自定义模块、第三方模块。
1. 优先从缓存中加载
模块缓存机制
这 3 种模块在第一次加载后都会被缓存,从而提高加载效率。这也意味着多次调用 require() 不会导致模块的代码被执行多次。
2. 内置模块和第三方模块优先级
模块优先级
内置模块优先级较高。这也意味着内置模块与第三方模块同名时,加载的是内置模块
3. 自定义模块的加载机制
加载顺序
加载自定义模块时需要指定路径
加载自定义模块时可以省略后缀名
例如:假设 demo 是个自定义模块,使用 require('./demo'),则查找顺序如下:
- 加载 demo 文件内容,若没有
- 加载 demo.js 文件内容,若没有
- 加载 demo.json 文件内容,若没有
- 加载 demo.node 文件内容,若没有
- 加载失败,报错
4. 第三方模块的加载机制
加载顺序
加载第三方模块时也有查找顺序
例如:假设 demo 是个第三方模块,使用 require('demo'),则查找顺序如下:
加载 当前文件目录中 node_modules 下的 demo 文件内容
- 去 上一层文件目录中 node_modules 下的 demo 加载文件内容
- 继续去 上一层文件目录中 node_modules 下的 demo 加载文件内容
- 直到电脑磁盘根目录,加载失败就报错
5. 使用目录作为导入标识
加载说明
以目录为模块导入时,也有查找顺序 (目录一般也是自定义模块)
例如:假设 demo 是个 文件目录名,使用 require('demo'),则查找顺序如下:
- 查看 demo 文件夹中 package.json 里的 main 属性,作为导入入口
- 若 demo 文件夹中不存在 package.json 或 没有 main 属性,则加载 demo/index.js
- 若都找不到,就会报错:Error: Cannot find module 'xxx'
6. package.json 属性节点说明
type: 用来指定该项目的模块化规范。module 表示使用 ES6 模块化规范,commonjs 表示使用 commonjs 模块化规范
name: 表示该项目的名称。如果该项目被发布到 npm ,则该属性作为 包的名字
version: 表示该项目的版本号。会同步到 npm
description: 表示该项目的表述。会同步到 npm
main: 为该项目提供的入口文件。外界进行导入时,要导入的那个 js 文件路径
types/typings: 这两个节点效果一样。用来指定声明文件的入口,例如设置为 ./index.d.ts 则引入这个包就会具有 ts 的类型检测和代码提示功能(需要在 index.d.ts 中定义)
scripts: 收集脚本。可以用 npm run ... 来执行
keywords: 表示包关键字。会同步到 npm
auther: 指定包的作者。
license: 指定包的代码协议