>  기사  >  웹 프론트엔드  >  Node.js의 경로 모듈과 일반적인 메소드에 대한 간략한 토론

Node.js의 경로 모듈과 일반적인 메소드에 대한 간략한 토론

青灯夜游
青灯夜游앞으로
2021-08-24 10:28:522850검색

이 글에서는 Node.js의 Path 모듈을 살펴보고 Path 모듈의 사용법과 일반적으로 사용되는 Path 메서드를 소개합니다.

Node.js의 경로 모듈과 일반적인 메소드에 대한 간략한 토론

Node.js path 모듈은 운영 체제 독립적인 방식으로 파일 시스템 경로 작업을 돕는 내장 모듈입니다. OSX, Linux 및 Windows를 지원하는 CLI 도구를 구축하려면 Path 모듈이 필수적입니다. [추천 학습: "nodejs Tutorial"]

Linux에서만 실행되는 백엔드 서비스를 구축하는 경우에도 경로 모듈은 경로를 조작할 때 엣지 케이스를 피하는 데 도움이 됩니다.

아래에서는 경로 모듈을 사용하는 몇 가지 일반적인 패턴과 경로를 문자열로 조작하는 대신 경로 모듈을 사용해야 하는 이유를 설명합니다.

Node에서 Path 모듈 사용

path 모듈에서 가장 일반적으로 사용되는 방법은 path.join()입니다. 이 메서드는 아래와 같이 하나 이상의 경로 세그먼트를 단일 문자열로 결합합니다. 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')

문자열 연결 대신 path.join() 메서드를 사용해야 하는 이유가 궁금할 수도 있습니다. 🎜
// 'https://api.mydomain.app/api/v2/me'
'https://api.mydomain.app/' + path.join('api', 'v2', 'me')
🎜두 가지 주요 이유가 있습니다: 🎜
  • 🎜Windows 지원🎜. Windows에서는 경로 구분 기호로 슬래시(/) 대신 백슬래시()를 사용합니다. path.join()이 이를 처리합니다. Windows뿐만 아니라 Linux, OSX에서도 path.join('data', 'test.txt')'data/test.txt'를 반환하기 때문입니다.
  • 🎜특정 사례를 처리하는 데 사용됩니다🎜. 파일 시스템 경로를 사용할 때 나타나는 극단적인 경우가 많이 있습니다. 예를 들어 두 경로를 수동으로 연결하려고 하면 실수로 중복된 경로 구분 기호가 나타날 수 있습니다. path.join() 메소드는 아래와 같이 선행 및 후행 슬래시를 처리합니다.
rrreee

🎜Commonly 사용된 경로 방법 🎜🎜🎜 경로 모듈에는 파일 확장자나 디렉터리와 같은 경로 구성 요소를 추출하는 여러 가지 방법도 있습니다. 🎜🎜path.extname() 메서드는 파일 확장자를 문자열로 반환합니다. 🎜rrreee🎜 두 경로를 연결하는 것처럼 파일 확장자를 가져오는 것은 처음에 보이는 것보다 더 복잡합니다. 🎜🎜경로가 .로 끝나면 .가 반환됩니다. 파일에 확장자가 없고 .로 끝나지 않거나 파일에 확장자가 없으면 null 값이 반환됩니다. 🎜rrreee🎜경로 모듈에는 파일 이름(확장명 포함)과 디렉터리를 각각 가져오는 path.basename()path.dirname() 메서드도 있습니다. 🎜rrreee🎜 path.parse() 메서드는 확장 프로그램과 디렉터리를 포함하여 5개의 서로 다른 구성 요소로 구분된 경로가 포함된 객체를 반환합니다. path.parse() 메서드는 확장자 없이 파일 이름을 가져오는 방법이기도 합니다. 🎜rrreee

🎜 path.join()path와 같이 <code>path.relative()🎜🎜🎜를 사용하세요. extname()과 같은 메소드는 파일 경로가 사용되는 대부분의 사용 사례를 다룹니다. 그러나 경로 모듈에는 path.relative()와 같은 몇 가지 고급 메서드가 있습니다. 🎜🎜path.relative(from, to) 메서드는 현재 작업 디렉터리를 기준으로 from에서 to까지의 상대 경로를 반환합니다. fromto가 모두 동일한 경로로 확인되면(각각 path.resolve() 호출 후) 길이가 0인 문자열이 반환됩니다. 🎜rrreee🎜path.relative() 메서드는 한 디렉터리에 대한 상대 경로가 제공되었지만 다른 디렉터리에 대한 상대 경로가 필요한 경우 유용합니다. 예를 들어, 널리 사용되는 파일 시스템 모니터링 라이브러리 Chokidar🎜는 감시 디렉터리에 대한 상대 경로를 제공합니다. 🎜rrreee🎜이것이 바로 Chokidar🎜 도구가 많이 사용되는 이유입니다. 예를 들어 일반적인 Gatsby나 webpack도 내부적으로 path.relative() 메서드를 광범위하게 사용합니다. 🎜🎜예를 들어 Gatsby는 path.relative() 메서드를 사용하여 정적 파일 디렉터리를 동기화하는 데 도움을 줍니다. 🎜rrreee🎜이제 사용자가 static 디렉터리에 새 파일 main.js를 추가한다고 가정해 보겠습니다. Chokidar는 경로가 static/main.js로 설정된 on('add') 이벤트 핸들러를 호출합니다. 그러나 파일을 /public에 복사하면 추가 static/가 필요하지 않습니다. 🎜🎜path.relative('static', 'static/main.js')를 호출하여 static에 상대적인 static/main.js를 반환합니다. static의 내용을 public으로 복사하려는 경로입니다. 🎜

跨操作系统路径和 URL

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

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

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

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

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

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

// &#39;https://api.mydomain.app/api/v2/me&#39;
&#39;https://api.mydomain.app/&#39; + path.join(&#39;api&#39;, &#39;v2&#39;, &#39;me&#39;)

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

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

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

作者:lio_zero

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

위 내용은 Node.js의 경로 모듈과 일반적인 메소드에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제