Vite プロジェクトの初期化手順とベストプラクティス

Vite プロジェクトの初期化は、その後の開発体験を大きく左右する重要なフェーズです。適切な初期設定を行うことで、開発効率が飛躍的に向上し、チーム全体の生産性向上につながります。一方で、不適切な初期化は後々の開発において大きな足かせとなってしまうのです。
多くの開発者が「とりあえず動くものを作りたい」という思いでプロジェクトを開始しますが、初期設定に時間をかけることで、長期的には大幅な時間短縮を実現できます。適切な設定により、コード品質の向上、デバッグ効率の改善、チーム間の開発体験統一が可能になるのです。
この記事では、Vite プロジェクトの初期化における具体的な手順を、段階的かつ体系的に解説いたします。基本的な初期化から、フレームワーク別の最適設定、チーム開発向けのベストプラクティスまで、実際のプロジェクトで即座に活用できる実践的な知識をお届けします。Yarn を使った効率的な依存関係管理、設定ファイルのカスタマイズ、開発ツールの統合まで、プロフェッショナルな開発環境構築のノウハウを習得していただけるでしょう。
背景
Vite プロジェクト初期化の選択肢と判断基準
Vite は豊富な初期化オプションを提供しており、プロジェクトの性質に応じて最適な選択を行う必要があります。適切な判断基準を理解することで、後々の開発効率が大きく変わってきます。
公式テンプレートの種類と特徴
Vite が提供する公式テンプレートは、それぞれ異なる用途に最適化されています:
| テンプレート名 | 主な用途 | 含まれる技術スタック | 推奨プロジェクト規模 | | -------------- | ---------- | ------------------------ | -------------------- | -------------- | | # 1 | vanilla | 基本的な JavaScript 開発 | HTML/CSS/JS | 小規模・学習用 | | # 2 | vanilla-ts | TypeScript 基礎開発 | TypeScript/HTML/CSS | 小〜中規模 | | # 3 | react | React 開発 | React/JSX | 中〜大規模 | | # 4 | react-ts | React + TypeScript | React/TypeScript/JSX | 中〜大規模 | | # 5 | vue | Vue.js 開発 | Vue 3/SFC | 中〜大規模 | | # 6 | vue-ts | Vue + TypeScript | Vue 3/TypeScript/SFC | 中〜大規模 | | # 7 | svelte | Svelte 開発 | Svelte/SFC | 小〜中規模 | | # 8 | svelte-ts | Svelte + TypeScript | Svelte/TypeScript | 小〜中規模 |
プロジェクト要件による選択基準
適切なテンプレート選択は、以下の要因を総合的に判断して行います:
技術的要件:
- TypeScript 使用の必要性
- フレームワークの制約や推奨事項
- 既存システムとの互換性要件
プロジェクト特性:
- 開発チームのスキルレベル
- プロジェクトの予想規模と成長性
- 保守性と拡張性の重要度
開発環境要件:
- CI/CD パイプラインとの統合
- 開発ツールチェーンの統一
- パフォーマンス要件
テンプレートの種類と特徴理解
フレームワーク別特徴分析
各フレームワークテンプレートは、それぞれ独特の開発体験と最適化を提供します:
React 系テンプレート:
- JSX によるコンポーネント記述
- React Developer Tools との統合
- 豊富なエコシステムとの親和性
- Hot Reload による高速開発体験
Vue 系テンプレート:
- Single File Component(SFC)の活用
- Vue DevTools との統合
- Composition API によるモダンな開発スタイル
- テンプレート記法の直感的な理解
Svelte 系テンプレート:
- コンパイル時最適化による高パフォーマンス
- 学習コストの低さと直感的な記法
- バンドルサイズの最小化
- ランタイムの軽量性
プロジェクト要件に応じた初期化戦略
開発フェーズ別アプローチ
プロジェクトの開発フェーズに応じて、初期化戦略を適応させることが重要です:
プロトタイピング段階:
- 最小限の設定での高速スタート
- 実験的機能の試行錯誤重視
- 設定の柔軟性確保
MVP 開発段階:
- 基本的な品質管理ツール導入
- 継続的インテグレーション設定
- 拡張性を考慮した設計
本格開発段階:
- 包括的な開発ツールチェーン構築
- 厳格なコード品質管理
- パフォーマンス最適化設定
課題
初期設定の複雑さと設定漏れリスク
Vite プロジェクトの初期化において、最も頻繁に発生する問題が設定の複雑さと漏れです。多様な設定オプションが存在する一方で、それらの相互関係や最適な組み合わせを理解するのは容易ではありません。
設定項目の相互依存性
Vite の設定項目は、しばしば相互に影響し合います:
typescript// 設定間の依存関係例
export default defineConfig({
// CSS設定がビルド最適化に影響
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`,
},
},
},
// resolve設定がCSS importにも影響
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
},
},
// ビルド設定が全体のパフォーマンスに影響
build: {
cssCodeSplit: true, // CSS設定と連動
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
},
},
},
},
});
よくある設定漏れパターン
実際のプロジェクトで頻繁に見られる設定漏れを分析すると、以下のようなパターンがあります:
| 設定分野 | 漏れやすい項目 | 影響 | 対処法 | | -------- | --------------- | ----------------- | -------------------- | ---------------------- | | # 1 | TypeScript 設定 | strict 型チェック | 型安全性の低下 | tsconfig.json 詳細設定 | | # 2 | ESLint/Prettier | import 順序統一 | コード品質のばらつき | 統合設定ファイル | | # 3 | 環境変数管理 | 本番環境設定 | セキュリティリスク | .env.example 作成 | | # 4 | パス解決設定 | 絶対パス import | 保守性の低下 | alias 設定と IDE 設定 |
チーム間での設定統一の困難さ
チーム開発において、開発環境の統一は継続的な課題となります。個人の設定の違いが、予期しないトラブルや開発効率の低下を招くことがあります。
環境差異による問題事例
実際のチーム開発で発生する典型的な問題:
OS 依存の問題:
- パスセパレータの違い(Windows vs Unix 系)
- 改行コードの差異(CRLF vs LF)
- ファイルシステムの大文字小文字区別
ツールバージョンの差異:
- Node.js バージョンの違い
- Yarn のバージョン差異
- エディタ・IDE 設定の違い
設定ファイルの管理:
- 個人設定のコミット混入
- 設定ファイルの更新漏れ
- ローカル設定の上書き問題
後からの設定変更コスト
プロジェクト開始後の設定変更は、想像以上のコストとリスクを伴います。特に以下のような変更は、大きな影響を与える可能性があります。
高コスト変更パターン
フレームワーク変更:
- React → Vue への変更
- JavaScript → TypeScript への移行
- CSS-in-JS → CSS Modules への変更
ビルド設定の大幅変更:
- バンドル戦略の変更
- 出力形式の変更(SPA → SSR 等)
- アセット処理方法の変更
これらの変更を避けるためには、初期段階での慎重な設計と設定が不可欠です。
解決策
段階的な初期化手順の体系化
効率的な Vite プロジェクト初期化のために、段階的なアプローチを採用します。この手法により、設定漏れを防ぎ、後からの変更コストを最小化できます。
フェーズ 1:基本プロジェクト作成
最初の段階では、プロジェクトの骨格を作成し、基本的な動作確認を行います:
bash# プロジェクト作成(Yarn使用)
yarn create vite my-project --template react-ts
# プロジェクトディレクトリに移動
cd my-project
# 依存関係インストール
yarn install
# 基本動作確認
yarn dev
フェーズ 2:開発環境基盤整備
次に、開発効率を向上させる基盤ツールを導入します:
bash# 開発ツール群のインストール
yarn add -D \
@typescript-eslint/eslint-plugin \
@typescript-eslint/parser \
eslint \
eslint-plugin-react \
eslint-plugin-react-hooks \
eslint-plugin-import \
prettier \
eslint-config-prettier \
eslint-plugin-prettier
フェーズ 3:品質管理ツール統合
コード品質を保つためのツールチェーンを構築します:
typescript// .eslintrc.js
module.exports = {
root: true,
env: {
browser: true,
es2020: true,
node: true,
},
extends: [
'eslint:recommended',
'@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:import/recommended',
'plugin:import/typescript',
'prettier',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
},
plugins: ['react', '@typescript-eslint', 'import'],
rules: {
'react/react-in-jsx-scope': 'off',
'import/order': [
'error',
{
groups: [
'builtin',
'external',
'internal',
['parent', 'sibling'],
'index',
],
'newlines-between': 'always',
alphabetize: {
order: 'asc',
caseInsensitive: true,
},
},
],
},
settings: {
react: {
version: 'detect',
},
'import/resolver': {
typescript: {},
},
},
};
プロジェクトタイプ別最適設定パターン
SPA(Single Page Application)設定
SPA プロジェクトに最適化された設定パターン:
typescript// vite.config.ts(SPA最適化)
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'@components': resolve(__dirname, 'src/components'),
'@utils': resolve(__dirname, 'src/utils'),
'@assets': resolve(__dirname, 'src/assets'),
},
},
server: {
port: 3000,
open: true,
cors: true,
},
build: {
outDir: 'dist',
sourcemap: true,
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
router: ['react-router-dom'],
},
},
},
},
optimizeDeps: {
include: ['react', 'react-dom', 'react-router-dom'],
},
});
ライブラリ開発設定
ライブラリ開発に特化した設定パターン:
typescript// vite.config.ts(ライブラリ開発)
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';
import dts from 'vite-plugin-dts';
export default defineConfig({
plugins: [
react(),
dts({
insertTypesEntry: true,
}),
],
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'),
name: 'MyLibrary',
formats: ['es', 'umd'],
fileName: (format) => `my-library.${format}.js`,
},
rollupOptions: {
external: ['react', 'react-dom'],
output: {
globals: {
react: 'React',
'react-dom': 'ReactDOM',
},
},
},
},
});
自動化とテンプレート活用による効率化
カスタムテンプレート作成
繰り返し使用する設定をテンプレート化することで、初期化効率を大幅に向上させられます:
json// package.json(テンプレート用)
{
"name": "my-vite-template",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"lint:fix": "eslint . --ext ts,tsx --fix",
"format": "prettier --write .",
"type-check": "tsc --noEmit",
"prepare": "husky install"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.2.43",
"@types/react-dom": "^18.2.17",
"@typescript-eslint/eslint-plugin": "^6.14.0",
"@typescript-eslint/parser": "^6.14.0",
"@vitejs/plugin-react": "^4.2.1",
"eslint": "^8.55.0",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.5",
"husky": "^8.0.3",
"lint-staged": "^15.2.0",
"prettier": "^3.1.1",
"typescript": "^5.2.2",
"vite": "^5.0.8"
},
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"]
}
}
初期化スクリプトの自動化
プロジェクト固有の設定を自動化するスクリプトを作成:
bash#!/bin/bash
# setup.sh - プロジェクト初期化自動化スクリプト
echo "🚀 Viteプロジェクト初期化開始..."
# Git初期化
git init
echo "✅ Git初期化完了"
# Huskyセットアップ
yarn husky install
yarn husky add .husky/pre-commit "yarn lint-staged"
echo "✅ Husky設定完了"
# 環境変数ファイル作成
cp .env.example .env.local
echo "✅ 環境変数ファイル作成完了"
# VSCode設定作成
mkdir -p .vscode
cat > .vscode/settings.json << EOF
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"typescript.preferences.importModuleSpecifier": "relative"
}
EOF
echo "✅ VSCode設定作成完了"
echo "�� 初期化完了!開発を開始できます。"
設定ファイルの構造化とベストプラクティス
設定ファイルの分割と管理
複雑な設定を管理しやすくするため、設定ファイルを適切に分割します:
typescript// config/vite.base.ts
import { defineConfig } from 'vite';
import { resolve } from 'path';
export const baseConfig = defineConfig({
resolve: {
alias: {
'@': resolve(__dirname, '../src'),
'@components': resolve(
__dirname,
'../src/components'
),
'@utils': resolve(__dirname, '../src/utils'),
},
},
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`,
},
},
},
});
typescript// config/vite.dev.ts
import { defineConfig, mergeConfig } from 'vite';
import { baseConfig } from './vite.base';
export const devConfig = defineConfig({
server: {
port: 3000,
open: true,
hmr: {
overlay: true,
},
},
optimizeDeps: {
force: true,
},
});
export default mergeConfig(baseConfig, devConfig);
具体例
Yarn を使った基本初期化手順
ステップバイステップ初期化
実際のプロジェクト作成から本格的な開発開始まで、詳細な手順を示します:
bash# 1. プロジェクト作成
yarn create vite my-app --template react-ts
cd my-app
# 2. 基本依存関係インストール
yarn install
# 3. 追加開発依存関係インストール
yarn add -D \
@types/node \
eslint \
prettier \
husky \
lint-staged \
@typescript-eslint/eslint-plugin \
@typescript-eslint/parser \
eslint-plugin-react \
eslint-plugin-react-hooks \
eslint-config-prettier
# 4. 基本動作確認
yarn dev
設定ファイル初期セットアップ
基本的な設定ファイルを順次作成していきます:
typescript// vite.config.ts(初期設定)
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
},
},
server: {
port: 3000,
open: true,
},
build: {
outDir: 'dist',
sourcemap: true,
},
});
React + TypeScript + Tailwind 環境構築
Tailwind CSS 統合設定
モダンなスタイリング環境を構築します:
bash# Tailwind CSS関連パッケージインストール
yarn add -D tailwindcss postcss autoprefixer
yarn dlx tailwindcss init -p
typescript// tailwind.config.js
/** @type {import('tailwindcss').Config} */
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {
colors: {
primary: {
50: '#eff6ff',
500: '#3b82f6',
900: '#1e3a8a',
},
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
},
},
plugins: [],
};
css/* src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
body {
@apply font-sans antialiased;
}
}
@layer components {
.btn {
@apply px-4 py-2 rounded-md font-medium transition-colors;
}
.btn-primary {
@apply bg-primary-500 text-white hover:bg-primary-600;
}
}
TypeScript 設定最適化
厳密な型チェックと開発効率を両立する設定:
json// tsconfig.json(最適化版)
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
/* Path mapping */
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"@/components/*": ["src/components/*"],
"@/utils/*": ["src/utils/*"],
"@/types/*": ["src/types/*"]
}
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
Vue 3 + Composition API + Pinia 設定
Vue 3 プロジェクト最適設定
Vue 3 の機能を最大限活用する設定:
bash# Vue 3プロジェクト作成
yarn create vite my-vue-app --template vue-ts
cd my-vue-app
# Pinia(状態管理)追加
yarn add pinia
yarn add -D @pinia/testing
# Vue開発ツール追加
yarn add -D @vue/eslint-config-typescript @vue/tsconfig
typescript// vite.config.ts(Vue 3最適化)
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { resolve } from 'path';
export default defineConfig({
plugins: [
vue({
script: {
defineModel: true,
propsDestructure: true,
},
}),
],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'@/components': resolve(__dirname, 'src/components'),
'@/composables': resolve(
__dirname,
'src/composables'
),
'@/stores': resolve(__dirname, 'src/stores'),
},
},
server: {
port: 3000,
open: true,
},
build: {
target: 'esnext',
rollupOptions: {
output: {
manualChunks: {
vue: ['vue'],
pinia: ['pinia'],
},
},
},
},
});
Pinia 統合とストア設定
typescript// src/stores/index.ts
import { createPinia } from 'pinia';
export const pinia = createPinia();
// 開発環境でのデバッグ支援
if (import.meta.env.DEV) {
pinia.use(({ store }) => {
store.$subscribe((mutation, state) => {
console.log(
'🍍 Pinia mutation:',
mutation.type,
state
);
});
});
}
typescript// src/stores/counter.ts
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
export const useCounterStore = defineStore(
'counter',
() => {
// State
const count = ref(0);
// Getters
const doubleCount = computed(() => count.value * 2);
const isEven = computed(() => count.value % 2 === 0);
// Actions
function increment() {
count.value++;
}
function decrement() {
count.value--;
}
function reset() {
count.value = 0;
}
return {
count,
doubleCount,
isEven,
increment,
decrement,
reset,
};
}
);
ライブラリ開発用プロジェクト初期化
ライブラリプロジェクト構造
再利用可能なライブラリ開発に最適化された設定:
typescript// vite.config.ts(ライブラリ用)
import { defineConfig } from 'vite';
import { resolve } from 'path';
import dts from 'vite-plugin-dts';
export default defineConfig({
plugins: [
dts({
include: ['src'],
exclude: ['src/**/*.test.ts', 'src/**/*.stories.ts'],
}),
],
build: {
lib: {
entry: {
index: resolve(__dirname, 'src/index.ts'),
utils: resolve(__dirname, 'src/utils/index.ts'),
},
name: 'MyLibrary',
formats: ['es', 'cjs', 'umd'],
},
rollupOptions: {
external: ['react', 'react-dom', 'vue'],
output: {
globals: {
react: 'React',
'react-dom': 'ReactDOM',
vue: 'Vue',
},
},
},
sourcemap: true,
minify: 'esbuild',
},
test: {
globals: true,
environment: 'jsdom',
setupFiles: ['./src/test/setup.ts'],
},
});
パッケージング設定
json// package.json(ライブラリ用)
{
"name": "my-library",
"version": "1.0.0",
"type": "module",
"files": ["dist"],
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
},
"./utils": {
"import": "./dist/utils.js",
"require": "./dist/utils.cjs",
"types": "./dist/utils.d.ts"
}
},
"scripts": {
"build": "vite build",
"dev": "vite build --watch",
"test": "vitest",
"test:coverage": "vitest --coverage",
"prepublishOnly": "yarn build"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
}
設定ファイルのカスタマイズ実例
環境別設定管理
開発・ステージング・本番環境それぞれに最適化された設定:
typescript// config/vite.config.base.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';
export const createBaseConfig = () =>
defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': resolve(__dirname, '../src'),
'@/components': resolve(
__dirname,
'../src/components'
),
'@/utils': resolve(__dirname, '../src/utils'),
'@/assets': resolve(__dirname, '../src/assets'),
},
},
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`,
},
},
},
});
typescript// vite.config.ts
import { defineConfig, mergeConfig } from 'vite';
import { createBaseConfig } from './config/vite.config.base';
const baseConfig = createBaseConfig();
export default defineConfig(({ mode }) => {
if (mode === 'development') {
return mergeConfig(baseConfig, {
server: {
port: 3000,
open: true,
hmr: true,
},
define: {
__DEV__: true,
},
});
}
if (mode === 'production') {
return mergeConfig(baseConfig, {
build: {
minify: 'esbuild',
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
ui: ['@mui/material', '@emotion/react'],
},
},
},
},
define: {
__DEV__: false,
},
});
}
return baseConfig;
});
パフォーマンス最適化設定
typescript// config/performance.ts
export const performanceConfig = {
build: {
rollupOptions: {
output: {
manualChunks(id: string) {
// ベンダーライブラリの分割
if (id.includes('node_modules')) {
if (id.includes('react')) return 'react';
if (id.includes('@mui')) return 'mui';
if (id.includes('lodash')) return 'lodash';
return 'vendor';
}
},
},
},
// チャンクサイズ警告の調整
chunkSizeWarningLimit: 1000,
// CSS分割の有効化
cssCodeSplit: true,
// ソースマップ設定
sourcemap: process.env.NODE_ENV === 'development',
},
optimizeDeps: {
include: [
'react',
'react-dom',
'react-router-dom',
'@mui/material',
'@emotion/react',
'@emotion/styled',
],
},
};
まとめ
Vite プロジェクトの適切な初期化は、長期的な開発効率と品質に決定的な影響を与えます。段階的なアプローチを採用することで、設定の複雑さを管理し、チーム間での一貫性を保ちながら、プロジェクト固有の要件にも柔軟に対応できるようになります。
手順の体系化により、設定漏れやミスを大幅に減らすことができました。フェーズ別のアプローチは、プロジェクトの成長に合わせて段階的に設定を充実させていく実践的な方法論です。初期段階では最小限の設定で素早くスタートし、プロジェクトの発展に合わせて必要な機能を追加していく戦略が効果的でしょう。
テンプレートとベストプラクティスの活用は、初期化効率を飛躍的に向上させます。一度確立した設定パターンをテンプレート化することで、新規プロジェクトの立ち上げ時間を大幅に短縮できます。また、チーム共通のベストプラクティスを設定に反映させることで、コード品質の一貫性も保てるのです。
環境別設定管理の重要性も実感していただけたかと思います。開発・ステージング・本番環境それぞれに最適化された設定を用意することで、環境固有の問題を未然に防ぎ、デプロイ時のトラブルを最小化できます。
今後の Vite プロジェクト開発において、この記事で紹介した手順とベストプラクティスを活用することで、より効率的で品質の高い開発環境を構築していただけるはずです。適切な初期化は投資であり、その効果は開発期間全体を通じて継続的に得られることでしょう。
関連リンク
- review
もう無駄な努力はしない!『イシューからはじめよ』安宅和人著で身につけた、99%の人が知らない本当に価値ある問題の見つけ方
- review
もう朝起きるのが辛くない!『スタンフォード式 最高の睡眠』西野精治著で学んだ、たった 90 分で人生が変わる睡眠革命
- review
もう「なんとなく」で決めない!『解像度を上げる』馬田隆明著で身につけた、曖昧思考を一瞬で明晰にする技術
- review
もう疲れ知らず!『最高の体調』鈴木祐著で手に入れた、一生モノの健康習慣術
- review
人生が激変!『苦しかったときの話をしようか』森岡毅著で発見した、本当に幸せなキャリアの築き方
- review
もう「何言ってるの?」とは言わせない!『バナナの魅力を 100 文字で伝えてください』柿内尚文著 で今日からあなたも伝え方の達人!