>  기사  >  웹 프론트엔드  >  Node.js에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API에 대한 자세한 설명

Node.js에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API에 대한 자세한 설명

青灯夜游
青灯夜游앞으로
2021-04-12 10:10:191711검색

이 글에서는 Nodejs에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API를 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

Node.js에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API에 대한 자세한 설명

관련 권장 사항: "nodejs Tutorial"

Node를 일상적인 개발에 사용할 때 파일 시스템 및 경로 작업과 같은 몇 가지 기본 API를 사용하게 되며 모든 사람이 쉽게 이해하고 직접 사용할 수 있도록 여기에 정리했습니다. .

여기서는 전부가 아닌 가장 일반적으로 사용되는 것만 소개합니다. 더 포괄적인 정보를 보려면 공식 문서를 살펴보세요.

쓸데없는 말을 하지 말고 더 많은 코드를 작성하세요.

프로세스 모듈


먼저 현재 Node 프로세스와 관련된 글로벌 환경 정보를 제공하는 프로세스 모듈을 소개합니다. 이후 API에서 사용됩니다.

// 内置模块,直接使用
const process = require('process');

process.cwd()

현재 Node 프로세스가 실행되는 디렉터리를 반환하는 함수입니다. 예를 들어 일반적인 시나리오는 다음과 같습니다.

A 노드 모듈 A는 NPM을 통해 게시된 프로젝트 모듈 AB에서 사용됩니다. AB 프로젝트에서 파일을 조작해야 하는 경우 process.cwd()를 사용하여 B를 얻을 수 있습니다. code > 프로젝트 경로입니다. A 通过 NPM 发布,项目 B 中使用了模块 A。在 A 中需要操作 B 项目下的文件时,就可以用 process.cwd() 来获取 B 项目的路径。

const cwd = process.cwd(); // 输出:/Users/xiaolian/Code/node-api-test

process.argv

在终端通过 Node 执行命令的时候,通过 process.argv 可以获取传入的命令行参数,返回值是一个数组:

  • 0: Node 路径(一般用不到,直接忽略)
  • 1: 被执行的 JS 文件路径(一般用不到,直接忽略)
  • 2~n: 真实传入命令的参数**

所以,我们只要从 process.argv[2] 开始获取就好了。一般都是这样用

const args = process.argv.slice(2);

直接获取我们想要的参数。

process.env

返回一个对象,存储当前环境相关的所有信息,一般很少直接用到。

一般我们会在 process.env 上挂载一些变量标识当前的环境。比如最常见的用 process.env.NODE_ENV 区分 developmentproduction。在 vue-cli 的源码中也经常会看到 process.env.VUE_CLI_DEBUG 标识当前是不是一 DEBUG 模式。

这里提一个 webpack 的插件 DefinePlugin,在日常的构建流程中,我们经常会通过这个插件来注入不同的全局变量,从而执行不同的构建流程,并且代码中的 process.env.xxx 会被替换成具体的值,在 Terser 压缩阶段会将 deadCode 移除,优化代码体积。

process.platform

这个用的不多,返回当前系统信息,枚举值如下:

console.log(process.platform);

// 'aix'
// 'darwin'  - macOS
// 'freebsd'
// 'linux' - linux
// 'openbsd'
// 'sunos'
// 'win32' - windows

Path 模块


// 内置模块,直接使用
const path = require('path');

Node 中几乎路径相关的操作都会使用这个模块。

这里就说 5 个最常用的:

path.join(...paths)

path.join 作用是将传入的多个路径拼成一个完整的路径。

const dPath = path.join('template', 'aaa', 'bbb', 'ccc', 'd.js');
// 输出: template/aaa/bbb/ccc/d.js

来看一个非常常见的场景,我们需要获取当前项目的 package.json 文件,就可以这样获取它的路径:

const pkgPath = path.join(process.cwd(), './package.json');
// 输出: /Users/xiaolian/Code/node-api-test/package.json

path.join 可以传入任意个路径,比如:

['package.json', 'README.md'].forEach(fileName => {
  const templateFilePath = path.join(process.cwd(), 'template', fileName);
  console.log(templateFilePath);
});
// 输出: /Users/xiaolian/Code/node-api-test/template/package.json
// 输出: /Users/xiaolian/Code/node-api-test/template/README.md

path.resolve(...paths)

path.resovlepath.join 的区别在于它的作用是将传入的多个路径和当前执行路径拼接成一个完整的绝对路径。

假设我现在 index.jsscripts 目录下,然后我在根目录下执行 node scripts/index.js,它的代码如下:

const dPath = path.resolve('aaa', 'bbb', 'ccc', 'd.js');
// 输出:  /Users/xiaolian/Code/node-api-test/aaa/bbb/ccc/d.js

一般情况下,当 path.resolve 的第一个参数为 ./ 时,可以直接理解和 path.join(processs.cwd(), '') 表现一致。

path.basename(path[, ext])

path.basename 返回指定 path 最后一个路径名,其中第二个参数 ext 可选,表示文件扩展名。比如:

console.log(path.basename('scripts/index.js'));  // index.js
console.log(path.basename('scripts/index.js', '.js'));  // 匹配到 .js,返回 index
console.log(path.basename('scripts/index.js', '.json'));  // 没匹配到,返回 index.js

path.dirname(path)

path.basename 对应,返回指定 path

console.log(path.basename('scripts/index.js'));  // scripts
console.log(path.basename('scripts/hook/index.js'));  // scripts/hook

process.argv🎜🎜🎜단말기가 Node를 통해 명령을 실행할 때 들어오는 명령줄 매개변수는 process.argv를 통해 얻을 수 있습니다. 반환값은 배열입니다: 🎜
  • 0: 노드 경로(일반적으로 사용되지 않음, 그냥 무시하세요)
  • 1: 실행된 JS 파일 경로(일반적으로 사용되지 않음, 그냥 무시하세요)
  • 2~n: 실제 수신 명령의 매개변수**
🎜따라서 process.argv[2]에서만 가져오면 됩니다. > . 🎜보통 이렇게 사용됩니다🎜: 🎜
console.log(path.basename('scripts/index.js'));  // .js
console.log(path.basename('README.md'));  // .md
🎜원하는 매개변수를 직접 가져옵니다. 🎜

🎜process.env🎜🎜🎜 직접적으로 거의 사용되지 않는 현재 환경과 관련된 모든 정보를 저장하는 객체를 반환합니다. 🎜🎜일반적으로 현재 환경을 식별하기 위해 process.env에 일부 변수를 마운트합니다. 예를 들어 개발생산을 구별하기 위해 가장 일반적으로 사용되는 process.env.NODE_ENV입니다. vue-cli의 소스 코드에는 현재 모드가 DEBUG인지 여부를 나타내는 process.env.VUE_CLI_DEBUG가 자주 표시됩니다. 🎜🎜다음은 웹팩 플러그인 DefinePlugin🎜입니다. , 일일 빌드 프로세스에서 우리는 종종 이 플러그인을 사용하여 다양한 전역 변수를 주입하여 다양한 빌드 프로세스를 실행하며, 코드의 process.env.xxx는 특정 값인 deadCode로 대체됩니다. 코드 크기를 최적화하기 위해 Terser 압축 단계에서 제거됩니다. 🎜

🎜process.platform🎜🎜🎜 많이 사용되지는 않습니다. 현재 시스템 정보를 반환합니다. 열거 값은 다음과 같습니다. 🎜
├── scripts
│   └── index.js
├── src
│   └── index.js
├── package.json
├── README.md

🎜Path 모듈🎜🎜🎜
const path = require('path');

console.log(path.join('package.json'));
console.log(path.resolve('package.json'));
console.log(path.join('src', 'index.js'));
console.log(path.resolve('src', 'index.js'));
console.log(path.join(process.cwd(), 'package.json'));
console.log(path.resolve('./', 'package.json'));
console.log(__filename);
console.log(__dirname);
🎜Node의 거의 🎜경로 관련 작업🎜에서 이 모듈을 사용합니다. 🎜🎜가장 일반적으로 사용되는 5가지 항목은 다음과 같습니다. 🎜

🎜path.join(...paths)🎜🎜🎜path.join은 다음과 같은 용도로 사용됩니다. add 전달된 여러 경로가 전체 경로로 결합됩니다. 🎜
-> node scripts/index.js
package.json
/Users/xiaolian/Code/A/package.json
src/index.js
/Users/xiaolian/Code/A/src/index.js
/Users/xiaolian/Code/A/package.json
/Users/xiaolian/Code/A/package.json
/Users/xiaolian/Code/A/scripts/index.js
/Users/xiaolian/Code/A/scripts
🎜매우 일반적인 시나리오를 살펴보겠습니다. 현재 프로젝트의 package.json 파일을 가져와야 하며 다음과 같은 경로를 얻을 수 있습니다. 🎜
// 内置模块,直接使用
const fs = require('fs');
🎜path.join 임의 개수의 경로에서(예: 🎜
const fs = require('fs');

fs.stat('a.js', function(err, stats) {
  console.log(stats);
});

🎜path.resolve(...paths)🎜🎜🎜path.resovle path.join 차이점은 여러 개의 수신 경로와 현재 실행 경로를 완전한 절대 경로로 연결하는 기능이라는 것입니다. 🎜🎜이제 scripts 디렉터리에 index.js가 있고 루트 디렉터리에서 node scripts/index.js를 실행한다고 가정해 보겠습니다. 🎜
export interface StatsBase8742468051c85b06f0a0af9e3e506b5c {
  isFile(): boolean;                 // 判断是否是一个文件
  isDirectory(): boolean;            // 判断是否一个目录

  size: T;                           // 大小(字节数)
  atime: Date;                       // 访问时间
  mtime: Date;                       // 上次文件内容修改时间
  ctime: Date;                       // 上次文件状态改变时间
  birthtime: Date;                   // 创建时间
}
🎜일반적으로 path.resolve의 첫 번째 매개변수가 ./일 때 바로 이해하고 path.join을 할 수 있습니다. (processs .cwd(), '')는 일관되게 작동합니다. 🎜

🎜path.basename(path[, ext])🎜🎜🎜path.basename은 지정된 경로의 마지막 경로를 반환합니다. code> 이름. 여기서 두 번째 매개변수 <code>ext는 선택사항이며 파일 확장자를 나타냅니다. 예: 🎜
const fs = require('fs');

try {
  const stats = fs.statSync('a.js');
} catch(e) {}

🎜path.dirname(path)🎜🎜🎜은 path.basename에 해당하고 지정된 경로를 반환합니다. code> 끝에 경로 이름 앞에 경로가 있습니다. 예: 🎜<pre class="brush:js;toolbar:false;">console.log(path.basename(&amp;#39;scripts/index.js&amp;#39;)); // scripts console.log(path.basename(&amp;#39;scripts/hook/index.js&amp;#39;)); // scripts/hook</pre><h3 data-id="heading-10"><strong>path.extname(path)</strong></h3> <p>和 <code>path.basename 对应,返回指定 path 最后一个路径名的文件扩展名(含小数点 .)。比如:

console.log(path.basename(&#39;scripts/index.js&#39;));  // .js
console.log(path.basename(&#39;README.md&#39;));  // .md

对比

最后再来对比一下各个路径相关的 API 的区别。

项目 A 的目录结构如下:

├── scripts
│   └── index.js
├── src
│   └── index.js
├── package.json
├── README.md

scripts/index.js 的代码如下:

const path = require('path');

console.log(path.join('package.json'));
console.log(path.resolve('package.json'));
console.log(path.join('src', 'index.js'));
console.log(path.resolve('src', 'index.js'));
console.log(path.join(process.cwd(), 'package.json'));
console.log(path.resolve('./', 'package.json'));
console.log(__filename);
console.log(__dirname);

然后,我们在项目 A 的跟目录下执行 node scripts/index.js,结果如下:

-> node scripts/index.js
package.json
/Users/xiaolian/Code/A/package.json
src/index.js
/Users/xiaolian/Code/A/src/index.js
/Users/xiaolian/Code/A/package.json
/Users/xiaolian/Code/A/package.json
/Users/xiaolian/Code/A/scripts/index.js
/Users/xiaolian/Code/A/scripts

品,仔细品,它们有什么区别。

个人而言,一般还是习惯用 path.join(process.cwd(), 'xxx')

File System 模块


// 内置模块,直接使用
const fs = require(&#39;fs&#39;);

文件系统相关操作的模块,除了 fs 之外,我们还经常用到 fs-extra,后面会介绍。

这个模块在平时的 Node 开发中会被大量使用,这里简单列几个,其它的还是看文档哈:nodejs.org/dist/latest…

fs 模块的 API 默认都是异步回调的形式,如果你想使用同步的方法,有两种解决方法:

  1. 使用 Node 提供的同步 API:xxxSync,也就是在 API 的后面加一个 Sync 后缀,它就是一个同步方法了(具体还是需要查文档哈,是否有提供同步 API)
  2. 包装成一个 Promise 使用

fs.stat(path[, options], callback)

fs.stat() 返回一个文件或者目录的信息。

const fs = require('fs');

fs.stat('a.js', function(err, stats) {
  console.log(stats);
});

其中包含的参数有很多,介绍几个比较常用的:

export interface StatsBase8742468051c85b06f0a0af9e3e506b5c {
  isFile(): boolean;                 // 判断是否是一个文件
  isDirectory(): boolean;            // 判断是否一个目录

  size: T;                           // 大小(字节数)
  atime: Date;                       // 访问时间
  mtime: Date;                       // 上次文件内容修改时间
  ctime: Date;                       // 上次文件状态改变时间
  birthtime: Date;                   // 创建时间
}

一般我们会使用 fs.stat 来取文件的大小,做一些判断逻辑,比如发布的时候可以检测文件大小是否符合规范。在 CLI 中,经常需要获取一个路径下的所有文件,这时候也需要使用 fs.stat 来判断是目录还是文件,如果是目录则继续递归。当然,现在也有更方便的 API 可以完成这个工作。

同步方法

const fs = require('fs');

try {
  const stats = fs.statSync('a.js');
} catch(e) {}

fs.readdir(path[, options], callback)

fs.readdir(path) 获取 path 目录下的文件和目录,返回值为一个包含 filedirectory 的数组。

假设当前目录为:

.
├── a
│   ├── a.js
│   └── b
│       └── b.js
├── index.js
└── package.json

执行以下代码:

const fs = require('fs');

fs.readdir(process.cwd(), function (error, files) {
  if (!error) {
    console.log(files);
  }
});

返回值为:

[ 'a',
  'index.js',
  'package.json' ]

可以看到这里只返回了根目录下的文件和目录,并没有去深度遍历。所以如果需要获取所有文件名,就需要自己实现递归。

同步方法

const fs = require('fs');

try {
  const dirs = fs.readdirSync(process.cwd());
} catch(e) {}

fs.readFile(path[, options], callback)

文件读取的 API,通过 fs.readFile 可以获取指定 path 的文件内容。

入参如下:

  • 第一个参数: 文件路径
  • 第二个参数: 配置对象,包括 encodingflag,也可以直接传如 encoding 字符串
  • 第三个参数: 回调函数

使用方法如下:

const fs = require('fs');
const path = require('path');

fs.readFile(path.join(process.cwd(), 'package.json'), 'utf-8', function (
  error,
  content
) {
  if (!error) {
    console.log(content);
  }
});

如果没传 encoding,则其默认值为 null,此时返回的文件内容为 Buffer 格式。

同步方法

const fs = require('fs');

try {
  fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8');
} catch(e) {}

fs.writeFile(file, data[, options], callback)

对应着读文件 readFilefs 也提供了写文件的 API writeFile,接收四个参数:

  • 第一个参数: 待写入的文件路径
  • 第二个参数: 待写入的文件内容
  • 第三个参数: 配置对象,包括 encodingflag,也可以直接传如 encoding 字符串
  • 第三个参数: 回调函数

使用方法如下:

const fs = require('fs');
const path = require('path');

fs.writeFile(
  path.join(process.cwd(), 'result.js'),
  'console.log("Hello World")',
  function (error, content) {
    console.log(error);
  }
);

同步方法

const fs = require('fs');
const path = require('path');

try {
  fs.writeFileSync(
    path.join(process.cwd(), 'result.js'),
    'console.log("Hello World")',
    'utf-8'
  );
} catch (e) {}

本文主要是总结了一下在开发 Node 时常用的一些 API,后续的文章会带来 Node 常用的一些三方包。

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

위 내용은 Node.js에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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