برنامه نویسی

در Symfony با Vite واکنش نشان دهید

مشکل روز: من می‌خواهم وارد React شوم، اما با یک بک‌اند Symfony.

خوب، شما به من می گویید که از Webpack Encore استفاده کنم و حق با شماست… به جز اینکه وب پک کند است، به خصوص در فاز توسعه.

بنابراین ایده این است که بفهمیم چگونه Vite را در پروژه خود ادغام کنیم و چگونه Vite را برای اجرای React پیکربندی کنیم.

بیایید پروژه Symfony خود را ایجاد کنیم (6)

هیچ چیز در اینجا با Symfony CLI پیچیده نیست:

symfony new --webapp reactSymfonyProject

Vite را در پروژه Symfony من ادغام کنید

خوشبختانه، کسی آن را برای ما رقم زد (اگرچه انجام آن با دست نیز غیر ممکن نبود). بنابراین یک بسته نرم افزاری برای آن وجود دارد!

دایرکتوری پروژه را وارد کرده و بسته را نصب کنید:

composer require pentatrion/vite-bundle

در اینجا نتیجه نصب است:

نتیجه نصب شما بسته نرم افزاری

بنابراین همانطور که نشان داده شد، از مرحله اول صرف نظر می کنیم – به طور خلاصه، پارامترهای پیش فرض را ترک می کنیم.
اگر دومی همچنان ارزش نگاه کردن را دارد (به فایل vite.config.js همانطور که نشان داده شده است نگاهی بیندازید)، فایل نیازی به تغییر ندارد.

مرحله 3 را دنبال کنید و وابستگی های جاوا اسکریپت را نصب کنید

yarn install (ou npm install)

در نهایت، ما می‌خواهیم قالب اصلی Twig خود را تغییر دهیم تا نتیجه کامپایل Vite را بدست آوریم.

در فایل templates/base.html.twig، خط را جایگزین کنید:
{{ encore_entry_link_tags('app') }}
همتراز
{{ vite_entry_link_tags('app') }}

سپس خط:
{{ encore_entry_script_tags('app') }}
همتراز
{{ vite_entry_script_tags('app', { dependency: 'react' }) }}

ایجاد یک کنترلر تست

در اصل پروژه:

symfony console make:controller Test

اکنون یک URL /test در دسترس داریم

تست برتر

همه اینها را شروع خواهیم کرد و نتیجه را خواهیم دید

ابتدا سرور PHP داخلی را راه اندازی می کنیم:
symfony serve -d

سپس دارایی های خود را جمع آوری می کنیم:
yarn dev

اکنون به مرورگر خود در آدرس زیر بروید:
https://127.0.0.1:8000/test

توجه: پورت 8000 ممکن است در نصب شما متفاوت باشد. هنگام راه اندازی سرور PHP آدرس داده می شود.

حالا با باز کردن کنسول جاوا اسکریپت (F12) نتیجه را ببینید:

تجسم نتیجه در مرورگر

ما در اینجا می بینیم که نتیجه اسکریپت assets/app.js خود را می یابیم و Vite واقعاً در حالت dev راه اندازی شده است.

می توانید تست کنید تا ببینید Vite در مقایسه با Webpack چقدر قدرتمند است.

هر کدام را در انتهای فایل assets/app.js اضافه کنید console.log('plop')و بدون بارگیری مجدد صفحه مرورگر، فوراً نتیجه را در کنسول مشاهده کنید!

برای Vite خوب است، اما برای React؟

در حال حاضر ما موافقیم، Quick کار می کند اما React در چشم نیست (به شوخی React – Vue توجه کنید).

ما 2 چیز را از دست می دهیم: البته کد، اما همچنین وابستگی ها.

بیایید آنها را نصب کنیم:

yarn add -D @vitejs/plugin-react @types/react @types/react-dom
yarn add react react-dom

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون جاوا اسکریپت خود را تغییر می دهیم و مقداری React انجام می دهیم.

فایل assets/app.js را باز کنید و آن را به صورت زیر تبدیل کنید:

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'

import "./app.css";

ReactDOM.createRoot(document.getElementById('root')).render(
    <React.StrictMode>
        <App />
    </React.StrictMode>,
)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که می بینید، ما قصد داریم برنامه خود را در عنصری با شناسه “root” “رندر” کنیم.

فعلا نداریم برای انجام این کار، صفحه آزمایشی خود (فایل templates/test/index.html.twig) را به صورت زیر تغییر می دهیم:

{% extends 'base.html.twig' %}

{% block title %}Hello TestController!{% endblock %}

{% block body %}
<div id="root"></div>
{% endblock %}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما می خواهیم Quick را مجددا راه اندازی کنیم و ببینیم چه اتفاقی می افتد …
در ریشه پروژه، Vite را مجدداً راه اندازی کنید.
yarn dev

اوه، یک خطای بزرگ ظاهر می شود و طبیعی است:

خطای کامپایل

ما JSX را در یک فایل با پسوند “.js” قرار می دهیم.
به دلایل عملی، نام app.js خود را به main.jsx تغییر می دهیم

همچنین فراموش نکنیم vite.config.js خود را با اشاره به فایل main.jsx به جای app.js تغییر دهیم. همچنین از این فرصت استفاده می کنیم و به Vite می گوییم که از پلاگین React آن استفاده می کنیم. بنابراین فایل vite.config.js شما باید به شکل زیر باشد:

import { defineConfig } from "vite";
import symfonyPlugin from "vite-plugin-symfony";
import react from '@vitejs/plugin-react'


export default defineConfig({
    plugins: [
        react(),
        symfonyPlugin(),
    ],
    build: {
        rollupOptions: {
            input: {
                app: "./assets/main.jsx"
            },
        }
    },
});

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Vite را مجدداً راه اندازی کنید و ببینید که یک خطای جدید دارید … طبیعی است، ما کدمان را کامل نکرده ایم؛)
ما در فایل main.jsx خود می گوییم مولفه “App” را رندر کنیم اما آن را ایجاد نکردیم! همچنین به دلایل تضاد است که نام app.js خود را به main.jsx تغییر دادیم نه به app.jsx.

اکنون در همان سطح main.jsx یک فایل App.jsx با این محتوا ایجاد کنید:

import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from './images/vite.svg'

function App() {
  const [count, setCount] = useState(0)

  return (
    <div className="App">
      <div>
        <a href="https://vitejs.dev" target="_blank">
          <img src={viteLogo} className="logo" alt="Vite logo" />
        </a>
        <a href="https://reactjs.org" target="_blank">
          <img src={reactLogo} className="logo react" alt="React logo" />
        </a>
      </div>
      <h1>Vite + React</h1>
      <div className="card">
        <button onClick={() => setCount((count) => count + 1)}>
          count is {count}
        </button>
        <p>
          Edit <code>assets/App.jsx</code> and save to test HMR
        </p>
      </div>
      <p className="read-the-docs">
        Click on the Vite and React logos to learn more
      </p>
    </div>
  )
}

export default App

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه: لوگوهای React و Vite را در SVG در اینترنت خواهید یافت 😉

همچنین CSS برنامه (فایل assets/app.css) را به صورت زیر تغییر دهید:

#root {
  max-width: 1280px;
  margin: 0 auto;
  padding: 2rem;
  text-align: center;
}

.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
  filter: drop-shadow(0 0 2em #61dafbaa);
}

@keyframes logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

@media (prefers-reduced-motion: no-preference) {
  a:nth-of-type(2) .logo {
    animation: logo-spin infinite 20s linear;
  }
}

.card {
  padding: 2em;
}

.read-the-docs {
  color: #888;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و اکنون، به طور معمول، باید این صفحه در مرورگر شما ظاهر شود:

نتیجه نهایی را ثبت کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا