コーディング用のボイラープレートを作成する(Vite, ESLint, Prettier, stylelint, Sass, Docker)

社内でコーディングを依頼することになり、ある程度ルールがある中でコードを書いてほしいと思い今回コーディング用のボイラープレートを作成しました。

使ってもらってより良い設定があればこの記事とGitHubのコードも更新していこうかと思っています

完成品

github.com

ライブラリ等

ja.vitejs.dev

eslint.org

prettier.io

stylelint.io

sass-lang.com

Vite プロジェクトの作成

$ npm create vite@latest

✔ Project name: … coding_boilerplate
✔ Select a framework: › vanilla
✔ Select a variant: › vanilla

$ cd coding_boilerplate
  • framework は vanilla を選択します。

開発場所になるディレクトリの作成

1. vite.config.js ファイルを新規に作成し以下のように入力します。

// vite.config.js

import { defineConfig } from 'vite'

export default defineConfig({
  root: 'src',
  build: {
    outDir: '../dist'
  }
})

2. 次に src ディレクトリを作成し index.html, main.js, style.css, favicon.svg を 作成したディレクトリに移動させます。

$ mkdir src
$ mv index.html main.js style.css favicon.svg src/.

3. サーバーを起動し localhost:3000 にアクセスし表示できるか確認します。

$ npm run dev

localhost:3000

Sass のインストール

$ npm install --save-dev sass

ファイル名を変更する

$ mv src/style.css src/style.scss
// src/main.js

import './style.scss'

Prettier のインストール

$ npm install --save-dev prettier
// .prettierrc

{
  "printWidth": 120,
  "singleQuote": true,
  "semi": false,
  "tabWidth": 2,
  "trailingComma": "none"
}
.prettierignore

dist/
node_modules/

ESLint のインストール

必要なライブラリをインストールします。

$ npm install --save-dev eslint eslint-config-prettier
  • eslint-config-prettier を導入すると Prettierと競合する ESLint のルールを無効化することができます。

ESLint のセットアップをします。

$ npx eslint --init

✔ How would you like to use ESLint? · style
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · none
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser
✔ How would you like to define a style for your project? · guide
✔ Which style guide do you want to follow? · standard
✔ What format do you want your config file to be in? · JSON
✔ Would you like to install them now? · Yes
✔ Which package manager do you want to use? · npm

生成されたファイルが以下になります。

// .eslintrc.json

{
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": [
        "standard"
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {
    }
}

Stylelint のインストール

必要なライブラリをインストールします。

$ npm install --save-dev stylelint stylelint-config-standard-scss stylelint-config-prettier-scss stylelint-config-recess-order
  • stylelint-config-prettier-scss を導入すると Prettierと競合する Stylelint のルールを無効化することができます。

Stylelintのセットアップをします。

// .stylelintrc.json

{
  "plugins": [],
  "extends": [
    "stylelint-config-standard-scss",
    "stylelint-config-prettier-scss",
    "stylelint-config-recess-order"
  ],
  "rules": {
    "color-no-invalid-hex": true,
    "comment-no-empty": true
  },
  "ignoreFiles": ["./node_modules/**", "./dist/**"]
}

スクリプトの追加

// package.json

{
  ...
  "scripts": {
    ...
    "lint": "npm run lint:prettier && npm run lint:eslint && npm run lint:style ",
    "lint:prettier": "prettier --check --loglevel=warn '**/*.{js,ts,scss}'",
    "lint:eslint": "eslint '**/*.{js,ts}'",
    "lint:style": "stylelint '**/*.{css,scss}'",
    "format": "npm run format:prettier && npm run format:eslint && npm run format:style",
    "format:prettier": "prettier --check --write --loglevel=warn '**/*.{js,ts,scss}'",
    "format:eslint": "eslint --fix '**/*.{js,ts}'",
    "format:style": "stylelint --fix '**/*.{css,scss}'"
  },
  ...

テンプレートの導入

コーディングする際にヘッダーやフッターなどパーシャル(サイトの繰り返し部分)と呼ばれる部品を組み合わせることができます。

必要なライブラリをインストールします。

$ npm install --save-dev vite-plugin-handlebars

設定ファイルを変更します。

$ vite.config.js

import { resolve } from 'path' // 追加
import { defineConfig } from 'vite'
import handlebars from 'vite-plugin-handlebars' // 追加

export default defineConfig({
  root: 'src',
  build: {
    outDir: '../dist'
  },
  // 追加
  plugins: [
    handlebars({
      partialDirectory: resolve(__dirname, 'src/partials'),
      context: {
        title: 'Coding boilerplate'
      }
    })
  ]
})
$ mkdir src/partials
// src/partials/header.html

<header>
  <a href="/">Home</a>
</header>
// src/index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="favicon.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>{{ title }}</title> <!-- 修正 -->
  </head>
  <body>
    {{> header }} <!-- 追加 -->
    <div id="app"></div>
    <script type="module" src="/main.js"></script>
  </body>
</html>

これでレイアウトを実現することができます。

Docker 用の設定追加

# Dockerfile

FROM node:16.14-buster-slim

WORKDIR /app

EXPOSE 3000
# docker-compose.yml

version: '3.8'

services:
  node:
    build:
      context: .
    tty: true
    command: "npm run dev"
    ports:
      - "${NODE_PORT:-8080}:3000"
    volumes:
      - ".:/app"
# Makefile

RUN := run --rm
DOCKER_COMPOSE_RUN := docker-compose $(RUN)

init:
    @make build
    @make npm_install

build:
    docker-compose build

rebuild:
    docker-compose build --force-rm --no-cache

up:
    docker-compose up

upd:
    docker-compose up -d

down:
    docker-compose down

attach:
    docker attach (docker-compose ps -q app)

npm_install:
    ${DOCKER_COMPOSE_RUN} node npm install

lint:
    ${DOCKER_COMPOSE_RUN} node npm run lint

format:
    ${DOCKER_COMPOSE_RUN} node npm run format

app_build:
    ${DOCKER_COMPOSE_RUN} node npm run build

down.all:
    if [ -n "`docker ps -q`" ]; then docker kill `docker ps -q`; fi
        docker container prune -f
// vite.config.js

...
export default defineConfig({
  root: 'src',
  // 追加
  server: {
    host: true
  },
  ...
$ make init
$ make upd

http://localhost:8080 にアクセスする

localhost:8000

VScode の設定

VSCode の設定も載せておきます

// .vscode/settings.json

{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "css.validate": false,
  "less.validate": false,
  "scss.validate": false,
  "editor.formatOnSave": false,
  "editor.codeActionsOnSave": {
    "source.fixAll.stylelint": true
  },
  "stylelint.validate": ["css", "scss"],
  "stylelint.configFile": "./.stylelintrc.json"
}

試しに作ってみて改良の余地ありありなので改善点コメントなどで教えてもらえれば嬉しいです。