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 文件夹中加载第三方模块,如果没有找到对应的第三方模块,会移动到上一层父目录中进行加载,直到文件系统的根目录。

相关推荐
跳跳的向阳花4 天前
01、NodeJS学习笔记,第一节:Node.js初识与内置模块
学习·npm·node.js·模块化··内置模块·模块加载机制
江上清风山间明月10 天前
Flutter编译Module was compiled with an incompatible version of Kotlin错误解决
android·flutter·kotlin·version·module·incompatible·compiled
布兰妮甜10 天前
Angular模块化应用构建详解
javascript·angular.js·模块化
需己以听的以听15 天前
4.模块化技术之子程序
sap·gui·abap·模块化·改行学it·子程序
hope_wisdom15 天前
实战设计模式之简介
设计模式·架构·软件工程·模块化·封装
Amd7942 个月前
Nuxt.js 应用中的 imports:dirs 事件钩子详解
nuxt·目录·模块化·导入·钩子·灵活·可扩展
一颗冰淇淋3 个月前
前端模块化进化史:从全局 function 到 ES Modules
前端·模块化·cmd·commonjs·amd·es modules
Amd7943 个月前
Nuxt Kit中的 Nitro 处理程序
服务器·插件·处理程序·模块化·nuxt 3·预渲染·nitro
Amd7943 个月前
Nuxt Kit 中的上下文处理
vue·框架·nuxt·模块化·ssr·ssg·上下文
29747860484 个月前
QT基础之【模块】
模块·module·入门·基础·qt5