0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

viteを使って環境構築してみた

Last updated at Posted at 2024-08-14

開発環境の構築って難しい。
viteで簡単に開発環境が作れないか調べてみた。

作成したい環境

今回作成する環境は以下

  • 作業はsrcディレクトリ配下で行う
  • build時はdist配下に出力
  • SCSSの使用
  • JS/CSS/画像はassets配下で管理

プロジェクト作成手順

実行環境

node v20.14.0
npm 10.7.0

ディレクトリ構成

dist/
src/
  ├── about
  │   └── about.html
  ├── assets
  │   ├── js
  │   │   ├── all.js
  │   │   └── counter.js
  │   └── styles
  │       ├── foundation
  │       │     └── _base.scss
  │       │     └── _index.scss
  │       ├── pages
  │       │     └── _about.scss
  │       │     └── _index.scss
  │       └── style.scss
  ├── public
  │   └── assets
  │       └── img
  │            ├── javascript.svg
  │            └── vite.svg
  └── index.html
package.json
vite.config.js

viteと必要なプラグインのインストール

viteのプロジェクト作成

ターミナル
npm create vite@latest vite-project-for-static-site
✔ Select a framework: › Vanilla
✔ Select a variant: › JavaScript

sassとsassのパーシャルファイル(_アンダースコアから始まるファイル)を管理する用のインストール

ターミナル
npm i sass
npm i vite-plugin-sass-glob-import

vite.config.jsのinputに記述する項目をページが増えても自動的にディレクトリ取得してくれるプラグインのインストール

ターミナル
npm i glob

vite.config.jsを作成してbuild設定

vite.config.js
import { globSync } from "glob";
import path, { resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import { defineConfig } from "vite";
import sassGlobImports from 'vite-plugin-sass-glob-import';

// js,css,htmlの出力先をそれぞれに指定するための元のディレクトリの取得するための記述
const jsFiles = Object.fromEntries(
  globSync('src/**/*.js', { ignore: ['node_modules/**','**/modules/**','**/dist/**']}).map(file => [
    path.relative(
      'src',
      file.slice(0, file.length - path.extname(file).length)
    ),
    fileURLToPath(new URL(file, import.meta.url))
  ])
);

const scssFiles = Object.fromEntries(
  globSync('src/assets/styles/pages/**/*.scss', { ignore: ['src/assets/styles/pages/**/_*.scss'] }).map(file => [
    path.relative(
      'src',
      file.slice(0, file.length - path.extname(file).length)
    ),
    fileURLToPath(new URL(file, import.meta.url))
  ])
);

const htmlFiles = Object.fromEntries(
  globSync('src/**/*.html', { ignore: ['node_modules/**', '**/dist/**'] }).map(file => [
    path.relative(
      'src',
      file.slice(0, file.length - path.extname(file).length)
    ),
    fileURLToPath(new URL(file, import.meta.url))
  ])
);

const inputObject = { ...scssFiles, ...jsFiles, ...htmlFiles };

export default defineConfig({
    // srcディレクトリをrootにする指定
    root: "src",
    // ビルド設定
    build: {
        // ビルド出力先はdist
        outDir: resolve(__dirname, "dist"),
        // 中身が空のファイルでも出力する
        emptyOutDir: true,
        // js,css,htmlの出力先をそれぞれに指定
        rollupOptions: {
          // 出力元のファイル
          input: inputObject,
          // 出力先のファイル名指定
          output: {
            entryFileNames: `[name].js`,
            chunkFileNames: `[name].js`,
            assetFileNames: (assetInfo) => {
              if (/\.( gif|jpeg|jpg|png|svg|webp| )$/.test(assetInfo.name)) {
                return 'assets/img/[name].[ext]';
              }
              if (/\.css$/.test(assetInfo.name)) {
                return 'assets/css/[name].[ext]';
              }
              return 'assets/[name].[ext]';
            }
          },
        }
    },
    // 使用するプラグインの記述
    plugins: [
      sassGlobImports()
    ],
    // localhostのポート番号指定
    server: {
      port: 3000
    }
})

rollupOptionsのinputなどは以下の参考サイトからそのまま使用させていただいた。
ここまでの設定でHTMLはそれぞれ別ファイルでも出力されるようになったし、SCSSも使用できるようになった。もちろんdistにはコンパイルされて一つのCSSファイルとして出力される。
jsはバンドルして1ファイルにしたいとか、画像ファイルの出力先の指定がうまくできないといった問題は残るがgulpやwebpackよりもエラーにぶつからず構築できた。

ここまでの環境はgithubに残しました。
https://github.com/Maro1027/vite-project-for-static-site

参考サイト

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?