Node.js模块化的基本概念和分类及使用方法

1.模块概念

模块:指解决一个复杂问题的时候,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来讲,模块是可以组合、分解和更换的单元。

在编辑领域中的模块,就是遵守固定的规则,把一个大文件拆成独立并且相互依赖的多个小模块。

代码进行模块拆分的好处有:提高代码的复用性,提高代码的可维护性,可以实现按需加载。

2.模块分类
2.1、内置模块(内置模块是由Node.js官方提供的,如fs、path、http等)
  • fs 模块:用于文件操作,包括读取文件、写入文件、创建目录、删除文件等。
  • http 模块:用于创建 HTTP 服务器和客户端,可以处理 HTTP 请求和响应。
  • https 模块:与 http 模块类似,但支持安全的 HTTPS 协议。
  • path 模块:用于处理文件路径,包括路径解析、拼接、规范化等。
  • events 模块:用于实现事件驱动的编程,可以创建和处理事件。
  • stream 模块:用于处理流式数据,可以读取和写入可流式的数据。
  • util 模块:包含一些实用工具函数,如继承、类型判断、错误处理等。
  • crypto 模块:提供加密和解密功能,包括哈希算法、对称加密和非对称加密等。
  • os 模块:提供与操作系统相关的功能,如获取操作系统信息、处理文件路径等。
  • querystring 模块:用于解析和序列化 URL 查询字符串。
2.2、自定义模块(每个用户创建的 .js文件,都是自定义模块)
2.3、第三方模块(由第三方开发出来的模块,使用前需先下载)
3.加载模块
3.1、require

使用 require() 方法,可以加载需要的内置模块、自定义模块、第三方模块进行使用

注:使用 require() 方法加载其他模块时,会执行被加载模块中的代码

加载内置模块
const fs = require("fs");
加载自定义模块
  • 模块名中的.js可省略

  • 相对路径与绝对路径皆可

    const custom = require("./custom.js");

加载第三方模块
const moment = require("moment")
3.2、exports

在项目中创建hello.js

exports.world = ()=>{
    console.log('Hello World')
}

hello.js通过exports将world作为模块的访问接口,可以提供给外部加载调用。

const hello = require('./hello')
hello.world()

Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

3.3、module

将整个对象作为访问接口,在项目中创建hello.js

const Hello = ()=>{
    let name
    this.setName = (val)=>{
        name = val
    }
    this.sayHello = ()=>{
        console.log("Hello " + name)
    }
}

module.exports = Hello

hello.js通过module.exports将Hello对象作为模块的访问接口,可以提供给外部加载调用。

const Hello = require('./hello')
let hello = new Hello()
hello.setName('World')
hello.sayHello()

exports返回模块函数,而module.exports返回模块本身。

4.模块作用域

模块作用域:模块作用域和函数作用域类似,在自定义模块中定义的变量、方法只能在当前模块内被访问,这种模块级别的访问限制。模块作用域的好处可以防止全局变量污染的问题。

// 模块作用域
const username = "张三";
function funcs(){
    console.log("大家好,我叫" + username);
};
5.模块的加载机制

模块在第一次加载后会被缓存,多次去调用 require() 模块的代码只会被执行一次。无论是内置模块、自定义模块、还是第三方模块,它们都会优先从缓存中加载,提高模块的加载效率。

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

  • 自定义模块的加载机制:当使用 require() 加载自定义模块时,必须以 ./ 或 .../ 开头的路径标识符。如果没有使用 ./ 或 .../ 的路径标识符,则 node.js 会把它当作内置模块或第三方模块去加载。

  • 第三方模块的加载机制:当传递给 require() 的模块标识符不是一个内置模块,也没有以 ./ 或 .../ 开头,则 node.js 会从当前的模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块,如果没有找到对应的第三方模块,会移动到上一层父目录中进行加载,直到文件系统的根目录。

相关推荐
Amd7949 天前
Nuxt.js 应用中的 imports:dirs 事件钩子详解
nuxt·目录·模块化·导入·钩子·灵活·可扩展
一颗冰淇淋1 个月前
前端模块化进化史:从全局 function 到 ES Modules
前端·模块化·cmd·commonjs·amd·es modules
Amd7942 个月前
Nuxt Kit中的 Nitro 处理程序
服务器·插件·处理程序·模块化·nuxt 3·预渲染·nitro
Amd7942 个月前
Nuxt Kit 中的上下文处理
vue·框架·nuxt·模块化·ssr·ssg·上下文
29747860482 个月前
QT基础之【模块】
模块·module·入门·基础·qt5
命运之手2 个月前
【Android】Glide模块工作原理
android·module·glide·工作原理·decoder
佚先森3 个月前
LSPatch制作内置模块应用软件无需root 教你制作内置应用
xposed·内置模块·lspatch·lsposed·免root
翠花也老了4 个月前
Maven 的模块化开发示例
java·maven·模块化
OceanSky65 个月前
Java module-info模块系统
java·模块化·封装·open·module-info·opens·provides
Amd7945 个月前
掌握 Nuxt 3 中的状态管理:实践指南
typescript·vuex·web开发·前后端分离·状态管理·模块化·nuxt 3