使用 Laravel × React + TypeScript 搭建 SPA 的开发环境(使用 Laravel Sail)
我使用 Laravel Sail 搭建了一个 Laravel9 × React18 的 SPA 开发环境,现在来向大家介绍一下。
有许多关于使用 Laravel × React 创建 SPA 的文章,但是我也总结了如何更改 Sail 的默认设置(在不需要 Docker 知识的情况下)以及如何引入 Sass,所以如果您能阅读这篇文章,我会很高兴。
从2022年6月开始,vite(ヴィート)被选为新安装Laravel时的默认构建工具。本文中也使用vite而不是Laravel Mix。
Laravel Sail是什么
Laravel Sail 是一个工具,可以在 Docker 上构建 Laravel 应用程序的开发环境,而无需有 Docker 经验,并使用 PHP、MySQL、Redis 等。但是,如果要更改为使用 MongoDB 而不是 MySQL 等 Sail 并未提供的配置,则可能需要 Docker 知识。
本地环境
-
- macOS Monterey v12.3 (MacBook Air M1 2020)
- Docker v20.10.8
安装Docker桌面版
使用 Laravel Sail 构建开发环境时,需要安装 Docker。
根据操作系统环境的不同,安装方法也不同,但是对于 macOS 或 Windows 用户而言,可以简单地安装 Docker Desktop 来使用 Docker。
请参考下面的网站等相关资料。
如果您想学习Docker,以下的文章可能会给您一些参考。该文章详细介绍了Docker的基本概念和术语,从解释docker-compose.yml的使用到定义和执行多个容器,能够帮助您打下坚实的基础。
创建Laravel的开发环境
我們將建立Laravel的開發環境。
请打开终端,并切换到任意目录。
您可以使用以下命令来构建 Laravel 的开发环境。
curl -s "https://laravel.build/example-spa?with=mysql,mailhog" | bash
ここではアプリケーション名を『 example-spa 』にしていますが、お好きな名前に変えていただいても問題ありません。
『 ?with=mysql,mailpit 』をつけること、MySQL と MailHog を利用できます。( ?with= をつけない場合、mysql、redis、meilisearch、mailpit、selenium が設定されます。)
MySQL の代わりに PostgreSQL を使いたい場合は、『 mysql 』を『 pgsql 』に変更してください。
?with= 以降に設定できるサービスについて詳しく知りたい方は公式サイト(installation choosing-your-sail-services)を参考にしてください。
当创建 Laravel 应用程序时,会要求输入密码,然后输入计算机密码。
Application ready! Build something amazing.
Sail scaffolding installed successfully.
Please provide your password so we can make some final adjustments to your application's permissions.
Password:
输入密码后,我想会显示以下的句子:
Thank you! We hope you build something incredible.
Dive in with: cd example-spa && ./vendor/bin/sail up
按照指示打字并启动Sail。
cd example-spa && ./vendor/bin/sail up
在网络浏览器中访问 http://localhost,并确认是否显示了一个标有“Laravel”的页面。
按下[Ctrl] + [C]键来暂停Sail一次。
在使用Laravel Sail构建的应用程序中,我们将使用Sail命令进行开发。由于每次都要键入”./vendor/bin/sail”很麻烦,因此我们将设置一个Shell别名。请参考官方网站(sail configuring-a-shell-alias)获取详细信息。
通过设置以下的shell别名,你可以将”./vendor/bin/sail”修改为”alias_name”,并且能够顺利启动。
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
sail up -d
在添加-d之后的sail up是一个选项,可用于启动Sail的背景操作,无需打开新的终端即可输入其他命令。
引入React(支持TypeScript)
那么,我们将进行React开发环境的导入。
这次我们将在Laravel开发环境中搭建React开发环境。
具体来说,在resources目录下创建一个ts目录,在其中使用Laravel安装时同时安装的node、npm和npx工具进行React开发。
检查已搭建的 Laravel 开发环境是否已安装有 node、npm、npx。
sail node --version
# v16.17.0
sail npm --version
# 8.18.0
sail npx --version
# 8.18.0
安装所需的React模块。
使用以下命令,会批量安装在package.json文件中所记录的包(例如在Laravel中使用Vite所需的包)。同时也会创建node_modules目录和package-lock.json文件。
sail npm install
安装所需的 React 模块。
sail npm install -D react react-dom @types/react @types/react-dom
sail npm install -D @vitejs/plugin-react
# Reactでルーティングを実装したい場合は、以下のパッケージもインストール
# sail npm install -D react-router-dom
# sail npm install -D @types/react-router-dom
引入TypeScript
sail npm install -D typescript
sail npx tsc --init --jsx react-jsx
tsconfig.json 将被创建在根目录中。
Vite的设置
我要修改 vite.config.js。
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react'; // <- 追加
export default defineConfig({
plugins: [
laravel({
// input: ['resources/css/app.css', 'resources/js/app.js'],
refresh: true,
// typescriptとsassが使えるように変更
input: [
'resources/sass/app.scss',
'resources/ts/index.tsx'
],
}),
react(), // <- 追加
],
});
在输入中,指定了TSX文件和Sass文件的入口点。如果使用create-react-app构建React环境,index.tsx将成为应用程序的入口点(路径),因此做了相应的调整,但更改为任意文件名也没有问题。
刷新:恢复:true会产生以下效果。
如果refresh选项设置为true,当保存resources/views/**、app/View/Components/**、routes/**的文件时,在npm run dev运行的过程中,浏览器将执行完整的页面刷新。参考:Laravel 和译翻译文档 – vite
通过添加 react() 来引入 Fast Refresh 等功能。详细信息请参考 @vitejs/plugin-react。
创建index.blade.php文件
在views目录中创建一个index.blade.php文件。
请删除 welcome.blade.php,因为它是不需要的。
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>sample-api</title>
{{-- react に変更があったとき自動で --}}
@viteReactRefresh
@vite(['resources/sass/app.scss', 'resources/ts/index.tsx'])
</head>
<body class="antialiased">
<div id="app"></div>
</body>
</html>
需要在 @vite() 中设置 TSX 文件和 Sass 文件的入口点。
需要先调用 @viteReactRefresh,然后再调用 @vite。
创建index.tsx文件
在resources目录下添加一个名为ts的文件夹,并在其中创建一个index.tsx文件。
import React from 'react';
import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = createRoot(container!); // createRoot(container!) if you use TypeScript
root.render(
// <React.StrictMode>
<div className="text-red">
Hello World
</div>
// </React.StrictMode>,
);
编辑web.php文件
将“welcome”更改为“index”。
// Route::get('/', function () {
// return view('welcome');
// });
Route::get('/', function () {
return view('index');
});
Sass的入门手册
我要安装Sass软件包。
sail npm install -D sass
将resources/css/app.css更改为resources/sass/app.scss。
.text-red {
color: red;
}
确认 React 和 Sass 的功能正常运行
sail npm run dev
访问 http://localhost,如果以红色文字显示 “Hello World”,那么React和Sass都能正常运行。
Laravel 和 React 的整合
最后,我们将对Laravel和React进行协作。
创建App.tsx
在resources/ts目录下创建App.tsx。
import React, { useEffect } from 'react';
import axios from 'axios';
const App: React.FC = () => {
useEffect(()=>{
const fetchFromLaravel = async () => {
const res = await axios.get(`/api/hoge`);
alert(res.data.hoge)
};
fetchFromLaravel();
}, [])
return (
<div className="App"></div>
);
}
export default App;
编辑index.tsx
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App'; // <- 追加
const container = document.getElementById('app');
const root = createRoot(container!); // createRoot(container!) if you use TypeScript
root.render(
// <React.StrictMode>
<div className="text-red">
{/* Hello World */}
<App /> {/* <- 追加 */}
</div>
// </React.StrictMode>,
);
编辑api.php
Route::get('/hoge', function (Request $request) {
return response()->json(
[
'hoge' => 'Hello from Laravel'
]
);
});
如果在访问 http://localhost 时,弹出 Alert 并显示 “Hello from Laravel”,那就意味着 Laravel 和 React 的协作已经完成。
按下【Ctrl】+【C】键来停止vite。
帆也将停止运行。
sail down
结束
這次只限於設置最基本的Laravel和React連接,並未包含引入認證功能或使用資料庫等。在Laravel中,有許多針對SPA認證的功能,例如Laravel Sanctum,另外還準備了很多用於Web API開發的功能,建議參考官方文件。