Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Diskussion über das Pfadmodul und gängige Methoden in Node.js

Eine kurze Diskussion über das Pfadmodul und gängige Methoden in Node.js

青灯夜游
青灯夜游nach vorne
2021-08-24 10:28:522850Durchsuche

Dieser Artikel führt Sie durch das Path-Modul in Node.js, stellt die Verwendung des Path-Moduls und die häufig verwendeten Path-Methoden vor.

Eine kurze Diskussion über das Pfadmodul und gängige Methoden in Node.js

Node.js Pfadmodul ist ein integriertes Modul, das Ihnen hilft, betriebssystemunabhängig mit Dateisystempfaden zu arbeiten. Das Path-Modul ist unerlässlich, wenn Sie CLI-Tools erstellen möchten, die OSX, Linux und Windows unterstützen. [Empfohlenes Lernen: „nodejs Tutorial“]

Auch wenn Sie einen Backend-Dienst erstellen, der nur unter Linux läuft, hilft das Pfadmodul dennoch dabei, Grenzfälle beim Bearbeiten von Pfaden zu vermeiden.

Im Folgenden beschreiben wir einige gängige Muster für die Verwendung des Pfadmoduls und warum Sie das Pfadmodul verwenden sollten, anstatt Pfade in Zeichenfolgen umzuwandeln.

Verwenden des Path-Moduls in Node

Die am häufigsten verwendete Methode im Path-Modul ist path.join(). Diese Methode kombiniert ein oder mehrere Pfadsegmente zu einem einzigen String, wie unten gezeigt: path.join()。该方法将一个或多个路径段合并为一个字符串,如下所示:

const path = require('path')

path.join('/path', 'to', 'test.txt') // '/path/to/test.txt'

您可能想知道为什么要使用 path.join() 方法而不是字符串拼接。

'/path' + '/' + 'to' + '/' + 'test.txt' // '/path/to/test.txt'

['/path', 'to', 'test.txt'].join('/') // '/path/to/test.txt'

原因主要有两个:

  • 对于 Windows 支持。Windows 使用反斜杠()而不是正斜杠(/)作为路径分隔符。path.join() 会为我们处理此问题。因为 path.join('data', 'test.txt') 在 Linux 和 OSX 以及 Windows 上都会返回 'data/test.txt'
  • 用于处理边缘情况。使用文件系统路径时,会弹出许多边缘情况。例如,如果您尝试手动连接两个路径,您可能会意外地得到重复的路径分隔符。path.join() 方法为我们处理开头和结尾的斜杠,如下所示:
path.join('data', 'test.txt') // 'data/test.txt'
path.join('data', '/test.txt') // 'data/test.txt'
path.join('data/', 'test.txt') // 'data/test.txt'
path.join('data/', '/test.txt') // 'data/test.txt'

常用的 Path 方法

path 模块还具有几个用于提取路径组件的方法,例如文件扩展名或目录。

path.extname() 方法以字符串形式返回文件扩展名:

path.extname('/path/to/test.txt') // '.test'

就像连接两条路径一样,获取文件扩展名比最初看起来要复杂。

如果 path 以 . 为结尾,将返回 .。如果文件无扩展名,又不以 . 结尾,或文件没有扩展名,将返回空值。

path.extname('/path/to/index.') // '.'

path.extname('/path/to/README') // ''

path.extname('/path/to/.gitignore') // ''

path 模块还有 path.basename()path.dirname() 方法,分别获取文件名(包括扩展名)和目录。

path.basename('/path/to/test.txt') // 'test.txt'

path.dirname('/path/to/test.txt') // '/path/to'

path.parse() 方法返回一个对象,该对象包含分为五个不同组件的路径,包括扩展名和目录。path.parse() 方法也是不带任何扩展名获取文件名的方法。

path.parse('/path/to/test.txt')

/*
{
  root: '/',
  dir: '/path/to',
  base: 'test.txt',
  ext: '.txt',
  name: 'test'
}
*/

使用 path.relative()

path.join()path.extname() 这样的方法涵盖了大多数使用文件路径的用例。但是 path 模块有几个更高级的方法,例如 path.relative()

path.relative(from, to) 方法根据当前工作目录返回从 from 到 to 的相对路径。 如果 from 和 to 都解析为相同的路径(在分别调用 path.resolve() 之后),则返回零长度字符串。

// 返回相对于第一条路径的第二条路径的路径
path.relative('/app/views/home.html', '/app/layout/index.html') // '../../layout/index.html'

如果给定了相对于一个目录的路径,但需要相对于另一个目录的路径,则 path.relative() 方法非常有用。例如,流行的文件系统监视库 Chokidar 提供了相对于监视目录的路径。

const watcher = chokidar.watch('mydir')

// 如果用户添加 mydir/path/to/test.txt,则会打印 mydir/path/to/test.txt
watcher.on('add', path => console.log(path))

这就是为什么大量的使用 Chokidar 工具。如常见的 Gatsby 或 webpack,其在内部也大量使用 path.relative() 方法。

例如,Gatsby 使用 path.relative() 方法帮助同步静态文件目录。

export const syncStaticDir = (): void => {
  const staticDir = nodePath.join(process.cwd(), `static`)
  chokidar
    .watch(staticDir)
    .on(`add`, path => {
      const relativePath = nodePath.relative(staticDir, path)
      fs.copy(path, `${process.cwd()}/public/${relativePath}`)
    })
    .on(`change`, path => {
      const relativePath = nodePath.relative(staticDir, path)
      fs.copy(path, `${process.cwd()}/public/${relativePath}`)
    })
}

现在,假设用户向 static 目录添加了一个新文件 main.js。Chokidar 调用 on('add') 事件处理程序,路径设置为 static/main.js。但是,当您将文件复制到 /public 时,不需要额外的 static/

调用 path.relative('static', 'static/main.js') 返回 static/main.js 相对于 static 的路径,这正是您想要将 static 的内容复制到 public

// 返回 'path\to\test.txt',与操作系统无关
path.win32.join('path', 'to', 'test.txt')

// 返回 'path/to/test.txt',与操作系统无关
path.posix.join('path', 'to', 'test.txt')

Sie fragen sich vielleicht, warum Sie die Methode path.join() anstelle der String-Verkettung verwenden sollten. 🎜
// 'https://api.mydomain.app/api/v2/me'
'https://api.mydomain.app/' + path.join('api', 'v2', 'me')
🎜Es gibt zwei Hauptgründe: 🎜
  • 🎜Für Windows-Unterstützung🎜. Windows verwendet Backslashes () anstelle von Schrägstrichen (/) als Pfadtrennzeichen. path.join() erledigt das für uns. Weil path.join('data', 'test.txt') unter Linux und OSX sowie Windows 'data/test.txt' zurückgibt.
  • 🎜Wird zur Bearbeitung von Randfällen verwendet🎜. Bei der Verwendung von Dateisystempfaden treten viele Randfälle auf. Wenn Sie beispielsweise versuchen, zwei Pfade manuell zu verketten, erhalten Sie möglicherweise versehentlich doppelte Pfadtrennzeichen. Die Methode path.join() verarbeitet die führenden und abschließenden Schrägstriche für uns, wie unten gezeigt:
rrreee

🎜Üblicherweise verwendet Die Pfadmethoden 🎜🎜🎜Das Pfadmodul verfügt außerdem über mehrere Methoden zum Extrahieren von Pfadkomponenten, wie z. B. Dateierweiterungen oder Verzeichnissen. Die Methode 🎜🎜path.extname() gibt die Dateierweiterung als Zeichenfolge zurück: 🎜rrreee🎜Wie die Verkettung zweier Pfade ist das Abrufen der Dateierweiterung komplizierter, als es zunächst scheint. 🎜🎜Wenn der Pfad mit . endet, wird . zurückgegeben. Wenn die Datei keine Erweiterung hat und nicht mit . endet oder die Datei keine Erweiterung hat, wird ein Nullwert zurückgegeben. 🎜rrreee🎜Das Pfadmodul verfügt außerdem über die Methoden path.basename() und path.dirname(), um den Dateinamen (einschließlich Erweiterung) bzw. das Verzeichnis zu erhalten. 🎜rrreee🎜Die Methode path.parse() gibt ein Objekt zurück, das den Pfad enthält, aufgeteilt in fünf verschiedene Komponenten, einschließlich Erweiterung und Verzeichnis. Die Methode path.parse() ist auch eine Möglichkeit, den Dateinamen ohne Erweiterung abzurufen. 🎜rrreee

🎜Verwenden Sie path.relative()🎜🎜🎜wie path.join() und path. Methoden wie extname() decken die meisten Anwendungsfälle ab, in denen Dateipfade verwendet werden. Das Pfadmodul verfügt jedoch über mehrere erweiterte Methoden, wie zum Beispiel path.relative(). 🎜🎜path.relative(from, to)-Methode gibt den relativen Pfad von from nach to basierend auf dem aktuellen Arbeitsverzeichnis zurück. Wenn from und to beide in denselben Pfad aufgelöst werden (nach dem jeweiligen Aufruf von path.resolve()), wird eine Zeichenfolge der Länge Null zurückgegeben. 🎜rrreee🎜Die Methode path.relative() ist nützlich, wenn Sie einen Pfad relativ zu einem Verzeichnis erhalten, aber einen Pfad relativ zu einem anderen Verzeichnis benötigen. Beispielsweise stellt die beliebte Dateisystemüberwachungsbibliothek Chokidar🎜 Pfade relativ zum überwachten Verzeichnis bereit. 🎜rrreee🎜Deshalb wird das Tool Chokidar🎜 stark genutzt. Beispielsweise verwenden das gängige Gatsby- oder Webpack-Programm die Methode path.relative() auch intern häufig. 🎜🎜Gatsby verwendet beispielsweise die Methode path.relative(), um die Synchronisierung statischer Dateiverzeichnisse zu unterstützen. 🎜rrreee🎜Angenommen, der Benutzer fügt dem Verzeichnis static eine neue Datei main.js hinzu. Chokidar ruft den Ereignishandler on('add') auf, wobei der Pfad auf static/main.js festgelegt ist. Wenn Sie die Datei jedoch nach /public kopieren, ist das zusätzliche static/ nicht erforderlich. 🎜🎜Rufen Sie path.relative('static', 'static/main.js') auf, um static/main.js relativ zu static zurückzugeben Der Pfad, in den Sie den Inhalt von static nach public kopieren möchten. 🎜

跨操作系统路径和 URL

默认情况下,path 模块会根据 Node 进程运行的操作系统自动在 POSIX(OSX、Linux)和 Windows 模式之间切换。

但是,path 模块确实可以在 POSIX 上使用 Windows path 模块,反之亦然。path.posixpath.win32 属性分别包含 path 模块的 Posix 和 Windows 版本。

// 返回 'path\to\test.txt',与操作系统无关
path.win32.join('path', 'to', 'test.txt')

// 返回 'path/to/test.txt',与操作系统无关
path.posix.join('path', 'to', 'test.txt')

在大多数情况下,根据检测到的操作系统自动切换 path 模块是正确的行为。但是,使用 path.posixpath.win32 属性对于总是希望输出 Windows 或 Linux 样式路径的测试或应用程序可能会有所帮助。

例如,一些应用程序使用 path.join()path.extname() 等方法处理 URL 路径。

// 'https://api.mydomain.app/api/v2/me'
'https://api.mydomain.app/' + path.join('api', 'v2', 'me')

这种方法适用于 Linux 和 OSX,但如果有人试图将您的应用程序部署到一些无服务器上会发生什么?

你最终会得到 https://api.mydomain.app/api\v2\me,这不是有效的 URL!如果使用 path 模块操作 URL,则应使用 path.posix

原文地址:https://juejin.cn/post/6997799224213504037

作者:lio_zero

更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über das Pfadmodul und gängige Methoden in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen