ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js のプロセス、パス、ファイル システム モジュールの一般的に使用される API の詳細な説明

Node.js のプロセス、パス、ファイル システム モジュールの一般的に使用される API の詳細な説明

青灯夜游
青灯夜游転載
2021-04-12 10:10:191698ブラウズ

この記事では、Nodejs のプロセス、パス、およびファイル システム モジュールの一般的に使用される API を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Node.js のプロセス、パス、ファイル システム モジュールの一般的に使用される API の詳細な説明

関連する推奨事項: 「nodejs チュートリアル

Node を日常の開発に使用する場合、いくつかのファイル システムを使用することになります。パス操作などの API は、誰もが理解しやすく直接使用できるようにここにまとめられています。

ここでは、すべてではなく、最も一般的に使用されるもののみを紹介します。より包括的な情報が必要な場合は、公式ドキュメントを参照してください。

ナンセンスな話をしたり、より多くのコードを書いたりしないようにしてください。

プロセス モジュール


最初に、現在のノード プロセスに関連するグローバル環境情報を提供するプロセス モジュールを紹介します。後の API で使用されます。

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

process.cwd()

これは、現在のノード プロセスが実行されるディレクトリを返す関数です。一般的な例を次に示します。シナリオ:

A ノード モジュール A が NPM を通じて公開され、モジュール A がプロジェクト B で使用されます。 AB プロジェクト配下のファイルを操作する必要がある場合、process.cwd() を使用して B プロジェクトのパスを取得できます。 。

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

process.argv

ターミナルがノードを介してコマンドを実行すると、受信コマンド ライン パラメーターは process.argv を介して取得できます。戻り値は配列です。

  • 0: ノードのパス (通常は使用されません。無視してください)
  • 1: 実行された JS ファイルのパス (通常は使用されません。無視してください) ) )
  • 2~n: 実際の受信コマンドのパラメータ**

したがって、process.argv[2]## から取得するだけで済みます。 # 。 これは一般的に使用されます :

const args = process.argv.slice(2);
必要なパラメータを直接取得します。

process.env

現在の環境に関連するすべての情報を格納するオブジェクトを返しますが、直接使用されることはほとんどありません。

通常、現在の環境を識別するために、

process.env にいくつかの変数をマウントします。たとえば、最も一般的な使用法は、developmentproduction を区別するための process.env.NODE_ENV です。 vue-cli のソース コードでは、現在のモードが DEBUG であるかどうかを示す process.env.VUE_CLI_DEBUG がよく見られます。

ここは webpack プラグイン

DefinePlugin です。毎日のビルド プロセスでは、このプラグインをよく使用して、さまざまなグローバル変数を挿入してさまざまなビルド プロセスを実行します。 process.env.xxx は特定の値に置き換えられ、deadCode はコード サイズを最適化するために Terser 圧縮段階で削除されます。

process.platform

これはあまり使用されません。現在のシステム情報を返します。列挙値は次のとおりです:

console.log(process.platform);

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

Path module

// 内置模块,直接使用
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.resovle のように、任意の数のパスを渡すことができます。 path.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# の最後のパス名を返します。 ## 。2 番目のパラメータ ext はオプションで、ファイル拡張子を表します。例: <pre class="brush:js;toolbar:false;">console.log(path.basename(&amp;#39;scripts/index.js&amp;#39;)); // index.js console.log(path.basename(&amp;#39;scripts/index.js&amp;#39;, &amp;#39;.js&amp;#39;)); // 匹配到 .js,返回 index console.log(path.basename(&amp;#39;scripts/index.js&amp;#39;, &amp;#39;.json&amp;#39;)); // 没匹配到,返回 index.js</pre>

path.dirname(path)

path.basename

に対応し、指定された ## の最後のものを返します。 #path パス名の前のパス。例えば:###<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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。