Node.jsの覚書です。
Contents
Node.jsでインデント(タブやスペースの数)をカウントする
template.htmlのchapterというClassが含まれるインデントのスペースとタブの数を抽出するコード。
インデントといえばタブ。では、なぜ、タブとスペースなのかといえばタブが抽出できなかった。エディタの設定がタブになっていなかったからです。
const fs = require('fs');
const path = require('path');
const templateFilePath = path.join(__dirname, 'theme', 'template.html');
const templateContent = fs.readFileSync(templateFilePath, 'utf8');
const regex = /([ \t]*)(<div class="chapter">)/gm;
let matches = [...templateContent.matchAll(regex)];
matches.forEach((match) => {
const whitespaceSequence = match[1];
const tabCount = (whitespaceSequence.match(/\t/g) || []).length;
const spaceCount = (whitespaceSequence.match(/ /g) || []).length;
console.log(`Found <div class='chapter'> with ${tabCount} leading tabs and ${spaceCount} leading spaces.`);
});
VsCodeは設定により、スペースとタブを切り替えられる。
Cursorの場合
File > Preferences > Setting > insert spacesと入力
ただし、それ以前のデータが書き換われるわけではないようです。設定を変更したのち、作ったものが変わるということでしょうか。
path.joinはOSに依存しない
path.joinはOSに依存しない取得方法のようです。
Node.jsからターミナルのコマンドを実行する
ターミナルのコマンドはいわゆるシェルのコマンドです。
Node.jsのchild_process
モジュールを使うと、Node.jsからターミナルのコマンドを実行することができます。child_process
モジュールは、子プロセスを生成してシェルコマンドやその他のプログラムを実行するための機能を提供します。
child_process
モジュールの主なメソッドは以下の通りです:
exec
:シェルを介してコマンドを実行し、コールバックでコマンドの出力を受け取ります。execSync
:exec
の同期版で、コマンドの実行が完了するまでブロックします。spawn
:新しいプロセスを生成し、コマンドを実行します。入出力のストリームを使って、プロセスと通信できます。spawnSync
:spawn
の同期版で、コマンドの実行が完了するまでブロックします。
例えば、exec
を使ってターミナルのコマンドを実行する方法は次のようになります。
const { exec } = require('child_process');
exec('ls -lh', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
});
上記の例では、ls -lh
コマンドを実行し、コールバック関数でコマンドの出力(stdout
)とエラー(stderr
)を受け取っています。エラーが発生した場合は、error
オブジェクトが渡されます。
child_process
モジュールを使えば、Node.jsからファイルの操作、データの処理、外部プログラムの実行など、様々なタスクを実行できます。ただし、ユーザーからの入力をそのままコマンドとして実行するのは危険なので、十分な入力のバリデーションとエスケープ処理が必要です。
Node.jsで複数のスクリプトを順次実行する
const { execSync } = require('child_process');
console.log('Step 1');
execSync('step1.js', { stdio: 'inherit' });
console.log('Step 2');
execSync('step2.js', { stdio: 'inherit' });
console.log('All processes completed successfully.');
execSyncの関数は、コマンドを同期的に実行します。
asyncとawaitとちょっと似ているところもありますが、同期非同期などの違いがあります。
async / await
async
/await
は、JavaScript の非同期処理をより簡潔に書くための構文です。async
キーワードを関数の前に付けることで、その関数はPromise
を返すようになります。await
キーワードは、Promise
の解決を待つために使用され、その間、関数の実行を一時停止しますが、他の操作がブロックされるわけではありません- この手法は、コードの読みやすさを向上させ、コールバック地獄を避けることができます。また、非同期処理の結果を同期的に書くことができるため、理解しやすくなります。
execSync
execSync
は Node.js のchild_process
モジュールに属する関数で、外部プログラムを同期的に実行します- この関数を使用すると、指定したコマンドが完了するまでプログラムの実行が停止します。つまり、
execSync
はプロセス全体をブロックし、他の操作が完全に停止するため、特にサーバーなどでの使用には適していません。 - 同期的な処理は、結果が必要な直後の処理が続く場合に便利ですが、リソースの消費が大きく、パフォーマンスに影響を与える可能性があります。
{ stdio: ‘inherit’ }とは?
ただ、{ stdio: ‘inherit’ }をつけると、呼び出し先のconsole.logが監視できます。Node.jsのchild_process
モジュールで使われるオプションです。
Node.jsでprocessオブジェクト
Node.jsのスクリプトならいつでも使えます。
processオブジェクトには、次のようなプロパティやメソッドが含まれています。
- process.env: 環境変数へのアクセス
- process.argv: コマンドライン引数
- process.exit(): プロセスを終了する
- process.cwd(): 現在の作業ディレクトリを取得する
- process.uptime(): プロセスの起動からの経過時間を取得する
rocess.exit(0) は正常終了を表し、process.exit(1) はエラー終了を表します。
コメント