NodeJs模块化之上半部分

news2024/11/24 7:39:40

模块化

什么是模块化

模块化是指解决一个复杂问题时,自顶向下 逐层把系统 拆解 成若干 模块 的过程。

对于整个系统来说,模块是可组合、分解和更换的单元。

编程领域中的模块化

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

把代码进行模块化拆分的好处:

  • 提高了代码的复用性
  • 提高了代码的可维护性
  • 可以实现按需加载

更多精彩内容,请微信搜索“前端爱好者戳我 查看

模块化规范

模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则。

例如:

使用什么样的语法格式来引用模块

在模块中使用什么样的语法格式向外暴露成员

模块化规范的好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用,利人利己。

模块化实例 – nodejs

模块 – a.js

function strParse(str) {
    console.log(str)
}

module.exports = strParse

引用模块 index.js

var strParse = require('./a') 

strParse('hello world!')

Node.js 中的模块化

官网地址:https://nodejs.cn/api/

Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:

  • 全局模块:全局对象和全局变量
  • 核心模块:NodeJs自带的系统模块
  • 自定义模块:用户创建的每个 .js 文件,都是自定义模块

全局模块

定义:随时随地都可以访问,不需要引用还包含全局对象全局变量

核心模块

定义:不需要单独下载,可以直接使用 require() 引入的模块。

常见的核心模块

  • path模块
  • fs模块
  • http模块

自定义模块

定义:自己封装的模块,可以直接使用 require() 引入。

Node.js 常见的核心模块

官网地址:https://nodejs.cn/api/

path模块

地址:https://nodejs.cn/api/path.html

API归纳:

  • 路径相关
  • 文件相关
  • 路径解析

路径相关

  • normalize:用于规范化给定的path
  • join:将所有给定的path片段连接在一起
  • resolve:解析为绝对路径
  • isAbsolute:检查当前path是否为绝对路径

path.normalize(path)

地址:https://nodejs.cn/api/path.html#pathnormalizepath

path.normalize() 方法规范化给定的 path,解析 ‘…’ 和 ‘.’ 片段。

  • path <string>
  • 返回:

当找到多个连续的路径片段分隔符(例如 POSIX 上的 / 和 Windows 上的 \ 或 /)时,则它们将被平台特定路径片段分隔符(POSIX 上的 / 和 Windows 上的 \)的单个实例替换。 保留尾随的分隔符。

如果 path 是零长度字符串,则返回 ‘.’,表示当前工作目录。

例如,在 POSIX 上:

path.normalize('/foo/bar//baz/asdf/quux/..');
// Returns: '/foo/bar/baz/asdf'

在 Windows 上:

path.normalize('C:\\temp\\\\foo\\bar\\..\\');
// Returns: 'C:\\temp\\foo\\'
var path = require('path'); 
var pathStr =  path.normalize("a/b//c///d\\\e") 
console.log(pathStr) // a\b\c\d\e

path.join([…paths])

地址:https://nodejs.cn/api/path.html#pathjoinpaths

path.join() 方法使用特定于平台的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。

  • …paths <string> 路径或路径片段的序列
  • 返回:** **

零长度的 path 片段被忽略。 如果连接的路径字符串是零长度字符串,则将返回 ‘.’,表示当前工作目录。

var {join} = require('path')

console.log(join('a','b','/c','//d')) // a\b\c\d 
console.log(join('a','/b','../c','/d')) //a\c\d

或者

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar');
// Throws 'TypeError: Path must be a string. Received {}'

如果任何路径片段不是字符串,则抛出 TypeError。

path.resolve([…paths])

path.resolve() 方法将路径或路径片段的序列解析为绝对路径。

  • …paths <string> 路径或路径片段的序列
  • 返回: <string>

给定的路径序列从右到左处理,每个后续的 path 会被追加到前面,直到构建绝对路径。 例如,给定路径段的顺序: /foo、/bar、baz,调用 path.resolve(‘/foo’, ‘/bar’, ‘baz’) 将返回 /bar/baz,因为 ‘baz’ 不是绝对路径,但 ‘/bar’ + ‘/’ + ‘baz’ 是。

如果在处理完所有给定的 path 片段之后,还没有生成绝对路径,则使用当前工作目录。

生成的路径被规范化,并删除尾部斜杠(除非路径解析为根目录)。

零长度的 path 片段被忽略。

如果没有传入 path 片段,则 path.resolve() 将返回当前工作目录的绝对路径。

var {resolve} = require('path')

console.log(resolve('a/b/c')) 

或者

path.resolve('/foo/bar', './baz');
// Returns: '/foo/bar/baz'

path.resolve('/foo/bar', '/tmp/file/');
// Returns: '/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// If the current working directory is /home/myself/node,
// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

path.isAbsolute(path)

地址:https://nodejs.cn/api/path.html#pathisabsolutepath

path.isAbsolute() 方法确定 path 是否为绝对路径。

  • path <string>
  • 返回:

如果给定的 path 是零长度字符串,则将返回 false。

例如,在 POSIX 上:


var {isAbsolute} = require('path')

console.log(isAbsolute('./a/b/c'))
console.log(isAbsolute('/a/b/c'))

或者

path.isAbsolute('/foo/bar'); // true
path.isAbsolute('/baz/..');  // true
path.isAbsolute('qux/');     // false
path.isAbsolute('.');        // false

文件相关

  • basename:返回路径中最后一部分的文件名
  • extname:返回路径最后文件名的扩展名
  • dirname:返回path路径中的目录名

path.basename(path[, suffix])

地址:https://nodejs.cn/api/path.html#pathbasenamepath-suffix

path.basename() 方法返回 path 的最后一部分,类似于 Unix basename 命令。 忽略尾随 目录分隔符。

  • path <string>
  • suffix <string> 要删除的可选后缀
  • 返回: <string>
path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// Returns: 'quux'
var {basename} = require('path')

console.log(basename("/a/b/c.txt")) // c.txt

path.extname(path)

地址:https://nodejs.cn/api/path.html#pathextnamepath

path.extname() 方法返回 path 的扩展名,即 path 的最后一部分中从最后一次出现的 .(句点)字符到字符串的结尾。 如果 path 的最后一部分中没有 .,或者除了 path 的基本名称(参见 path.basename())的第一个字符之外没有 . 个字符,则返回空字符串。

  • path <string>
  • 返回: <string>
path.extname('index.html');
// Returns: '.html'

path.extname('index.coffee.md');
// Returns: '.md'

path.extname('index.');
// Returns: '.'

path.extname('index');
// Returns: ''

path.extname('.index');
// Returns: ''

path.extname('.index.md');
// Returns: '.md'
var {extname} = require('path')
console.log(extname("/a/b/c.txt.exe")) // .exe

path.dirname(path)

地址:https://nodejs.cn/api/path.html#pathdirnamepath

path.dirname() 方法返回 path 的目录名,类似于 Unix dirname 命令。 尾随的目录分隔符被忽略,见 path.sep。

  • path <string>
  • 返回: <string>
path.dirname('/foo/bar/baz/asdf/quux');
// Returns: '/foo/bar/baz/asdf'
var {dirname} = require('path')  
console.log(dirname('/a/b/c.txt')) // /a/b

路径解析

  • parse:返回一个对象,其属性表示 path 的有效元素
  • format:把对象转为一个路径字符串

path.parse(path)

地址:https://nodejs.cn/api/path.html#pathparsepath

path.parse() 方法返回一个对象,其属性表示 path 的重要元素。 尾随的目录分隔符被忽略,见 path.sep。

返回的对象将具有以下属性:

  • dir <string>
  • root <string>
  • base <string>
  • name <string>
  • ext <string>
path.parse('/home/user/dir/file.txt');
// Returns:
// { root: '/',
//   dir: '/home/user/dir',
//   base: 'file.txt',
//   ext: '.txt',
//   name: 'file' }
var {parse} = require('path') 
console.log(parse('/a/b/c.txt')) // { root: '/', dir: '/a/b', base: 'c.txt', ext: '.txt', name: 'c' }

如果 path 不是字符串,则抛出 TypeError。

path.format(pathObject)

地址:https://nodejs.cn/api/path.html#pathformatpathobject

path.format() 方法从对象返回路径字符串。 这与 path.parse() 相反。

pathObject <Object> 任何具有以下属性的 JavaScript 对象:

  • dir <string>

  • root <string>

  • base <string>

  • name <string>

  • ext <string>

  • 返回: <string>

当向 pathObject 提供属性时,存在一个属性优先于另一个属性的组合:

  • 如果提供 pathObject.dir,则忽略 pathObject.root
  • 如果 pathObject.base 存在,则忽略 pathObject.ext 和 pathObject.name
// If `dir`, `root` and `base` are provided,
// `${dir}${path.sep}${base}`
// will be returned. `root` is ignored.
path.format({
  root: '/ignored',
  dir: '/home/user/dir',
  base: 'file.txt',
});
// Returns: '/home/user/dir/file.txt'

// `root` will be used if `dir` is not specified.
// If only `root` is provided or `dir` is equal to `root` then the
// platform separator will not be included. `ext` will be ignored.
path.format({
  root: '/',
  base: 'file.txt',
  ext: 'ignored',
});
// Returns: '/file.txt'

// `name` + `ext` will be used if `base` is not specified.
path.format({
  root: '/',
  name: 'file',
  ext: '.txt',
});
// Returns: '/file.txt'

// The dot will be added if it is not specified in `ext`.
path.format({
  root: '/',
  name: 'file',
  ext: 'txt',
});
// Returns: '/file.txt'
var {format} = require("path")

var pathObj = {
    root: '/',
    dir: '/hello/world',
    base: 'demo.txt',
    ext: '.txt',
    name: 'demo'
}

console.log(format(pathObj)) ///hello/world\demo.txt

参考文档

  • https://blog.csdn.net/m0_52177571/article/details/124258165
  • https://nodejs.cn/api/documentation.html

前端爱好者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

( 位运算 ) 231. 2 的幂 / 342. 4的幂 ——【Leetcode每日一题】

❓题目一 231. 2 的幂 难度&#xff1a;简单 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2 x n 2^x n2x &#xff0c;则认为 n 是 2 的幂次方。 …

10款必装IDEA开发神器

那些IDEA开发神器 1.Material Theme Ul 安装步骤 打开IDEA,点击File -> Settings。在Settings窗口中&#xff0c;选择Appearance & Behavior -> Appearance。在Appearance选项卡下&#xff0c;找到Theme并选择Material Theme Ul。点击Apply按钮&#xff0c;然后点…

Liunx基础命令 - mv剪切命令

mv命令 – 移动或改名文件 mv命令来自英文单词”move“的缩写&#xff0c;中文译为”移动“&#xff0c;其功能与英文含义相同&#xff0c;能够用于对文件进行剪切和重命名操作。这是一个被高频使用的文件管理命令&#xff0c;我们需要留意它与复制命令的区别。cp命令是用于文…

C++标准库中的锁

C标准库中的锁 std::mutex.lock是我们在C中比较常见的锁&#xff0c;我们使用std::mutex.lock方法时&#xff0c;同时需要考虑何时使用std:mutex.unlock方法去解锁。如果在复杂的多线程情况下&#xff0c;加锁、解锁的时机很难把握&#xff0c;也不好实现。 RAII原则是所有的…

c++中this指针的使用

首先&#xff0c;我们都知道类的成员函数可以访问类的数据&#xff0c;那么成员函数如何知道哪个对象的数据成员要被操作呢&#xff1f; 原因在于每个对象都拥有一个指针&#xff1a;this指针&#xff0c;每一个对象都能通过this指针来访问自己的地址。 this 指针是所有成员函…

NOSQL——redis的安装,配置与简单操作

1.缓存的相关知识 1.1 缓存的概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度&#xff0c;在中间对速度较慢的一方起到加速作用&#xff0c;比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据&#xff0c;内存是保存CPU经常访问硬盘的数据&#xff0c;而且硬…

Git简易教程

安装与配置 教程链接 代码上传到远程仓库 workspace&#xff1a;当前所在的工作目录 stagingarea&#xff1a;修改暂存区 loacl repository&#xff1a;本地仓库 remote respository &#xff1a;远程仓库 我们首先在workspace目录编写代码、修改文件&#xff0c;然后需要使用…

三十五、nacos注册中心集群搭建、网关、过滤器

1、nacos注册中心集群的搭建 要想搭建nacos集群模式&#xff0c;这些集群中的每台nacos服务&#xff0c;都必须连接同一个数据库。因为我们的nacos都放在同一台主机上&#xff0c;所以我们必须为每台nacos起不同的端口号。 1.1修改nacos端口号 8849 8850 8851 E:\software\naco…

2023/5/15总结

Java基础&#xff08;4&#xff09; 标准类制作 成员变量使用private修饰构造方法&#xff1a;提供一个无参构造方法&#xff0c;提供一个带多个参数的构造方法 成员方法&#xff1a;提供每一个成员变量对应的setXxx()/getXxx(),提供一个显示对象信息show()创建对象并为其成员…

服务端渲染

服务端渲染 和 前后端分离&#xff01; 渲染 什么是渲染呢 ? 其实很简单, 就是把数据反应在页面上&#xff0c;说白了, 就是利用 js 的语法, 把某些数据组装成 html 结构的样子, 放在页面上展示。 举个例子 : 1. 准备一段 html 结构 <h1>hello world</h1> <di…

Android之 Service服务详解

一 四大组件 1.1 Activity组件&#xff0c;它一个单独的窗口&#xff0c;程序流程都必须在Activity中运行&#xff0c;所有它是最基本的模块。 1.2 service组件&#xff0c;用于在后台完成用户指定的操作。 1.3 content provider组件&#xff0c;会为所有的应用准备一个内容…

零知识证明:重要构造

文章目录 ZKP for NPBlums ZK PoK for HCCompletenessSoundnessZero KnowledgeWI of n-parallelized versionsProof of KnowledgeSpecial Soundness Constant Round ZKPFLS ParadigmGK Paradigm 在 零知识证明&#xff1a;安全定义 中介绍了 ZKP 的一些安全性定义&#xff0c;…

TFT驱动ST7789使用总结

最近在使用一款TFT驱动芯片ST7789&#xff0c;在阅读芯片数据手册和液晶屏数据手册时&#xff0c;发现总是对不上&#xff0c;芯片手册中&#xff0c;有好几个引脚&#xff0c;一会儿是这个作用&#xff0c;一会儿又变成另一种作用&#xff0c;实在是让人感到混淆。网上找了好久…

第三十六天学习记录:C语言进阶:指针详解Ⅳ

指向函数指针数组的指针 指向函数指针数组的指针是一个指针&#xff0c;指针指向一个数组&#xff0c;数组的元素都是函数指针。 int(*pfArr[4])(int, int);//pfArr是一个数组-函数指针的数组int(*(*ppfArr)[4])(int, int) &pfArr;//ppfArr是一个数组指针&#xff0c;指针…

网络进阶学习:重要网络协议(tcp协议,udp协议,http协议)

重要网络协议&#xff08;tcp协议&#xff0c;udp协议&#xff0c;http协议&#xff09; 网络协议是什么?TCP协议UDP协议HTTP协议TCP与UDP的职能区别⭐TCP职能⭐就TCP原理层面说应该分为三部分建立连接数据传输断开连接 ⭐UDP职能⭐就UDP原理层面说应该分为三部分发送数据数据…

单链表(增、删、查、改)的详细介绍 必看!!!

文章目录 链表介绍单链表初始化单链表打印增加节点单链表的头插单链表的尾插在给定位置之后插入在给定位置之前插入 删除节点单链表的头删单链表的尾删删除给定位置之后的节点删除给定位置处的节点 查找节点修改节点单链表销毁 链表介绍 链表是一种物理存储单元上非连续、非顺序…

【Mybatis】如何实现ORM映射-二

唠嗑部分 上篇文章我们说了Mybatis基本的CRUD操作及工具类的封装&#xff0c;相关文章&#xff1a; 【Mybatis】简单入门及工具类封装-一 大家都知道&#xff0c;Mybatis是半自动化的ORM框架&#xff0c;那么它到底是如何帮我们完成ORM映射的呢&#xff1f; 这就是本篇文章和…

SpringBoot整合Dubbo+Zookeeper

第一步、使用IDE创建一个SpringBoot项目 第二步、启动一个Zookeeper服务&#xff08;如果是第一次安装且没有配置zoo.cfg&#xff0c;此时会报出zookeeper服务器会提示缺少zoo.cfg文件&#xff09; 在zookeeper安装目录下的conf文件夹内有一个名为zoo_sample.cfg的配置文件&a…

[深度学习思想] ControlNet 工作原理

Stable Diffusion (2021 https://arxiv.org/abs/2112.10752) 带领了vision领域&#xff0c;具体是AI绘画领域达到了一个新高度。但是可控性成为使用的一个大瓶颈。Controlnet (2023 https://arxiv.org/abs/2302.05543) 提出一个深度学习模型框架&#xff0c;很好解决这个问题&a…

Liunx基础命令 - touch命令

touch命令 – 创建空文件与修改时间戳 touch命令的功能是用于创建空文件与修改时间戳。如果文件不存在&#xff0c;则会创建出一个空内容的文本文件&#xff1b;如果文件已经存在&#xff0c;则会对文件的Atime&#xff08;访问时间&#xff09;和Ctime&#xff08;修改时间&a…