LoginSignup
5
1

More than 5 years have passed since last update.

手早く Node.js の検証用リポジトリを作成する

Last updated at Posted at 2018-12-17

JavaScript の新しい技術やアイデアを試す時のリポジトリを作成するワークフローについて書きます。快適な作業環境を手早く作ることを目指します。

プロジェクトを開始する

プロジェクトフォルダを作って、 Git での管理を開始しましょう。

$ mkdir sandbox-something
$ git init
$ git create

git createGitHub Hub という Git の GitHub 拡張ツールが提供するコマンドです。 この場合、 <usernname>/sandbox-something というリポジトリを github.com に作成し、ローカルリポジトリに remote を登録してくれます。

$ git remote -v
origin	git@github.com:<usernname>/sandbox-something.git (fetch)
origin	git@github.com:<usernname>/sandbox-something.git (push)

.gitignore を作成

プロジェクト固有の自動生成ファイルなどはぼちぼち .gitignore に追加していくとして、 一般的な .gitignore を gibo で生成します。gibo コマンドは、 node をはじめ主要な言語・フレームワークに対応した汎用的な .gitignore を標準出力に渡してくれます。

$ gibo node > .gitignore

npm にする

npm としてリポジトリを初期化します。今回は Yarn を使います。細かい点ですが、 yarn init コマンドに先立って git create してリモートリポジトリを登録しておくことで、 package.json の repository フィールドを埋めてくれるので気持ちいいです。

$ yarn init -y
yarn init v1.10.1
warning The yes flag has been set. This will automatically answer yes to all questions, which may have security implications.
success Saved package.json
✨  Done in 0.06s.
$ cat ./package.json
{
  "name": "sandbox-something",
  "version": "1.0.0",
  "main": "index.js",
  "repository": "git@github.com:<usernname>/sandbox-something.git",
  "author": "<usernname>",
  "license": "MIT"
}

Linter とコードフォーマッターを導入する

ESLintPrettier を導入します。 

$ yarn add eslint babel-eslint prettier-eslint prettier-eslint-cli --dev

Prettier はエディタープラグインを使って、ファイル保存時に自動でフォーマットされるようにしておくのがおすすめです。

VSCode プラグイン
Atom パッケージ
webStorm プラグイン

phpStorm (webStorm) の場合でも、 File Watcher との組み合わせで保存時にフォーマットを実行できます。

ESLint と Prettier の設定は、 ESLint の新しいルールの追加やプロジェクトの性質に応じてよく変更するので、 最近アクティブだった別のプロジェクトから持ってきて、項目を適当に削ったり足したりします。使い回しを追求するならば、Gist や GitHub に置いておくか、 コンフィグを npm パッケージとして作成し公開しておくといいかもしれません1

$ cp ~/prev-project/.eslint* ./
$ cp ~/prev-project/.prettier* ./

参考までに、私がよく使う設定をはいつもこんな感じになります。

# .eslintignore
/node_modules
/dist
/docs
// .eslint.js
module.exports = {
  env: {
    es6: true,
    node: true,
  },
  extends: ['eslint:recommended'],
  parser: 'babel-eslint',
  parserOptions: {
    ecmaVersion: 2017,
    sourceType: 'module',
    ecmaFeatures: {
      experimentalObjectRestSpread: true,
    },
  },
  rules: {
    'array-callback-return': ['error'],
    'quote-props': ['error', 'as-needed'],
    'arrow-parens': ['error', 'as-needed'],
    'arrow-spacing': ['error', { before: true, after: true }],
    'brace-style': ['error', '1tbs', { allowSingleLine: true }],
    'comma-spacing': ['error', { before: false, after: true }],
    'comma-dangle': [
      'error',
      {
        arrays: 'always-multiline',
        objects: 'always-multiline',
        imports: 'always-multiline',
        exports: 'always-multiline',
        functions: 'always-multiline',
      },
    ],
    eqeqeq: ['error', 'always'],
    indent: ['error', 2, { SwitchCase: 1 }],
    'jsx-quotes': ['error', 'prefer-double'],
    'valid-jsdoc': ['off'],
    'key-spacing': ['off'],
    'keyword-spacing': ['error'],
    'linebreak-style': ['error', 'unix'],
    'no-dupe-args': ['error'],
    'no-console': ['warn'],
    'no-const-assign': ['error'],
    'no-irregular-whitespace': [
      'error',
      {
        skipStrings: true,
        skipComments: true,
        skipRegExps: true,
        skipTemplates: true,
      },
    ],
    'no-unused-vars': ['error'],
    'no-undefined': ['error'],
    'no-var': ['error'],
    'no-multiple-empty-lines': ['error'],
    'object-curly-spacing': ['error', 'always'],
    'require-jsdoc': [
      'off',
      {
        require: {
          ArrowFunctionExpression: true,
          ClassDeclaration: true,
          FunctionDeclaration: true,
          MethodDefinition: true,
        },
      },
    ],
    quotes: ['error', 'single'],
    semi: ['error', 'never'],
    'spaced-comment': [
      'error',
      'always',
      {
        line: {
          markers: ['/'],
          exceptions: ['-', '+'],
        },
        block: {
          markers: ['!'],
          exceptions: ['*'],
          balanced: true,
        },
      },
    ],
    'space-before-blocks': [
      'error',
      { functions: 'always', keywords: 'always', classes: 'always' },
    ],
    'space-unary-ops': ['error'],
    'space-infix-ops': ['error', { int32Hint: false }],
    'sort-imports': ['off'],
  },
}

package.json などのフォーマットは、 Yarn や npm に任せます。

# .prettierignore
package.json
package-lock.json
yarn.lock

prettierrc を入れておくと、意図しないフォーマット(例えば、グローバルな .prettierrc が使われてしまうケース)を防いでくれるので便利です。

// .prettierrc.js
module.exports = {}

npm コマンドを定義

こちらも前回の自分のプロジェクトから持ってきたりして package.json 内で適当に定義します。

{
  "scripts": {
    "lint": "eslint --cache --ext=js .",
    "format": "prettier-eslint \"./*.js\" \"./**/*.js\" --write"
  }
}

オプション

検証用のリポジトリを立ち上げることから話が逸れますが、 Prettier のエディタプラグインの導入は開発者個人の環境に依存するので、チーム開発の場合は未フォーマットのコードを必要に応じて CI などで弾くといいかもしれません。

# TravisCI や Circle CI の設定ファイルで走らせるコマンド
$ npm run format
$ git diff --exit-code --quiet || (echo 'run prettier.' && exit 1)

あるいは、 lint-staged を使うのも選択肢の一つです。 git の操作にフックして linter や prettier を実行させることができます。

Git にコミット

準備完了なので、 最初のコミットを作成してプッシュしておきます。

$ git add .
$ git commit -m "Init the project🚀"
$ git push origin master

素振りタイム

ここから試したいライブラリをインストールするなどして試します。

$ yarn add some-awesome-tool

それでは良い Node.js ライフを!

その他

デプロイなども試す場合は、セキュアなファイル(例えば AWS の認証情報が詰まった .envrc2 など) がコミットされていないか確認しましょう。グローバルな .gitignore にこれらを設定しておくのは良い戦略だと思います。

$ cat ~/.gitignore_global
.envrc

最初のコミット前に git status で確認したり、あるいはコミットのプッシュ後に不安を感じたらブラウザでも確認したりしています。

$ git open

git-open 3 はカレントディレクトリのリモートリポジトリをブラウザで開いてくれるツールです。 GitHub や Bitbucket などの主要なサービスに対応しているようです。

  1. 参考: ESLint | Shareable Configs

  2. direnv の設定ファイル

  3. git-xというコマンドにパスが通っていると、 Git に git x というサブコマンドが生えます。

5
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1