Node.jsでインデント(タブやスペースの数)をカウントする

Node.jsの覚書です。

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モジュールの主なメソッドは以下の通りです:

  1. exec:シェルを介してコマンドを実行し、コールバックでコマンドの出力を受け取ります。
  2. execSyncexecの同期版で、コマンドの実行が完了するまでブロックします。
  3. spawn:新しいプロセスを生成し、コマンドを実行します。入出力のストリームを使って、プロセスと通信できます。
  4. spawnSyncspawnの同期版で、コマンドの実行が完了するまでブロックします。

例えば、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) はエラー終了を表します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする