この記事では、Nodejs のプロセス、パス、およびファイル システム モジュールの一般的に使用される API を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
関連する推奨事項: 「nodejs チュートリアル 」
Node を日常の開発に使用する場合、いくつかのファイル システムを使用することになります。パス操作などの API は、誰もが理解しやすく直接使用できるようにここにまとめられています。
ここでは、すべてではなく、最も一般的に使用されるもののみを紹介します。より包括的な情報が必要な場合は、公式ドキュメントを参照してください。
ナンセンスな話をしたり、より多くのコードを書いたりしないようにしてください。
最初に、現在のノード プロセスに関連するグローバル環境情報を提供するプロセス モジュールを紹介します。後の API で使用されます。
// 内置模块,直接使用 const process = require('process');
これは、現在のノード プロセスが実行されるディレクトリを返す関数です。一般的な例を次に示します。シナリオ:
A ノード モジュール A
が NPM を通じて公開され、モジュール A
がプロジェクト B
で使用されます。 A
の B
プロジェクト配下のファイルを操作する必要がある場合、process.cwd()
を使用して B
プロジェクトのパスを取得できます。 。
const cwd = process.cwd(); // 输出:/Users/xiaolian/Code/node-api-test
ターミナルがノードを介してコマンドを実行すると、受信コマンド ライン パラメーターは process.argv
を介して取得できます。戻り値は配列です。
したがって、process.argv[2]## から取得するだけで済みます。 # 。
これは一般的に使用されます :
const args = process.argv.slice(2);
process.env にいくつかの変数をマウントします。たとえば、最も一般的な使用法は、
development と
production を区別するための
process.env.NODE_ENV です。
vue-cli のソース コードでは、現在のモードが
DEBUG であるかどうかを示す
process.env.VUE_CLI_DEBUG がよく見られます。
DefinePlugin です。毎日のビルド プロセスでは、このプラグインをよく使用して、さまざまなグローバル変数を挿入してさまざまなビルド プロセスを実行します。 process.env.xxx は特定の値に置き換えられ、deadCode はコード サイズを最適化するために Terser 圧縮段階で削除されます。
console.log(process.platform); // 'aix' // 'darwin' - macOS // 'freebsd' // 'linux' - linux // 'openbsd' // 'sunos' // 'win32' - windows
// 内置模块,直接使用 const path = require('path');
パス関連の操作でこのモジュールが使用されます。
最もよく使用される 5 つは次のとおりです:path.joinこの機能は、複数の入力パスを完全なパスに結合することです。
const dPath = path.join('template', 'aaa', 'bbb', 'ccc', 'd.js'); // 输出: template/aaa/bbb/ccc/d.js
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.resovle のように、任意の数のパスを渡すことができます。 と
path.join の違いは、その機能が複数の受信パスと現在の実行パスを完全な絶対パスに結合することであることです。
index.js が
scripts ディレクトリにあり、ルート ディレクトリで
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# の最後のパス名を返します。 ## 。2 番目のパラメータ ext
はオプションで、ファイル拡張子を表します。例: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">console.log(path.basename(&#39;scripts/index.js&#39;)); // index.js
console.log(path.basename(&#39;scripts/index.js&#39;, &#39;.js&#39;)); // 匹配到 .js,返回 index
console.log(path.basename(&#39;scripts/index.js&#39;, &#39;.json&#39;)); // 没匹配到,返回 index.js</pre><div class="contentsignin">ログイン後にコピー</div></div>
に対応し、指定された ## の最後のものを返します。 #path パス名の前のパス。例えば:###<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">console.log(path.basename(&#39;scripts/index.js&#39;)); // scripts
console.log(path.basename(&#39;scripts/hook/index.js&#39;)); // scripts/hook</pre><div class="contentsignin">ログイン後にコピー</div></div><h3 data-id="heading-10"><strong>path.extname(path)</strong></h3><p>和 <code>path.basename
对应,返回指定 path
最后一个路径名的文件扩展名(含小数点 .
)。比如:
console.log(path.basename('scripts/index.js')); // .js console.log(path.basename('README.md')); // .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')
。
// 内置模块,直接使用 const fs = require('fs');
文件系统相关操作的模块,除了 fs
之外,我们还经常用到 fs-extra
,后面会介绍。
这个模块在平时的 Node 开发中会被大量使用,这里简单列几个,其它的还是看文档哈:nodejs.org/dist/latest…
fs
模块的 API 默认都是异步回调的形式,如果你想使用同步的方法,有两种解决方法:
xxxSync
,也就是在 API 的后面加一个 Sync
后缀,它就是一个同步方法了(具体还是需要查文档哈,是否有提供同步 API)fs.stat()
返回一个文件或者目录的信息。
const fs = require('fs'); fs.stat('a.js', function(err, stats) { console.log(stats); });
其中包含的参数有很多,介绍几个比较常用的:
export interface StatsBase<T> { 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)
获取 path
目录下的文件和目录,返回值为一个包含 file
和 directory
的数组。
假设当前目录为:
. ├── 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) {}
文件读取的 API,通过 fs.readFile
可以获取指定 path
的文件内容。
入参如下:
encoding
和 flag
,也可以直接传如 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) {}
对应着读文件 readFile
,fs
也提供了写文件的 API writeFile
,接收四个参数:
encoding
和 flag
,也可以直接传如 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 サイトの他の関連記事を参照してください。