Skip to content
⚠️ This article was written in 2019. Some content may be outdated.

Node.jsスクリプト開発実践:ワークフローを自動化する

フロントエンドエンジニアがNode.jsスクリプトを書くと、多くの繰り返し作業を解消できる。実用的なスクリプト開発のコツをまとめる。

基本ユーティリティライブラリ

bash
npm i -g commander    # コマンドライン引数解析
npm i -g chalk        # ターミナルカラー
npm i -g inquirer     # インタラクティブプロンプト
npm i -g ora          # ローディングスピナー
npm i -g fs-extra     # 強化されたfsモジュール

ファイルの一括リネーム

javascript
#!/usr/bin/env node
// rename-images.js:img001.jpgをproduct-001.jpgに一括リネーム

const fs = require("fs-extra");
const path = require("path");
const chalk = require("chalk");

async function renameImages(dir, prefix) {
  const files = await fs.readdir(dir);
  const images = files.filter((f) => /\.(jpg|png|webp)$/i.test(f));

  console.log(chalk.blue(`${images.length}枚の画像が見つかりました`));

  for (let i = 0; i < images.length; i++) {
    const ext = path.extname(images[i]);
    const newName = `${prefix}-${String(i + 1).padStart(3, "0")}${ext}`;

    await fs.rename(path.join(dir, images[i]), path.join(dir, newName));
    console.log(chalk.green(`✅ ${images[i]} → ${newName}`));
  }
}

renameImages("./images", "product");

インタラクティブスキャフォールディング

javascript
#!/usr/bin/env node
// create-component.js:Vueコンポーネントを素早く作成

const inquirer = require("inquirer");
const fs = require("fs-extra");
const path = require("path");

const TEMPLATE = (name, hasProps) => `<template>
  <div class="${name.toLowerCase()}">
    <slot />
  </div>
</template>

<script>
export default {
  name: '${name}',
  ${
    hasProps
      ? `props: {
    value: {
      type: String,
      default: ''
    }
  },`
      : ""
  }
  data() {
    return {}
  }
}
</script>

<style lang="scss" scoped>
.${name.toLowerCase()} {
}
</style>
`;

async function main() {
  const answers = await inquirer.prompt([
    {
      type: "input",
      name: "name",
      message: "コンポーネント名(PascalCase):",
      validate: (v) => /^[A-Z]/.test(v) || "PascalCaseを使ってください",
    },
    {
      type: "list",
      name: "dir",
      message: "どのディレクトリに置きますか:",

MIT Licensed