首頁  >  文章  >  web前端  >  淺談Node.js中的path模組和常用方法

淺談Node.js中的path模組和常用方法

青灯夜游
青灯夜游轉載
2021-08-24 10:28:522850瀏覽

本篇文章帶大家來了解Node.js中的 Path 模組,介紹一下 Path 模組的用法,以及常用的 Path 方法。

淺談Node.js中的path模組和常用方法

Node.js path 模組是一個內建模組,可協助您以獨立於作業系統的方式使用檔案系統路徑。如果要建立支援 OSX、Linux 和 Windows 的 CLI 工具,則 Path 模組是必不可少的。 【推薦學習:《nodejs 教學》】

即使您正在建置一個只在 Linux 上執行的後端服務,path 模組仍然有助於在操作路徑時避免邊緣情況。

下面我們將描述一些使用 path 模組的常見模式,以及為什麼您應該使用 path 模組而不是將路徑操縱成字串。

在 Node 中使用 Path 模組

path 模組中最常用的方法是 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 的路徑。

跨操作系统路径和 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

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

以上是淺談Node.js中的path模組和常用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除