使用Laravel(版本10)+ React + TypeScript构建单页应用

我将介绍在Laravel(版本10)中使用TypeScript编写React前端的环境搭建方法,同时也作为备忘录。

Laravel的安装

首先,在终端中切换到要创建项目的目录,并进行Laravel的安装。

$ composer create-project laravel/laravel (プロジェクト名)

安装React(TypeScript)所需的模块。

一旦创建了 Laravel 项目后,切换到项目文件夹并开始安装 React。

安装用于管理Node.js包的npm。

npm install

安装TypeScript的React

npm install -D react react-dom @types/react @types/react-dom

为了在Vite中使用React,需要安装@vitejs/plugin-react插件。

npm install -D @vitejs/plugin-react

安装TypeScript

npm install -D typescript

创建用于React类型Script的设置文件(tsconfig.json)

npx tsc --init --jsx react-jsx

Vite的设置

在创建laravel项目时,会生成一个名为vite.config.js的文件。
将该文件的扩展名从”.js”更改为”.ts”,成为vite.config.ts。
然后,将其内容修改如下:

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            input: ['resources/css/app.css', 
                    //↓削除
                    //'resources/js/app.js',
                    //↓追加
                    'resources/ts/app.ts'],
            refresh: true,
        }),
    ],
});

TypeScript 视图显示实现

请在资源目录中新建名为”ts”的文件夹。
在该文件夹中创建名为index.tsx的文件,并按照以下内容进行编辑。

import React from 'react';
import { createRoot } from 'react-dom/client';


const container = document.getElementById('app');
const root = createRoot(container!); 

root.render(
    <>
        <div>
            Hello, world!
        </div>
    </>

);

接下来,在resource目录下的views目录中创建一个名为index.balde.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>laravel+TypeScript</title>
    @viteReactRefresh
    @vite([
    'resources/css/app.css',
    'resources/ts/index.tsx',
    ])
</head>
<body>
    <div id="app"></div>
</body>
</html>

将routes文件夹中的web.php文件重写如下。

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/



Route::get('{any}', function () {
    return view('index');
})->where('any','.*');

在本地启动服务器并进行确认。
再打开一个终端并移动到项目的目录。
如果使用VScode,则可以使用VScode的终端。
在其中的一个终端中

php artisan serve

在另一个终端中

npm run dev
hell.png

进行路由测试

实现页面切换。
安装React Router以进行路由设置。
此外,本次使用的版本是ver.6(虽然互联网上的信息更多是关于ver.5的,但代码写法与ver.6不同,用ver.5的写法无法正常运行)。

npm i -D react-router-dom @types/react-router-dom

创建切换页面(组件)。
这次我们创建Nav、Home和About这三个组件。
在ts目录下创建Nav.tsx、Home.tsx和About.tsx,并编辑如下。

import { FC } from "react"
import { Link } from 'react-router-dom';

export const Nav: FC = () => {


    return (
        <header>
            <h1>Nav</h1>
                
            <ul>
                <li><Link to="home">Home</Link></li>
                <li><Link to="about">About</Link></li>
            </ul>
        </header>
    )

}

import { FC } from "react"


export const Home: FC = () => {


    return (
        <div >
            <h1>Home</h1>
            <p>Homemコンポーネントです</p>
        </div>
    )

}
import { FC } from "react"


export const About: FC = () => {


    return (
        <div >
            <h1>About</h1>
            <p>Aboutコンポーネントです</p>
        </div>
    )

}

接下来,将index.tsx文件的内容改写如下:

import React from 'react';
import { createRoot } from 'react-dom/client';
import { BrowserRouter, Routes, Route } from 'react-router-dom';

import { Nav } from './Nav';
import { Home } from './Home';
import { About } from './About';


const container = document.getElementById('app');
const root = createRoot(container!);

root.render(

    <React.StrictMode>

    <BrowserRouter>
    <Nav />
      <Routes>
        <Route path="/home" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </BrowserRouter>
  </React.StrictMode>

);
ab.png

任务已经完成。

广告
将在 10 秒后关闭
bannerAds