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+React+Typescript+Scssの環境を作ってみる

Last updated at Posted at 2025-10-29

概要

CMS(管理画面)を作る際に、Reactを採用しようと思い、構築方法をメモっておく。

準備

最終的には、docker化しますが、ひとまずローカルでも実行できるように各種ライブラリを入れておく。

Nodeインストール

バージョンを変更できるように「nvm」でインストールすることにする。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash

バージョンを切り替える場合は、インストールして変更する。

# インストール可能なバージョンを調べる
nvm ls-remote

# 指定のバージョンをインストールする
nvm install "指定バージョン"

# バージョンを切り替える
nvm use "指定バージョン"

# デフォルト設定を変更する
nvm alias default "指定バージョン"

# 現在のバージョンを確認する。
nvm current

nodeとnpmのバージョンを確認してみる。

node -v
v20.19.5

npm -v
10.8.2

Reactインストール

下記コマンドで、React+Typescriptのテンプレートをインストールする。

npm create vite@latest src  -- --template react-ts

起動してみる。

cd src
npm install
npm run dev

> src@0.0.0 dev
> vite


  VITE v7.1.12  ready in 110 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h + enter to show help

スクリーンショット 2025-10-29 14.51.07.png

ビルドしてみる。

npm run build

distフォルダが作成されました。

SCSSを使えるようにする

scss」フォルダを作成して、CSSのファイルを移動させ、リネームしてみます。

App.css → ./scss/App.scss
index.css → ./scss/index.scss

ファイル名を変更したので、読み込んでいる箇所も修正する。

// App.tsx
import './scss/App.scss'
// main.tsx
import './scss/index.scss'

ビルドしてみるとエラーになりました。

$ npm run build

[vite] Internal server error: Preprocessor dependency "sass-embedded" not found. Did you install it? Try `npm install -D sass-embedded`.

指示にしたがって「sass-embedded」をインストールする。

npm install -D sass-embedded

ビルドしてみる。

$ npm run build

> src@0.0.0 build
> tsc -b && vite build

vite v7.1.12 building for production...
✓ 32 modules transformed.
dist/index.html                   0.45 kB │ gzip:  0.29 kB
dist/assets/react-CHdo91hT.svg    4.13 kB │ gzip:  2.05 kB
dist/assets/index-BbbeoXQR.css    1.42 kB │ gzip:  0.72 kB
dist/assets/index-CTMh3xbC.js   195.25 kB │ gzip: 61.13 kB
✓ built in 440ms

問題ないようです。

_variables.scss

変数で共通定義できるように「./scss/_variables.scss」を配置する。

// サンプルです...
$page-max-width: 1200px;
$base-padding: 2rem;
$font-size-base: 1.0rem;
$line-height-base: 1.8;
$link-hover-color: #646cffaa;
$react-hover-color: #61dafbaa;

App.scssに上記ファイルを読み込んで、変数を使ってみる。

// Imports _variables.scss
@use 'variables';

#root {
  max-width: variables.$page-max-width;
  margin: 0 auto;
  padding: variables.$base-padding;
  text-align: center;
}

.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;

  &:hover {
    filter: drop-shadow(0 0 2em variables.$link-hover-color);
  }
  &.react {
    &:hover {
      filter: drop-shadow(0 0 2em variables.$react-hover-color);
    }
  }
}

...

react-router-dom

各ページごとにURLを変更してComponentも分けたいので「react-router-dom」をインストールする。

npm install react-router-dom

サンプルとして下記2ページを作成します。

./pages/HomePage.tsx

function HomePage() {
    return (<>
        <h1>Hello World.</h1>
    </>);
}

export default HomePage

./pages/SamlePage.tsx

function SamplePage() {
    return (<>
        <h1>This is Sample Page.</h1>
    </>);
}

export default SamplePage

main.tsxに「react-router-dom」を組み込む

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import './scss/index.scss'
import App from './App.tsx'

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>,
)

App.tsxにも「react-router-dom」を組み込み、ルーティングを定義する。

import { Routes, Route, Link, useLocation } from 'react-router-dom'
import './scss/App.scss'
import HomePage from './pages/HomePage'
import SamplePage from "./pages/SamplePage";

function App() {
  const location = useLocation()

  return (
    <>
      {/* ナビゲーションバー */}
      <nav>
        <Link
          to="/"
          style={{
            color: '#999',
            backgroundColor: location.pathname === '/' ? '#eee' : 'transparent',
            fontWeight: location.pathname === '/' ? '600' : '400'
          }}
        >
          ホーム
        </Link> |
        <Link
          to="/sample"
          style={{
            color: '#999',
            backgroundColor: location.pathname === '/sample' ? '#eee' : 'transparent',
            fontWeight: location.pathname === '/sample' ? '600' : '400'
          }}
        >
          サンプル
        </Link>
      </nav>

      {/* ページコンテンツ */}
      <main>
        <Routes>
          <Route path="/" element={<HomePage />} />
          <Route path="/sample" element={<SamplePage />} />
        </Routes>
      </main>
    </>
  )
}

export default App

サブフォルダへの配置について

サイト管理画面なら、別ドメインなどで、配置した方が良さそうですが...
どうしても同一サイトに配置してほしいなどの諸事情がある場合もあるかも?

サブフォルダ(/cms)にSPAを設置するなら、「main.tsx」ファイルの「BrowserRouter」に「basename」属性を追加すると対応できそうです。

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <BrowserRouter basename="/cms/">
      <App />
    </BrowserRouter>
  </StrictMode>,
)

また、「vite.config.ts」ファイルにも設定の追加が必要なようです。

// https://vite.dev/config/
export default defineConfig({
  base: '/cms/',       // ← ここを追加する!!
  plugins: [react()],
})

・TOPページ

 http://localhost:5173/cms/

スクリーンショット 2025-10-29 15.52.55.png

・Sampleページ

 http://localhost:5173/cms/sample

スクリーンショット 2025-10-29 15.53.02.png

とりあえず、ベースとなる環境は整ったようです。

参考サイト

・サブディレクトリにビルドしたReactをアップする方法
 https://zenn.dev/sa_tsuki/articles/5927098ca2328e

・Vite index.html を移動させて開発ディレクトリを作りたいときの Tips
 https://chaika.hatenablog.com/entry/2022/12/08/083000

以上

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?