ToCode
Ir al canal en Telegram
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Mostrar mรกs1 419
Suscriptores
Sin datos24 horas
Sin datos7 dรญas
Sin datos30 dรญas
Archivo de publicaciones
1 419
# ืื ื ืื ืืืืื ืฉืฉืื ืืขืืชื ื useEffect
ืืื ืืื ืื ื ืืคืชื ืืืืืืื ืืื ืืืขืืืืช ืืืืืจืืช ืฉืื ื ืขืืฉื ืขื useEffect. ืืื ืชืืื ืืชื ืืืืื ืื ืืืฆืืฅ ืืงืื ืืฉืืืจ ืฉืื ื ืืชืืชื ืืืจืืืช ืืื ืืื ืืืงื ืืื ืืืฆืื ืืช ืืืขืื.
ืืงืื ืืฉืชืืฉ ื ResizeObserver ืืื ืืืจืืฅ ืงืื ืื ืคืขื ืฉืืืืื ืฉื ืืืื ื ืืกืืื ืฉืืื ืืกืชืื ืขืืื ืืฉืชื ื:
import React, { useEffect } from 'react';
// trackedRef is a reference to a DOM element
export default function ResizeHandler({ trackedRef }) {
useEffect(() => {
const resizeObserver = new ResizeObserver(() => {
const height = trackedRef.current.scrollHeight;
console.log(`Your new height is: ${height}`);
});
resizeObserver.observe(trackedRef.current);
return function cancel() {
resizeObserver.disconnect();
}
}, [trackedRef]);
return <></>;
}
ืจืืืื ืืช ืืืื? ืืืืื ืื ืืฉืชืฃ ืืชืืืืืช ืืืืืืืจ ืืกืืื ืื ืืืืช.
(ื .ื. ืืื ืืคืื ืงืฆืืืช ืฉื ืจืืืงื, useEffect ืืืชื ืืฉืืืื ืืืื ืืืื ืจืืฉืื. ืืืขืชื ืืืื ืขื ืืืจืืืื ืฉื ืืืคืืืืช ืืื componentDidMount ื componentDidUpdate ืืืฉืืชื ืฉืื ื ืืฉ ืคืืชืจืื ืืื ืืฆืจืืช ืฉืื ืืืงืื ืืื. ืืคืืขื ืืืกืจ ืชืฉืืืช ืื ืืื ืืืืืื ืืื ืืืจื ืื ืืืืฆืจ ืืื ืกืืฃ ืืืืื ืืฆืืจืชืืื ืืขืืืื ืืืชื. ืืืงืจื ืืื ืืืจืืช ืฉืืฉืชืืฉืชื ื eslint ืืืืจืืช ืฉ eslint ืืืื ืืื ืกืคืฆืืคื ืืืชืืืืืืช ืขื ืืืื ืืงืื ืืืืืืง ืืื ืขืืืื ืืชืขืื ืืืืขืืช ืืื ืืืืืจ. ืืื ืื ืคื ืืืืฆืืช ืงืกื ืืืฅ ืืืืืืช ืืืื ืืืืจืื ืืขืืืื ืขื useEffect, ืืืชืื ืืคืงืืื ืงืฆืจืื ืืื ืืืชืจ ืืื ืืื ืืืงืืืช ืฉืืืืืจืฆืื ืืืื ืฉื ืจืืืงื ืื ืืืจืืื ืืืื ืขื ืื ืื ืื ืืืชืจ ืืืืืืชื).1 419
# ืืืื ื ืืืืืื ืจ: ื ืืืื ืืฉืชืืฉืื ืขื auth0
ืชืงื OAuth ืืื ืืืช ืืืืคืืืช ืืืืืืืช ืฉื ืืืื ืืจื ื, ืืื ืืืคืฉืจ ืืื ืืช ืืช ืื ืื ืื ื ืืืืืืืช ืฉืืืื ื ืืฉืชืืฉืื ืืื. ืืฆืขืจื ืฉื OAuth ืืื ืื ืืกืคืืง ืืกืืื ืืฉืืื ืฉืืชืื ืชืื ืื ืืจืฆื ืืืืื ืืืชื, ืืื ืืฆื ืฉืืฉืื ืื ื ืื ืฆืจืืืื ืืืืฉ ืื ืื ืื ืืืืืืช ืื ืื ื ืืืคืฉืื ืืืื Tutorial ืคืฉืื ืืืจืื ืคืขืืื ืืื ืื ืืคื ืืืืจืืืช ืืืจ ืฉืื ืืชืืื ืื ื ืื ืขื ืืขืืืืช.
ืืฉืืืข ืื ืื ื ืืืืืื ืืชืงื ืืช ืื.
ืืืื ืืืืฉื ืืงืจืื ืืขืืืจ ืืื ืืืืื ืจ ืฉื ืฉืขื ืขื OAuth ืฉืืืกื ืื ืืช ืืชืืืืจืื ืืื ืื ืื ืฉื ืืขืจืืช ืฉืจืช/ืืงืื ืืืฉืชืืฉืช ื OAuth ืืื ืืืคืฉืจ ืืืฉืชืืฉืื ืืืฉืช ื API ืืฆืืจื ืืืืืืืช. ืืืืืื ืจ ื ืจืื:
1. ืื ืื OAuth, ืื ืื OpenID Connect, ืืชืืืณืก ืืื ืื ืขืืื.
2. ื ืืืจ ืืช Auth0, ืฉืืื ืืขืจืืช ืขื ื ืฉืืืคืืช ืืจืื ืืืืงืื ืืงืฉืื ืืืืืืฉ ืื ืื ืื ืืืืืืช ื OAuth.
3. ื ืื ื ืืขืืจืช Auth0 ืฉืจืช API ืฉืจืง ืืฉืชืืฉืื ืจืฉืืืื ืืืืืื ืืคื ืืช ืืืื.
4. ื ืื ื ืืงืื React ืฉืืืคืฉืจ ืืืฉืชืืฉืื "ืืืชืืืจ" ืืืขืจืืช ืืืืฆืข ืคืขืืืืช ืืฉืจืช ื API.
ืืืจื ื ืืืจ ืขื JWT, Access Tokens, ID Tokens, Refresh Tokens, ืขื ื ืืืื Session ืืขืืจืช Cookies ืื Local Storage, ืืื ืฉืืื ืืืจืช ืฉืชืืื ืืื ืื ืืฉื ืืืืืืช.
ืืืืืื ืจ ืืขืจื ืืืื ืืืื ืืืืฉื ืืงืจืื ื 2/6 ืืฉืขื ืขืฉืจ ืืืืงืจ. ืืคืจืืื ืืืจืฉืื ืืืื ื ืืื ืกื ืืืฃ ืืืืืื ืจ ืืงืืฉืืจ:
https://www.tocode.co.il/workshops/114
1 419
ืืืื ื Layout ืืื ืืกื ืืื ืงืืืคืื ื ืืช ืจืืืงื ืฉืืืฉืืช ืืช ืืืืืข ืืืขืืืจื ืืืชื ื Homepage ืื About ืืืชืืื. ืจืง ืืฉืืื ืืืื ื ืืืกืคืชื ืืืชืจืช ืืฉืืชืคืช ืืื ืืืคืื ืืืืคืกื ืฉื ืื ืชืื ืฉืื ืื ื ืืจืืข ืืืงืจืื ืื. ืื ืืงืื ืฉื Layout:
function Layout() {
const location = useLocation();
const url = useHref(location);
const { data, error } = useSWR(url, fetcher)
if (error) {
console.log(error);
return <p>Error: {JSON.stringify(error)}</p>
}
return (
<div>
<h1>My App</h1>
<p>Visiting: {url}</p>
{data && <Outlet context={data} />}
</div>
);
}
ืืืืจ ืืืืจืื ืืฆื ืฉื ื Layout ืืื ืืคืื ืงืฆืื fetcher ืฉืืืืงืช ืื ื url ืืชืืื ืืืืืข ืฉืืืืืข ืืขืืื, ืืืืืจ ืื ืื ืื ื ืฆืจืืืื ืืืขืืืจ ืืช ืืืืืข ืืืืฃ ืฉืืจืืข ื ืืขื. ืื ื url ืืื ืื ืืคืฉืจ ืืืืืืจ ืืช ืืืืืข ืฉืืืฃ, ืืื ืืื ืฉืื ื ืื ืืืืจ ืฉืื ืื ื ืืืขืืจ ืขืืื ืืื ืฆืจืื ืืืขืื ืืชืืจ JSON ืืช ืืืฉืชื ืื ืืื ืชืื ืืืืฉ. ืื ืืงืื:
const fetcher = async (url) => {
const pageData = document.querySelector(`#page-data[data-url="${url}"]`);
if (pageData) {
console.log(`Reading data from page`);
return JSON.parse(pageData.innerHTML);
} else {
const res = await fetch(url, { headers: { accept: 'application/json' } })
return await res.json();
}
}
ืขืืฉืื ืื ื ืืืื ืืืืฉืื ืืืคืื ืขืฆืื ืืฉื ืืืฉืื ืืช ืืืืืข ืืืืฉืชืืฉ ืื. ืืืฉืืื ืืฉืชืืฉืช ืืคืื ืงืฆืื ืฉื React Router ืฉื ืงืจืืช useOutletContext ืืืงืื (ืืืืืื ืฉื ืืฃ ืืืืช) ื ืจืื ืื:
import React, { useState } from 'react';
import { Link, useOutletContext } from "react-router-dom";
export default function Homepage() {
const [name, setName] = useState('');
const { page } = useOutletContext();
return (
<div>
<h2>Page Name From Rails: {page}</h2>
<label>
Please type your name:
<input type="text" value={name} onChange={(e) => setName(e.currentTarget.value)} />
</label>
{name !== '' && <p>Hello! {name}</p>}
<Link to="/about/index">About Us</Link>
</div>
);
}
## ืกืืืื
ืืืจืืช ืฉืื ืืฉืชืืฉื ื ืืื ืื ืื ืื ืืืืื ืื ืฉื ืจืืืืก, ืืชืืฆืื ืืื ืงืื ืฉืืจืื ืืืืจ ืืฆื ืืฉืจืช ืืืชืื ืชืื ืจืืืืก ืืืฆื ืืืงืื ืืืชืื ืชื ืจืืืงื. ืืฆื ืืฉืจืช ืงืื ืืจืืืจ ืคืฉืื ืฆืจืื ืืืชืื ืืฉืชื ื ืืืงืจืื ืืคืื ืงืฆืื respond_with:
class HomeController < ApplicationController
def index
@page = { page: 'Home Page' }
respond_with(@page)
end
end
ืืฉืืืื ืืืืจ ืืืืื ืฉืืืืจ ืืื ืื ืฉืืฉื ืืืื ืืืืืช @page ืืื ืืืชืืื ืืงืื ืฉืืชืื ื ื layout.
ืืฆื ืืืงืื ืื ื ืืฉืชืืฉ ืืคืื ืงืฆืื useOutletContext ืืื ืืืฉืื ืืช ืืืฉืชื ื page, ืฉืืืื ืืืืืช ืื ืืืืืงื JSON ืืืจืื ืฉืืืื ืชืืฆืื ืฉื ืฉืืืืชื ืื ืฉืืืืชืืช ืืกืืืืืช, ืืืฉืชืืฉ ืื ืืงืืืคืื ื ืื:
import React, { useState } from 'react';
import { Link, useOutletContext } from "react-router-dom";
export default function Homepage() {
const [name, setName] = useState('');
const { page } = useOutletContext();
return (
<div>
<h2>Page Name From Rails: {page}</h2>
<label>
Please type your name:
<input type="text" value={name} onChange={(e) => setName(e.currentTarget.value)} />
</label>
{name !== '' && <p>Hello! {name}</p>}
<Link to="/about/index">About Us</Link>
</div>
);
}
ืืช ืืงืื ืืืื ืชืืืื ืืืฆืื ืืจืืคื:
https://github.com/ynonp/react-rails-vite-demo1 419
# ืืืจืื: ืืฆืืจืช ืืคืืืงืฆืืืช React ืืชืื ืฉืจืช Rails 7 - ืืืง 2 - ืืขืืจืช ืืฉืชื ืื
ืคืืกื ืื ืืื ืืืง ืฉื ื ืฉื ืืืจืื ืืงืืช ืืืฉืื React ื Rails ื Rails 7. ืื ืคืกืคืกืชื ืืืืง ืืจืืฉืื ืืืื ืืงืืฉืืจ:
https://www.tocode.co.il/blog/2022-05-react-rails-7-vite-rails
ืืืืง ืื ื ืจืื ืืจื ืืืช ืืืขืืืจ ืืฉืชื ืื ืืื ืฉืจืช ืืจืืืืก ืืืืฉืื ืืจืืืงื.
## ืืืขืื ืขื ืืฉืชื ืื
ืืืืง ืืงืืื ืฉื ืืืืจืื ืืจืืืชื ืืื ืืื ืืช ืฉืจืช ืจืืืืก ืฉืืืืฉ ืืืงืื ืืคืืืงืฆืืืช ืจืืืงื. ืื ืฉืื ืืืืจืชื ืขืืื ืื ืืงืฉืจ ืืื ืฉื ื ืืืืงืื - ืืืคืจื ืืื ืื ื ืืขืืืจ ืืืืข ื Rails Controller ืืืฃ ืืจืืืงื ืฉืืชืืื ืื. ืืชืืื ืืช ืืืืืื ืืื ืื ื ืฉื ื Rails Controllers, ืืื ืขืืืจ ืขืืื ืืืืช ืืืฉื ื ืขืืืจ ืขืืื ืืืืืช, ืืฉื ืืื ืื ืืจืืฆื ืงืื ืืืื ืืืืื ืืื ืงืืื.
ืืจืืืืก ืืฉ ืื ืื ืื ืื ืืื ืืืขืืจืช ืืืืข ื Controller ื View ืฉืืชืืื ืื, ืืืื ืื ืืฉืชื ื ื
@ ืฉื ืืงืื ืืจืืืจ. ืืืืืจ ืื ื ืืืื ืืืชืื ืืงืื ืฉื ืงืื ืืจืืืจ:
def index
@page_name = "Homepage"
end
ืืืืจื ืื ื View ืื ื ืืืื ืคืฉืื ืืืฉืชืืฉ ื @page_name ืืชืื ื HTML ืฉื ืืขืืื:
<h1><%= @page_name %></h1>
ืืืขืื ืฉืื ืื ื ืืืจ ืื ืืงื ืืก - ืื ืืืชืจ ื ืืื ืื ืืฉืชืืฉืื ื Views ืฉื Rails. ืื ืฉืืืชืจ ืืจืืข ืืื ืฉืื ืื ืื ืื ืืขืืจื ืืืคืื ืฉืื ื ืืฉืชืืฉ ื React Router ืืื ื Turbolinks, ืืืื ืืคืืื ืื ืืืื ื ืืฆืืืืื ืืืจืื ืืืฃ ืืจืืฉืื ืืืฆืื ืืืืข ืืจื ื Views (ืืืฉื ืขื ื'ื ืืื Gon), ืืืจื ืืขืืจ ืขืืื ืื ืืื ืฉืื ืืืจ ืฉืืืจื ืืขืืื ืืืืฉ ืืืฆืื ืืช ืืืืืข ืืืขืืืื.
ืชืฉืืื ืืฉืืืข ืฉืืืื ืืืืืฉืืช ืฉื ืจืืืืก ืืจืืืงื ืืืื ืงื ืืื ืืช ืืขืฆืื ื ืื ืื ืื ืฉืืจืื ืืืื ืืืื ืืื ืื ืื ืืจืืจืช ืืืืื ืืื ืืขืืื ืืจืืืงื.
## ืคืืชืจืื ืืืืฆืขืืช REST API
ืืคืืชืจืื ืฉื ืื ื ืืชืืกืก ืขื ื'ื ืฉื ืงืจื responders. ื'ื ืื ืืืคืฉืจ ืืืืืืจ ืฉืื ืงืื ืืจืืืจ ืืืื ืืืืื ืืื ืืื ื ืกืืืื ืฉื ืืงืฉืืช - ืืืงืจื ืฉืื ื ื ืืืืจ ืฉืื ืืืงืฉืื ืืงืื ืืจืืืจ ืืฃ HTML ืืื ืืฉืื ืืฃ ืจืืื ืืื ืฉืขืฉื ืขื ืขืืฉืื, ืืืฉืชืื ืืช ืืืฉืชื ืื ืืชืื ืืืื ื ื ืกืชืจ ืืืฃ ืืื. ืืื, ืื ืืืงืฉืื ืืืืชื ืงืื ืืจืืืจ ืืงืื JSON, ืื ืืื ืืฉืื ืจืง ืืช ืืืฉืชื ืื ืืชืืจ JSON.
ืชืืืื ืื ื ืืชืงืื ืืช ืื'ื ืขื:
$ bundle add responders
ืขืืฉืื ืื ื ืืืื ื application_controller.rb ืืืืืืจ ืื ืฉืืื ืืื ืงืื ืืจืืืจ ืฉืืืจืฉ ืืื ื ืืกืืื ืืขื ืืช ืืืงืฉืืช ื html ืืื ืืืงืฉืืช ื json:
class ApplicationController < ActionController::Base
respond_to :html, :json
end
ื ืืฉืื ื home_controller.rb ืื ืืืืจ ืฉื ืืฉืชื ื, ืื ื ืืงืจื ืื @page, ืฉืืืื ืืืืืงื ืขื ืืคืชื ืืฉื page ืฉืืชืืื ืฉืื ืืื ืืืชืจืช ืืขืืื:
class HomeController < ApplicationController
def index
@page = { page: 'Home Page' }
respond_with(@page)
end
end
ืืืชื ืืืจ ืื ื ืืืชื ื about_controller.rb ืจืง ืขื ืืืชืจืช ืขืืื ืฉืื ื:
class AboutController < ApplicationController
def index
@page = { page: 'About Page' }
respond_with(@page)
end
end
ืืคืงืืื respond_with ืืืืขื ืืื'ื responder ืืืื ืืืงืืจ ืืจืื ืืงืกื ืืื. ืืื ืืชืืืื ืืคืงืืืช ื respond_to ืฉืืชืื ื ืืจืืฉ ืืงืื ืืจืืืจ ืืจืืฉื.
ืืืืคื ืืืืืืื respond_with ืืืืขืช ืืงืืช ืืช ืืืฉืชื ื ืฉื ืชื ื ืื ืืืืคืื ืืืชื ื JSON ืื ืืืฉืื ืืืงืฉ JSON. ืืฉืืื ืืฉืชืื ืืช ืืืฉืชื ื ืืื ื HTML ืื ืื ื ืฆืจืืืื ืืืชืื ืงืฆืช ืงืื. ื ืื ื app/views/layout/application.html.erb ืืฉื ืืชืืช ื body ืื ื ืืืกืืฃ ืืช ืืืืืง ืืื:
<% if defined?(@page) %>
<script type="text/json" id="page-data" data-url="<%= request.fullpath %>">
<%= raw @page.to_json %>
</script>
<% end %>
ืขืืฉืื ืืื ืืขืื ืช ืขืืื ืจืืืืก ืืฉืชืื ืืชืืื ืืืื ื script ืขื ืชืืื ืืืฉืชื ื @page, ืืืื ืืขืืจ ืขืืื ืจืืืืก ืืฉืื ืืช ืชืืื ืืืฉืชื ื @page ืืชืืจ ืืืืืงื JSON ืืืงืื.
## ืชืืงืื ืฆื ืืงืื
ืืฆื ืฉื ืจืืืงื ืื ื ืฆืจืื ืืืฉืื ืืช ืืืืืข ืืืืขืืืจ ืืืชื ืืืคืื. ืืจื ืงืื ืืขืฉืืช ืืช ืื ืืื ืืจื ืืจ ืืืื ื Layout ืืืื ืืื ืืืคืื ืฉืืืื ืืืจืื ืขื ืืฉืืืช ืืืืืข ืืืฉืจืช ืื ืืืชืืื ืฉืืืจ ืืืืืข ื HTML, ืืืขืืืจ ืืืชื ืคื ืืื ืืืืื ื ืฉืืชืืื ืืืฃ ืื ืืืื. ืืฉืืื ืืืืกืืฃ ืืืื ื Layout ืืกืืื ืืืืื ื ืืฃ ืืืืช ืื ืืฃ ืืืืืืช ืื ื ืืฉืชืืฉ ืืงืื ืืื ืืงืืืฅ entrypoints/application.jsx:
function App() {
return (
<Router>
<Routes>
<Route element={<Layout />}>
<Route path="/" element={<Homepage />} />
<Route path="/about/index" element={<About />} />
</Route>
</Routes>
</Router>
);
}1 419
ืื grep ืขืืื ืขื ืคืชืงืื ืืืื ืื ื ืืืื ืืกื ื ืจืง ืงืืืืืื ืฉืืืืืื ืืช ืืืงืกื All passed ืืคืชืง ืืืืืงืืช:
$ git log --notes=testing --oneline --grep "All passed"
4126289 added about page
Notes (testing):
performed 10 tests. All passed
## ืฉืืืืช ืคืชืงืื ืืฉืจืช ืืจืืืง
ืืขืืืื ืขื ืืืืจ ืืจืืืง ืืืื ืื ืชืฉืืื ืืฉืืืข ืฉืืคืชืงืื ืืื ื ื ืฉืืืื ืืืจืืจืช ืืืื ืืืืืจ ืืื push ืฉืืชื ืืคืขืืืื. ืืคืงืืื ืืืื ืืืืคืช ืืช ืืืืืจ ืืื ืขื ืืคืชืงืื:
git push origin "refs/notes/*"
ืืื ืืืฉืืื ืืืืืจ ืืจืืืง ืื ืชืงืืื ืืช ืืคืชืงืื, ืืืฉืืื ืืืฉืื ืืืชื ืชืฆืืจืื ืืืคืขืื:
git fetch origin "refs/notes/*:refs/notes/*"
ืื ืืืืืจ ืืคืจืืืงื ืฉืืื ืฉืจืช ืืจืืืง ืืฉื origin, ืืคืงืืืืช ืืืืืช ืืืจืื ืืื ืคืขืืืช push ื fetch ืืืืื ืื ืืช ืืคืชืงืื
$ git config --add remote.origin.push '+refs/notes/*:refs/notes/*'
$ git config --add remote.origin.fetch '+refs/notes/*:refs/notes/*'1 419
# ืืื Git Notes ืืืื ืื ืขืืืจืื ืื ื ืืขืฉืืช ืกืืจ ืืืืืจ ืืื
ืืคืืฆ'ืจ ืฉื git notes ืงืืื ืืืื ืืืจ ืขืฉืจ ืฉื ืื ืืขืจื ืืื ืืขื ืื ืฉืื ืืืืจืื ืืืชื ืื ืืฉืชืืฉืื ืื. ืืคืืกื ืื ื ืจืื ืืื notes ืืื ืืคืงืืืืช ืืืจืืืืืช ืืขืืืื ืืืชื.
## ืื ืฆืจืื ืคืชืงืื
ืืชืืจ ืืฉืืขืืชื ืืขืืืื ืขื ืืื ืืื ืฉืงืืืืืื ืืื ื ื ืืชื ืื ืืขืจืืื. ื ืืื, ืืคืฉืจ ืืืืืง ืงืืืื ืืืืฆืืจ ืืืจ ืืืงืืื (ืขื ืคืงืืืืช ืืื ืจืืืืืก, ืืื ื, ืฆ'ืจื-ืคืืง), ืืื ืืืฉ ืืงืืช ืงืืืื ืงืืื ืฉืืืคืชื ืืฉืจืช ืืฉืืืจืื ืืชืืกืกื ืขืืื ืืื ื ืืื ื ืงืืืืืื ืฉืืื, ืืืฉื ืืช ืืฉืื ืืืืืขื ืฉืื, ืื ืืืจ ืื ืคืฉืื.
ืืื ื ืืฆืจื ืื ืื ืื ืื ืฉืขืืืจืื ืื ื ืืืืกืืฃ ืืืืฉืืช ืืืจืฃ ืืงืืืืืื - ืื ืื ืื ืื ืืื ืืจืื ืฆ'ืื, ืชืืืืช ืืื ืคืชืงืื.
ืคืชืง ืืื ืืงืกื ืืืคืฉื ืฉืื ื ืืืื ืืืืืืง ืขื ืงืืืื. ืืคืชืง ืืืคืืข ืืืื (ืื ืืจืฆื ืืืฆืื ืืืชื ืฉื), ืืื ื ืืชื ืืืืืงื, ืขืจืืื ืืืืื ืืื ื ืืืื ืืืคืฉ ืงืืืืืื ืืคื ืืงืกื ืฉืืฉ ืืคืชืงืื ืฉืืื.
ืืืื ืื ืืื? ืื ื ืืื ืืืืืืืช:
1. ืื ืืฉ ืื ืกืงืจืืคื ืฉืืจืืฅ Deployment ืืืืืืื ืืกืืืืช ืืืืงืืช ืืืจื ืฉืขืฉืืชื ืงืืืื, ืื ื ืืืื ืืืืืืง ืืช ืืคืื ืฉื ืืกืงืจืืคื ืืื ืืชืืจ ืคืชืง ืืงืืืื ืืืจื ืฉืืื ืขืืฉื ืืืคืืื. ืืฆืืจื ืืืืช ืื ื ืืืื ืืืืื ืฉื deploy ืืฆืืื ืืืืืืืจ ืืืจ ืื ืืืื ืงืืืืืื ื ืื ืกื ืืืชื ืืกืืืืช ืืืืืงืืช.
2. ืืืชื ืกืงืจืืคื ืืืื ืืขืฉืืช deploy ืืกืืืืช ืคืจืืืงืฉื, ืืื ืืื ืฉืื ืืืกืืฃ ืื ืืขืจื ืืงืืืื ืฉืืงืื ื ืื ืก ืืกืืืืช ืคืจืืืงืฉื.
3. ืืจืื ืคืขืืื ืื ื ืืฉืชืืฉ ืืืื ืฉื ืืื ืืื ืืืืฆืจ ืจืฉืืืช ืฉืื ืืืื ืืฉืื ื ืืืฆืื ืืืจืกื. ืืช ืืืงืกื ืฉื ืจืฉืืืช ืืฉืื ืืืื ืื ื ืจืืฆื ืืขืจืื ืื ืืืจื ืฉืืฆืจืชื ืืช ืืืืขืช ืืงืืืื, ืืืื ืื ื ืืืื ืืืืกืืฃ ืคืชืง ืขื ืื ืงืืืื ืื ืืฉืื ืืืื ืฉืืื ืืืื, ืืขืจืื ืืช ืืคืชืงืื ืืืื ืืฉืฆืจืื ืืืกืืฃ ืืืืฆืื ืจืฉืืืช ืฉืื ืืืื ืืกืืืจืช.
4. ืืืืจืื ืืกืืืืื ืืืืืื Pipelines ืฉืืจืืฆืื ืืืืงืืช ืืืืืืืืืช ืขื ืื ืงืืืื, ืืคืจืืืงืืื ืืืจืื ืืขืกืืงืื ืื ืฉื QA ืฉืืจืืฆื ืืืืงืืช ืืฆืืจื ืืื ืืช. ืืฉื ื ืืืงืจืื ืืชืืฆืื ืฉื ืืืืืงื ืื ืืืืื ืืืืคืืข ืืชืืจ ืืืืขืช ืืงืืืื (ืื ืืื ืื ืืืชื ืืืื ื ืืฉืขืฉืื ื ืงืืืื), ืืื ืื ืื ื ืืืืืื ืืืืืืง ืืืชื ืืชืืจ ืคืชืง ืืงืืืื ืืืชืืื. ืืืจ ืื ื ืืื ืืืคืฉ ืืื ืชืืฆืืืช ืืืืืงืืช ืื ืืกื ื ืจืง ืงืืืืืื ืืื ืื ืืืืืงืืช ืขืืจื.
## ืืื ืืฉืชืืฉืื ืืคืชืงืื
ืคืชืง ืืื ืืืืข ืฉื ืฉืืจ ืืืืืจ ืฉื ืืื ืืงืืืฅ ื ืคืจื ืืืงืืืื. ืื ืื ื ืืืืืื ืืืืกืืฃ ืืื ืคืชืงืื ืฉืจืืฆืื ืขื ืื ืงืืืื ืืชื ืื ืฉืื ืืืื ื"ื ืืฉืืื" ืฉืื ืื.
ืื ื ืืืฆืจ ืืืืจ ืจืืฉืื ืืฉืืื ืืืืืื ืขื ืืคืงืืืืช:
$ git init .
$ git commit --allow-empty -m 'initial commit'
$ git commit --allow-empty -m 'created homepage'
$ git commit --allow-empty -m 'added about page'
$ git commit --allow-empty -m 'added admin panel'
$ git commit --allow-empty -m 'allow editing header from the admin pages'
ืืชืืฆืื ืืื:
$ git log --oneline
0fa947b allow editing header from the admin pages
f4fa771 added admin panel
4126289 added about page
b4a7379 created homepage
ebddbeb initial commit
ืขืืฉืื ืืืื ื ืืกืืฃ ืืื ืคืชืงืื. ื ืืืืื ืฉืืฉ ืื ื ืกืงืจืืคื ืฉืืืืข ืืฉืืื ืืช ืืคืจืืืงื ืืกืืืืช ืคืจืืืงืฉื ืืืจื ืื ืงืืืื, ืืืืชื ืกืงืจืืคื ืจืืฆื ืืืืื ืฉืืื ืขืฉื ืืช ืืขืืืื.
ืืคืงืืื ืืืื ืืืกืืคื ืคืชืง ืืกืื deployment ืืงืืืื ืืจืืฉืื ืืืืืจ:
$ git notes --ref=deploy append ebddbeb -m 'pushed to production 22/10/22 10:00'
ืืืคืงืืื ืืืื ืชืืกืืฃ ืคืชืง ืืืื ืืงืืืื ืืฉื ื:
$ git notes --ref=deploy append b4a7379 -m 'pushed to production 25/10/22 10:00'
ืขืืฉืื ื ื ืื ืฉืืฉ ืื ื ืกืงืจืืคื ื ืืกืฃ ืฉืืจืืฅ ืืืืงืืช ืืืืืืืืืช. ืืฉื ื ืืงืืืืืื ืืจืืฉืื ืื ืื ืืื ืขืืืื ืืืืงืืช ืืื ืืงืืืื ืืฉืืืฉื ืืืจ ืืชืืชื 10 ืืืืงืืช, ืืกืงืจืืคื ืืจืืฅ ืืืชื ืืืืื ืขืืจื. ืื ื ืืืื ืืืืืื ืืช ืืคืงืืืืช ืืืืืช ืฉืืืกืืคืืช ืคืชืงืื ืจืืืื ืืื ืืืืชื ืกืงืจืืคื ืืืืงืืช:
$ git notes --ref=testing append ebddbeb -m 'no tests found'
$ git notes --ref=testing append b4a7379 -m 'no tests found'
$ git notes --ref=testing append 4126289 -m 'performed 10 tests. All passed'
ืขืืฉืื ืฉืื ืืคืชืงืื ืืืงืื ืื ื ืืืื ืืืฆืื ืืช ืืืื ืืืืืกืืฃ ืื ืคืชืงืื ืืกืื ืืกืืื. ืืืืืื ืื ืืืื ืืชืืกืคืช ืื ืืคืชืงืื ืืกืื testing:
0fa947b allow editing header from the admin pages
f4fa771 added admin panel
4126289 added about page
Notes (testing):
performed 10 tests. All passed
b4a7379 created homepage
Notes (testing):
no tests found
ebddbeb initial commit
Notes (testing):
no tests found
ืืืื ืืืฆืื ืืช ืื ืืคืชืงืื ืืื ืืกืืืื ืื ื ืืืื ืืืฉืชืืฉ ืืืืืืืช:
$ git log --notes="*"1 419
# ืืื Git Notes ืืืื ืื ืขืืืจืื ืื ื ืืขืฉืืช ืกืืจ ืืืืืจ ืืื
ืืคืืฆ'ืจ ืฉื git notes ืงืืื ืืืื ืืืจ ืขืฉืจ ืฉื ืื ืืขืจื ืืื ืืขื ืื ืฉืื ืืืืจืื ืืืชื ืื ืืฉืชืืฉืื ืื. ืืคืืกื ืื ื ืจืื ืืื notes ืืื ืืคืงืืืืช ืืืจืืืืืช ืืขืืืื ืืืชื.
## ืื ืฆืจืื ืคืชืงืื
ืืชืืจ ืืฉืืขืืชื ืืขืืืื ืขื ืืื ืืื ืฉืงืืืืืื ืืื ื ื ืืชื ืื ืืขืจืืื. ื ืืื, ืืคืฉืจ ืืืืืง ืงืืืื ืืืืฆืืจ ืืืจ ืืืงืืื (ืขื ืคืงืืืืช ืืื ืจืืืืืก, ืืื ื, ืฆ'ืจื-ืคืืง), ืืื ืืืฉ ืืงืืช ืงืืืื ืงืืื ืฉืืืคืชื ืืฉืจืช ืืฉืืืจืื ืืชืืกืกื ืขืืื ืืื ื ืืื ื ืงืืืืืื ืฉืืื, ืืืฉื ืืช ืืฉืื ืืืืืขื ืฉืื, ืื ืืืจ ืื ืคืฉืื.
ืืื ื ืืฆืจื ืื ืื ืื ืื ืฉืขืืืจืื ืื ื ืืืืกืืฃ ืืืืฉืืช ืืืจืฃ ืืงืืืืืื - ืื ืื ืื ืื ืืื ืืจืื ืฆ'ืื, ืชืืืืช ืืื ืคืชืงืื.
ืคืชืง ืืื ืืงืกื ืืืคืฉื ืฉืื ื ืืืื ืืืืืืง ืขื ืงืืืื. ืืคืชืง ืืืคืืข ืืืื (ืื ืืจืฆื ืืืฆืื ืืืชื ืฉื), ืืื ื ืืชื ืืืืืงื, ืขืจืืื ืืืืื ืืื ื ืืืื ืืืคืฉ ืงืืืืืื ืืคื ืืงืกื ืฉืืฉ ืืคืชืงืื ืฉืืื.
ืืืื ืื ืืื? ืื ื ืืื ืืืืืืืช:
1. ืื ืืฉ ืื ืกืงืจืืคื ืฉืืจืืฅ Deployment ืืืืืืื ืืกืืืืช ืืืืงืืช ืืืจื ืฉืขืฉืืชื ืงืืืื, ืื ื ืืืื ืืืืืืง ืืช ืืคืื ืฉื ืืกืงืจืืคื ืืื ืืชืืจ ืคืชืง ืืงืืืื ืืืจื ืฉืืื ืขืืฉื ืืืคืืื. ืืฆืืจื ืืืืช ืื ื ืืืื ืืืืื ืฉื deploy ืืฆืืื ืืืืืืืจ ืืืจ ืื ืืืื ืงืืืืืื ื ืื ืกื ืืืชื ืืกืืืืช ืืืืืงืืช.
2. ืืืชื ืกืงืจืืคื ืืืื ืืขืฉืืช deploy ืืกืืืืช ืคืจืืืงืฉื, ืืื ืืื ืฉืื ืืืกืืฃ ืื ืืขืจื ืืงืืืื ืฉืืงืื ื ืื ืก ืืกืืืืช ืคืจืืืงืฉื.
3. ืืจืื ืคืขืืื ืื ื ืืฉืชืืฉ ืืืื ืฉื ืืื ืืื ืืืืฆืจ ืจืฉืืืช ืฉืื ืืืื ืืฉืื ื ืืืฆืื ืืืจืกื. ืืช ืืืงืกื ืฉื ืจืฉืืืช ืืฉืื ืืืื ืื ื ืจืืฆื ืืขืจืื ืื ืืืจื ืฉืืฆืจืชื ืืช ืืืืขืช ืืงืืืื, ืืืื ืื ื ืืืื ืืืืกืืฃ ืคืชืง ืขื ืื ืงืืืื ืื ืืฉืื ืืืื ืฉืืื ืืืื, ืืขืจืื ืืช ืืคืชืงืื ืืืื ืืฉืฆืจืื ืืืกืืฃ ืืืืฆืื ืจืฉืืืช ืฉืื ืืืื ืืกืืืจืช.
4. ืืืืจืื ืืกืืืืื ืืืืืื Pipelines ืฉืืจืืฆืื ืืืืงืืช ืืืืืืืืืช ืขื ืื ืงืืืื, ืืคืจืืืงืืื ืืืจืื ืืขืกืืงืื ืื ืฉื QA ืฉืืจืืฆื ืืืืงืืช ืืฆืืจื ืืื ืืช. ืืฉื ื ืืืงืจืื ืืชืืฆืื ืฉื ืืืืืงื ืื ืืืืื ืืืืคืืข ืืชืืจ ืืืืขืช ืืงืืืื (ืื ืืื ืื ืืืชื ืืืื ื ืืฉืขืฉืื ื ืงืืืื), ืืื ืื ืื ื ืืืืืื ืืืืืืง ืืืชื ืืชืืจ ืคืชืง ืืงืืืื ืืืชืืื. ืืืจ ืื ื ืืื ืืืคืฉ ืืื ืชืืฆืืืช ืืืืืงืืช ืื ืืกื ื ืจืง ืงืืืืืื ืืื ืื ืืืืืงืืช ืขืืจื.
## ืืื ืืฉืชืืฉืื ืืคืชืงืื
ืคืชืง ืืื ืืืืข ืฉื ืฉืืจ ืืืืืจ ืฉื ืืื ืืงืืืฅ ื ืคืจื ืืืงืืืื. ืื ืื ื ืืืืืื ืืืืกืืฃ ืืื ืคืชืงืื ืฉืจืืฆืื ืขื ืื ืงืืืื ืืชื ืื ืฉืื ืืืื ื"ื ืืฉืืื" ืฉืื ืื.
ืื ื ืืืฆืจ ืืืืจ ืจืืฉืื ืืฉืืื ืืืืืื ืขื ืืคืงืืืืช:
$ git init .
$ git commit --allow-empty -m 'initial commit'
$ git commit --allow-empty -m 'created homepage'
$ git commit --allow-empty -m 'added about page'
$ git commit --allow-empty -m 'added admin panel'
$ git commit --allow-empty -m 'allow editing header from the admin pages'
ืืชืืฆืื ืืื:
$ git log --oneline
0fa947b allow editing header from the admin pages
f4fa771 added admin panel
4126289 added about page
b4a7379 created homepage
ebddbeb initial commit
ืขืืฉืื ืืืื ื ืืกืืฃ ืืื ืคืชืงืื. ื ืืืืื ืฉืืฉ ืื ื ืกืงืจืืคื ืฉืืืืข ืืฉืืื ืืช ืืคืจืืืงื ืืกืืืืช ืคืจืืืงืฉื ืืืจื ืื ืงืืืื, ืืืืชื ืกืงืจืืคื ืจืืฆื ืืืืื ืฉืืื ืขืฉื ืืช ืืขืืืื.
ืืคืงืืื ืืืื ืืืกืืคื ืคืชืง ืืกืื deployment ืืงืืืื ืืจืืฉืื ืืืืืจ:
$ git notes --ref=deploy append ebddbeb -m 'pushed to production 22/10/22 10:00'
ืืืคืงืืื ืืืื ืชืืกืืฃ ืคืชืง ืืืื ืืงืืืื ืืฉื ื:
$ git notes --ref=deploy append b4a7379 -m 'pushed to production 25/10/22 10:00'
ืขืืฉืื ื ื ืื ืฉืืฉ ืื ื ืกืงืจืืคื ื ืืกืฃ ืฉืืจืืฅ ืืืืงืืช ืืืืืืืืืช. ืืฉื ื ืืงืืืืืื ืืจืืฉืื ืื ืื ืืื ืขืืืื ืืืืงืืช ืืื ืืงืืืื ืืฉืืืฉื ืืืจ ืืชืืชื 10 ืืืืงืืช, ืืกืงืจืืคื ืืจืืฅ ืืืชื ืืืืื ืขืืจื. ืื ื ืืืื ืืืืืื ืืช ืืคืงืืืืช ืืืืืช ืฉืืืกืืคืืช ืคืชืงืื ืจืืืื ืืื ืืืืชื ืกืงืจืืคื ืืืืงืืช:
$ git notes --ref=testing append ebddbeb -m 'no tests found'
$ git notes --ref=testing append b4a7379 -m 'no tests found'
$ git notes --ref=testing append 4126289 -m 'performed 10 tests. All passed'
ืขืืฉืื ืฉืื ืืคืชืงืื ืืืงืื ืื ื ืืืื ืืืฆืื ืืช ืืืื ืืืืืกืืฃ ืื ืคืชืงืื ืืกืื ืืกืืื. ืืืืืื ืื ืืืื ืืชืืกืคืช ืื ืืคืชืงืื ืืกืื testing:
0fa947b allow editing header from the admin pages
f4fa771 added admin panel
4126289 added about page
Notes (testing):
performed 10 tests. All passed
b4a7379 created homepage
Notes (testing):
no tests found
ebddbeb initial commit
Notes (testing):
no tests found
ืืืื ืืืฆืื ืืช ืื ืืคืชืงืื ืืื ืืกืืืื ืื ื ืืืื ืืืฉืชืืฉ ืืืืืืืช:
$ git log --notes="*"1 419
# ืืืื ืืืืชื: ืื ืืืืช ืืคืจืืข ืื ืื ื class ื React
ืืื ืืฆืขืงืืช ืืจืืฉืื ืืช ืฉืื ืื ื ืคืืืฉืื ืืงืื ืกืื ืืฉืืืชืืื ืจืืืงื ื ืืฆืืช ืืฆืขืงื:
Warning: Invalid DOM property `class`. Did you mean `className`?
ืืื ืืืจ ืืื ืฉื ืื ืืืจืืช ืืืืืจื ืืงืื ืขืืืื ืขืืื. ืืืืืจ ืืงืืืคืื ื ืื ืืื:
import "./styles.css";
export default function App() {
return (
<div class="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
ื div ืืืจืืื ืืืื ืืช ืืงืืืก App.
ืื ืื ืืื ืืืช ืืืขืื? ืืกืชืืจ ืฉืืกืืคืืจ ืืื ืืืื ืื ืืืืื ืืื ืืช ืฉื ืจืืืงื ืืื ื ืืกืืื ืืืื ืขืืื ื ืืืชืื ืชืื. ืืฉืืื ืืืชืื ืงืืืคืื ื ืื ืฉืืงืืืช ืืชืืจ prop ืืืคืืื class ืืืื ืืืืืช ืฉืืืื ื ืื ืกืื ืืืชืื ืงืื ืืื:
export default function App(props) {
const { class } = props;
}
ืฉืื ืืื ืขืืื ืืืื ืฉ class ืื ืืืื ืฉืืืจื.
ืืื ืืจืืจ ืฉืืืื ื ืืืืืื ืืืชืื ืืืงืื ืืฉืื ืืื:
export default function App(props) {
const { class: className } = props;
// now I use className inside the component, to handle the "class" from outside
}
ืืื ืืฃ ืืื ืื ืจืืฆื ืืฉื ืืช ืขืืฉืื ืืช ืื ืืงืื ืฉื ืงืืืคืื ื ืืืช ืงืืืืืช.
ืืืื ืื ืืชืืื ืืฉื ื ืืืชืืืื (ืื ืฉืืืจ ืงืืจื ืขืืฉืื) ืืื ืืืืจื? ืืชืฉืืื ืฉืื ืื ืืืชื ืืืืจื ืื ืื ืกืคืจืืืช ืงืืืคืื ื ืืืช ืืืชื ืฆืจืืื ืืชืืื ืืฉื ื ืืืชืืืื ืืื ืฉืื ืืืจืื ืืืชืื ืกืคืจืืืช ืืฉืืชื ืืจืื ืงืื.1 419
# ืืชื ืืืืฉืื ืืืื?
ืื ืื ื ืืืืขืื ืฉืืฉ ืืื ืืืื ืืื ืขืืืื ืขื ืืื ืืืืืื ืืื ืฉื ืืื ืืขืืืื ืื - ืื ืฉื ืงืจื Ramp Up Time. ืื ืืืืืช ืกืืคืฉืืืข ืขื ืื ืื ืจืื ืฉืื ืื ืืกืคืืง, ืืขืืืจ ืจืื ืืื ืฉืื ืคืืืช ืืฉื ื ืฉื ื ืืกืืื ื Rails ืื ืืกืคืืง ืืฉืืื ืืืฉืชืชืฃ ืืคืจืืืงื ืืืื.
ืืื ืืื ืืฉ ืื ืืงืกืืืื ืืื ืขืืืื ืขื ืืื ืืืืืื, ืฉืืืจืื ืืืฉื ืขืืืื ืืืชื ืืื ืืืืื ืืื? ืืื ืืคืฉืจ ืืืืืช ืืกืคืืง ืื ืืกื ื Rails? ืืื ืืฉ ื ืงืืื ืฉืื ืืื ืฉืื ืคืจืืืงื ืฉืืืื ืืืชื ืืฉืื ืืืฉ ืขื ืืืื ืืืืืื?
ืืืขืชื ืืชืฉืืื ืฉืืืืืช. ืขื ืขืืฉืื ืืืื ืืื ืืืืืื ืฉืขืืืชื ืืืชื, ืื ืคืขื ืฉืืืืชื ืืฉืื ืืืฉ ืืื ื ืืกืืื ื ืืกืฃ ืฉืืื ืื ืขื ืืืื ืืืืืื ืจืง ืคืชื ืื ืืืชืืช ืื ืืฉืืื ืืืฉืื ื ืืกืคืื ืฉืฆืจืื ืืืืื. ืื ื ืืฉืืจ ืขื ืืืืืื ืฉื ืจืืืืก ืื ืืื ืคืจืืืงืืื ืฉืืคืฉืจ ืืขืฉืืช ืืืืืื ืืื ืืืจืื ืืืฉืื-
1. ืืืชืื ืืชืจ ืืกืืกื ืขื ืืขืจืืช ื ืืืื
2. ืืืชืื ืจืฉืช ืืืจืชืืช
3. ืืืชืื ืืชืจ ืืื ืืืงืก - ืฉืื ืืื ืืืื ืืืฆืืจ ืชืืื ืืขืฆืื
4. ืืืชืื ืืขืจืืช ืฉื ืื ืืช ืืืืืืืืช
5. ืืืชืื API ืืืชืงืฉืจ ืืืชื ืืชืื ืืคืืืงืฆืืืช Front End
6. ืืืชืื Rails Engine ืืืฉืืชืฃ ืืืกืคืจ ืคืจืืืงืืื
7. ืืืชืื ืืืืคืืฅ Rails Gem
8. ืืฉืืชื ืืช ื Rails Gem ืฉืื ืืฉืืฉ ืื ืืจืื ืืฉืชืืฉืื ืืืชื ืืืื ืฉื API ืืืจ ืื ืืกืคืืง ืืื
9. ืืืชืื ืืขืจืืช Real Time Web ืื ืืืืฉืื ืืฉืชืคืื ืชืืื ืืจืืืื ืชืืื ืฉื ืืืจืื ืืืื ืืืช
10. ืืชืงื ืืขืืืช ืืืืื ืืฉืจืช ืจืืืืก ืฉื ืคืจืฅ
11. ืืืงืื ืืขืจืืช ืืืืงืืช ืืืคืืืงืฆืืืช ืจืืืืก ืืืืื, ืขื ืืืืงื ืืืื ืืกืืื ืืืืืงืืช
12. ืืชืงื ืืขืืืช ืืืฆืืขืื ื Deadlocks ืืืขืจืืช ืืืืื ืขืงื ืขืืืก ืืฉืชืืฉืื
ืืืจืฉืืื ืืืืื ืืืืื ืืืชืืจื ืขืื ืืขืื, ืืืื ืฉื ืืื ืืืชืจ ืกืคืฆืืคืืื ืืื ืชืืื ืืืชืจ ืืจืืื.
ืืขืืื ืืืื ืืืืื ืฉื ืืืื ืืืืื ืืช ืฉืืื ืืจืื, ืืืื ืฉืืืืืื ืืช ืืืืื ืืืชืจ ืืื ืฉืืื ืืืชืจ. ืืชื ืื ืืงืฆื, ืืชื ืืคืืื ืื ืงืจืืืื ืืฉื. ืืืฉื ืืืืื, ืืืฉื ืคืืงืืก ืืืืคืืฉ ืคืจืืืงืืื ืืืฉืื ืืจืื ืืืชืจ ืืืืื ืืื ืืืืชื ืืื ืืืืืื ืืื ืืืจื ืืื ืืืจื ืืืืื ืืืืชืจ ืืืชืงืื ืืืชืื ืชืื.
(ื .ื. ืื ืืฉ ืืื ืืืืืืืช ืืชืืช. ืื ืื ืขืืืจ ืืืืืช ืืืืื ืกืืืืืื ืืืื. ืืื ืื ืืืื ืืืืืืืช ืฉืื ืื ื ืขืืฉืื ืขืืืืื ืขืืืื ืืืืชื. ืืื ืื ืขืืืช 6 ืฉื ืื ืืจืืืงื ืืืช ืืชืืืืช ืื ืืืืฉืื ืืจืืืงื ืื ืืขืืืจ ืืื ืืืืจ, ืืฉืชืื ืืืคืฉ ืคืจืืืงื ืจืืืงื ืืื ืืืชืจ).
1 419
# ืฉืืื ื ืขืฉืจื ืชืจืืืื ืืื ืืื ืืืืื ืืื ืขืืืืื ืขื Remotes
ืื ืืืื ืคืจืกืืชื ืคื ืกืืืจื ืฉื ืฉืืื ื ืขืฉืจื ืชืจืืืื ืืื ืฉืืชืจืืืื ืขืืืื ืขื ืงืืืืืื ืืขื ืคืื ืขื ืืืื ื ืืงืืืืช ืืืืจ ืืืืฉ ืฉืื ื ืืืคืฉ ืืืืื ืืช ืืืชืื ืืช ืืืืง ืืฉื ื ืฉื ืืจืฉืืื - ืชืจืืืื ืืื ืฉืืขืืจื ืื ื ืืืชืืื ืขื ืขืืืื ืขื Git Remote Repositories.
## 18 ืชืจืืืื ืืื ืขื ืขืืืื ืขื ืืืืจืื ืืจืืืงืื
1. ืฆืจื ืืืืจ ืจืืง (Bare Repository) ืืชืืงืื ืืืฉื ืขื ืืืืฉื ืฉืืื
2. ืฆืจื Clone ืฉื ืืืืืจ ืืชืืงืื ืืฉื clone1
3. ืฆืจื ืงืืืฅ ืืืฉ ื clone1, ืืฆืขื ืงืืืื, ืืื ืฉื ื ืืืชื ืืื ืคืขืืื ืืืืฉืืื ืืขืฉืืช ืงืืืืืื. ืืกืืฃ ืืคืขืืื push ืืื ืืืืืฃ ืืช ืื ืืงืืืืืื ืืืืืจ. ืืฆืขื ืืช ืืืชื ืืืจ ื branch ืืืฉ ืืืืคื ืื ืืืชื.
4. ืืืืื ืฉืืชื ืืฆืืืืื ืืจืืืช ืืช ืื ืืงืืืืืื ืืืขื ืฃ ืืืืฉ ืืืืืจ ืืจืืง ืืืงืืจื.
5. ืฆืจื Clone ืืืฉ ืฉื ืืืืืจ ืืชืืงืื ืืฉื clone2. ืขืืฉืื ืืฉ ืื ื ืฉื ื ืืฉืชืืฉืื ืฉืขืืืืื ืขื ืืืืจ ืืฉืืชืฃ. ืืื ืื ืืื ืืืืืื.
6. ืฆืจื ืงืืืื ื clone1, ืืืคื ืืืชื ืืืืืจ ืืืฉืืชืฃ ืืืคืขืืื pull ื clone2.
7. ืฆืจื ืงืืืื ื clone1, ืืืคื ืืืชื ืืื ื clone2 ืืคืขืืื
fetch ืืื merge ืืื ืืช.
8. ืฆืจื ืงืืืื ืืืฉ ื clone1 ืืงืืืื ืืืจ ื clone2. ืืคืขืืื push ื clone1 ื fetch ื clone2, ืืื ืืฉืชืืฉื ื merge ืืื ืืืื ืืช ืืฉืื ืืืื ื clone2. ืืืคื ืืืืืจ ืืช ืืชืืฆืื ืืืฉืื ืืืชื ื clone1.
9. ืฆืจื ืงืืืื ืืืฉ ื clone1 ืืงืืืื ืืืจ ื clone2. ืืคืขืืื push ื clone1 ื fetch ื clone2, ืืื ืืฉืชืืฉื ื rebase ืืื ืืืื ืืช ืืฉืื ืืืื ื clone2. ืืืจื ืฉืืื ืืืงืื ืืคืขืืื push ื pull ืืื ืืกื ืืจื ืืช ืฉื ื ืืขืืชืงืื.
10. ืืืจื ืขื ืกืขืืคืื 8 ื-9, ืืคืขื ืืฉืชืืฉื ื git pull ืื git pull --rebase ืืืชืืื ืืืงืื ื fetch.
11. ืฆืจื ืขื ืฃ ืืืฉ ื clone1, ืฆืจื ืงืืืื ืืขื ืฃ ืื ืืืืคื ืืืืืจ. ืืคืขืืื fetch ื clone2. ืืื ืืชื ืืืืืื ืืจืืืช ืืช ืืขื ืฃ ืืืืฉ?
12. ื clone1 ืชืงื ื ืืช ืืืืขืช ืืงืืืื ืฉื ืืงืืืื ืืืืจืื ืขื git commit --amend. ืืคืขืืื pull ื clone2. ืืื ืืชื ืืืืืื ืืจืืืช ืืช ืืฉืื ืื? ืืื ืืฉืื ื ืฉืืจ?
13. ืขืืฉืื ืืืืข ืืืื ืืฉืืืจ ืืืจืื:
- ืขืืจื ืืขื ืฃ main ืืฉื ื ืืขืืชืงืื
- ื clone1 ืฆืจื ืงืืืื ืืืืคื
- ื clone2 ืืคืขืืื pull, ืฆืจื ืงืืืื ืืืฉ ืืืืคื
- ืขืืฉืื ื clone1 ืชืงื ื ืืช ืืืืขืช ืืงืืืื ืืืืจืื ื ืขื git commit --amend.
- ื clone2 ืืคืขืืื pull
- ืื ืงืจื?
14. ืชืงื ื ืืช ืืงืื ืคืืืงื ืฉื ืืฆืจ, ืืฆืขื ืงืืืื ืืืืคื. ืื ืชืคืขืืื ืขืืืื pull ื clone1. ืืฉื ื ืืืืืจืื ืืคืขืืื git log --oneline --graph. ืื ืืืขืื ืฉืืชื ืืืืื ืืืืกืืืจืื?
15. ืืคืขืืื git pull ื clone1. ืืคืขืืื git log --oneline --graph ืฉืื. ืืืืื ืฉืฉื ื ืืืืืจืื ืืกืื ืืจื ืื ืืฉืืืชื ืืขืื ืืืืกืืืจืื ืืืคืืขื ืขืืฉืื ืืฉื ืืื.
16. ืืืจื ืขื ืชืจืืืืื 13, 14 ื 15 ืื ืืคืขื ืืฉืชืืฉื ื git pull --rebase ืืืงืื ื pull. ืื ืงืจื ืืคืขื?
17. ืืฉืชืืฉื ื git reflog ืืชืืงืืืช clone2 ืืื ืืืฆืื ืืช ืืงืืืื ืฉื ืขืื ืืื ืืจืืืืืก.A
18. ืืฉืชืืฉื ื git cherry-pick ืืื ืืฉืืืจ ืืช ืืงืืืื ืื ืขืื.
## ืืขืจื ืขื ืคืืชืจืื ืืช
ืืคืขื ืืงืืืืช ืฉืคืจืกืืชื ืจืฉืืื ืืืืช ืืจืื ืื ืฉืื ืฉืืื ืขื ืคืืชืจืื ืืช. ืื ื ืื ืืืฉื ืฉืคืืจืกืื ืคืืชืจืื ืืช ืืืกืืฃ ืืคืืกื ืืื ืื ืืืขืื ืืื ืฉืงืืจื ืืืชื.
ืืืจื ืืืชืืืก ืืคืืกื ืืื ืืื ืืงืืช ืืคื ืจืขืืื ืืช ืืืืจืื ืฉืฉืืื ืื ืกืืช ืืื. ืื ืืชื ืื ืืืืขืื ืืื ืืืฉืชืืฉ ืืืืช ืืคืงืืืืช ืืื ืื ืกืืช ืืื ืืช ืืชืจืืื ืื ืฉืืื ืืงืจืื ืขืืื. ืืคืฉืจ ืืจืฆืื ืืืคืฉ ืืืืื. ืืืืจื ืืื ืื "ืืืขืช" ืืช ืื ืืชืฉืืืืช, ืืื ืืืืืช ืืืชืจ ืืื ืขื ืจืฉืืืช ืืชืจืืืืื ืืืืช, ืืืืืช ืืืชืจ ืืื ืืืฉืืง ืขื ืืื ืืืืชืจ ืืื ืืืืคืืฉ ืืงืจืืื ืขื ืืื ืืจืฉืช.1 419
ืืื ืื ืื ืืื - ืืขืืืื ืขื ืจืืืงื ืืฉ ืคืืืืื ืฉื ืงืจื react refresh ืฉืืืืืื ืืืขืื ืืชืื ื HTML. ืืื ืืื ืืขืืื ืืช ื HTML ืื ืืื ืืืื, ืืื ืื ืื ื ืืืืฉืื ืืช ื HTML ืืจื ืจืืืืก ืืืื ืฆืจืื ืืืืกืืฃ ืืช ืืขืืืื ืืื ืืช ืืงืืืฅ ื layout. ืืืจื ืืขืืืื ืืงืืืฅ
app/views/layouts/application.html.erb ื ืจืื ืื:
<!DOCTYPE html>
<html>
<head>
<title>HelloReactWorld1</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>
<script type="module">
import RefreshRuntime from "/vite-dev/@react-refresh"
RefreshRuntime.injectIntoGlobalHook(window)
window.$RefreshReg$ = () => {}
window.$RefreshSig$ = () => (type) => type
window.__vite_plugin_react_preamble_installed__ = true
</script>
<%= vite_client_tag %>
</head>
<body>
<div id="app"></div>
<%= vite_javascript_tag 'application.jsx' %>
</body>
</html>
## ืคืืชืื ืงืื ืฆื ืืงืื
ื ืืฉืื ืืืชืืืช ืงืื ืจืืืงื ืฉืืืจืื ืืืฃ ืืืช, ืืฃ ืืืืืช ืืงืืืฅ ื ืืชืื. ืืฉืืื ืืฃ ืืืืช ืื ื ืืืฆืจ ืชืืงืื ืืืฉื:
$ mkdir app/javascript/routes
ืืืชืืื ืืืฆืจ ืืช ืืงืืืฅ app/javascript/routes/homepage.jsx ืขื ืืชืืื ืืื:
import React, { useState } from 'react';
import { Link } from "react-router-dom";
export default function Homepage() {
const [name, setName] = useState('');
return (
<div>
<label>
Please type your name:
<input type="text" value={name} onChange={(e) => setName(e.currentTarget.value)} />
</label>
{name !== '' && <p>Hello! {name}</p>}
<Link to="/about/index">About Us</Link>
</div>
);
}
ืืืงืืืฅ app/javaascript/entrypoints/application.jsx ืื ื ืืืืง ืืช ืื ืืชืืื ืืืืงืืื ืืืชื ืืช ืืชืืื ืืื:
import React from "react";
import { createRoot } from 'react-dom/client';
import Homepage from "../routes/homepage";
import About from '../routes/about';
import {
BrowserRouter as Router,
Route,
Routes,
} from "react-router-dom";
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Homepage />} />
<Route path="/about/index" element={<About />} />
</Routes>
</Router>
);
}
const root = createRoot(document.querySelector('#app'));
root.render(<App />);
ืืงืืืฅ ืืฉืืืฉื ืฉื ืืืืฉืื ื ืงืจื app/javascript/routes/about.jsx ืืื ืื ื ืืืชื ืืช ืืชืืื ืืื:
import React from 'react';
import { Link } from "react-router-dom";
export default function About() {
return (
<div>
<p>About Us</p>
<Link to="/">Back Home</Link>
</div>
);
}
## ืืจืฆื ืืืืืงื
ืื ืื ื ืืืื ืื ืืฆืืช ืืืจื. ื ืคืขืื ืืืืื ื ืคืจื ืืช ืืคืงืืื:
$ ./bin/vite dev
ืืืืืื ื ืืกืฃ ืืช ืืคืงืืื:
$ ./bin/rails s
ืืขืืฉืื ืืคืฉืจ ืืืืื ืก ืืืคืืคื ื localhost:3000 ืืืจืืืช ืืช ืืฃ ืืจืืืงื ืืจืืฉืื ืฉืืฆืจื ื, ืืืืืฅ ืขื ืืงืืฉืืจ ืืืืืืข ืืืฃ ืืฉื ื.1 419
# ืืืจืื: ืืฆืืจืช ืืคืืืงืฆืืืช React ืืชืื ืฉืจืช Rails 7
ืื ืืจืืืฉ ืืืืื ืจืง ืืชืืื ืคืจืกืืชื ืืื ืืืจืื ืืื ืืขืืื ืขื React ื Rails 6 ืืื ื ืืฆืื ืจืืืืก 7 ืขื ืืืฉื ืืืฉื ืืืืจื ืืขืืืื ืขื JavaScript. ืืคืืกื ืื ื ืจืื ืืช ืื'ื vite-ruby ืฉืืืคืฉืจ ืื ื ืืื ืืช ืืคืืืงืฆืืืช ืจืืืงื ืขื ืจืืืืก 7 ืื ืืื webpacker.
ืืฉืื ืื ืืืืื ืืืจืืื ืฉื Rails 7 ืืืืก ืืขืืืื ืขื JavaScript ืืื ืืืืืื ืืืืชืจ ืขื ืฉืื ื Precompilation. ืืืขื ื ืฉื DHH ืืื ืฉืืืื ืืืืืืืช ืืฉืืืช: ืขื HTTP Push ืืคืฉืจ ืืืืืืฃ ืืช ื Bundling ืืื ืืืื ืืืฆืืขืื, ืืืคืืคื ืื ืืืืขืื ืืืจ ืืืจืืฅ JavaScript ืืจืื ืืืื ืื ืฉืื ืฆืจืื Babel. ื ืืื, ืื ืื ื ืืคืกืืืื ืืช scss ืืื ืืืื ืื ืื ืกืืฃ ืืขืืื.
ืืงืืจืื ืืืืื ืืืืชืจ ืฉื ืืืืืื ืืืืช ืืื ืืืืงื JSX, ืื ืืื pre-compilation ืืื ืื ืฉืืืคืื ืืช ื JSX-ืื ืืงืื JavaScript ืจืืื. ืืคื ื ืืื ืืืื ืืชืืชื ืขื ืกืคืจืืืช htm ืืืื ืืื ืืื ืชืืื ืืืคืชื ืืืืืืจ. ืืืขืื ืฉืืจืืข ืืขืืืื ืขื jspm ืืืืืคื ืืืื ืขื import maps ืื ืืกืคืืง ืืฆืืื - ืืจืื ืืืืืืื ื jspm ืืืืฉืื ืื ื ื ืกื ืืืืจืื ืืืชื ืืืื ื, ืืืืจืื ืืืืฉืื ืืื ืืงืจื. ืื ืืคืฉืจ ืืชืงื ืื ืชืงืื, ืืื ืื ืืชื ืจืืฆืื ืฉืืืืื ืืขืืื ืืฉืืืืื ืืื ืืชื ืืฉืืื ืืืืื ืื ื ืืืืืฅ ืืื ืชืืื ืืืืืช ืขื import maps.
ืืฆื ืฉื ื ืื'ื webpacker ื ืืฆื ืืืฉ ืืกืืฃ ืืจืื ืืืงืฆืืขืืช ืืืื ื ืฆืืจื ืืจื ืืืจืช ืืฉืื ืืื ืงืื ืจืืืืก ืืงืื ืคืจืื ื ืื ื. ืืืจื ืืืืช ืืื ืื'ื vite-rails. ืืชืืื ืืช ืฉืื ื ืืคืืกื:
1. ื ืื ื ืืคืืืงืฆืืืช ืจืืืืก ืืืคืืืงืฆืืืช ืจืืืงื ืฉืืืืืจืช ืืืื ืืืืฆืขืืช ืื'ื vite-rails.
2. ื ืขืืืจ ืืฉืชื ืื ืืจืืืืก ืืจืืืงื ืืืืฆืขืืช ืื'ื gon.
3. ื ืฉืชืืฉ ืืจืืืงื ืจืืืืจ ืืื ืืืขืื ืืช ืืืฃ ืืืชืืื ืืืคืืืงืฆืืืช ืืจืืืงื.
ืืืื ืื? ืืืื ื ืฆื ืืืจื.
## ืืงืืช ืืคืืืงืฆืืืช ืจืืืืก ืืืฉื
ืงืืื ืื ืื ื ืืืืื ืฉืจืืืืก 7 ืืืชืงื ืื ืขื ืืืืฉื ืขื:
$ rails --version
Rails 7.0.3
ืืืฆืจ ืืคืืืงืฆืื ืืืฉื:
$ rails new HelloReactWorld1
ื ืื ืก ืืชืืงืื:
$ cd HelloReactWorld1
ืืืื ืฉืื ื ืฆืจืื ืฉืื ื Controllers ืืืคืืืงืฆืื ืืืืขื ืืจืืืงื, ืื ื ืืขืืืฃ ืืขืืื ืืช ื Layout ืฉืืชืืื ืื ืืจืืืงื ืืื ืืืฉืชืืฉ ืืฉืืืช ื Views ืฉื ืจืืืืก. ืื ื ืืขืืื ืืช ืืงืืืฅ app/views/layouts/application.html.erb ืืืืชื ืื ืืช ืืชืืื ืืื:
<!DOCTYPE html>
<html>
<head>
<title>HelloReactWorld1</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>
</head>
<body>
<div id="app"></div>
</body>
</html>
ืขืืฉืื ืืืืข ืืืื ืืืฆืืจ ืฉื ื ืงืื ืืจืืืจืื ืืฉืืื ืฉื ื ืืคืื ืืืชืจ. ืืฉืืจืช ืืคืงืืื ืื ื ืืจืืฅ:
$ rails g controller home index
$ rails g controller about index
ืื ืขืืื ืืช ืืงืืืฅ config/routes.rb ืืชืืื ืืื:
Rails.application.routes.draw do
root to: 'home#index'
get 'about/index'
end
## ืืืกืคืช ืืคืืืงืฆืืืช ืฆื ืืงืื ืขื vite
ืืฉืืจืช ืืคืงืืื ืืชืงืื ืื ืืช ืื'ื:
$ bundle add vite_rails
ืืืืฆืจืื ืืช ืืกืืืจืืจืื ืขื:
$ bundle exec vite install
ืืขืืฉืื ืฆืจืื ืืืชืงืื ืืช ืืชืืืื ืืจืืืงื. ืืขืืื ืื ืืช ืืงืืืฅ vite.config.ts ืฉื ืืฆืจ ืืชืืงืื ืืจืืฉืืช ืฉื ืืคืจืืืงื ืืชืืื ืืื:
import { defineConfig } from 'vite';
import RubyPlugin from 'vite-plugin-ruby';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [
RubyPlugin(),
react(),
],
})
ืืคืขืืืื ืืฉืืจืช ืืคืงืืื ืืชืืงืื ืืจืืฉืืช ืฉื ืืคืจืืืงื ืืช ืืคืงืืื:
$ npm install --save @vitejs/plugin-react react react-dom react-router-dom@6 react-refresh
ืืื ืื ื ืืืขื ืืืื ืื. ื ืงืืืช ืืื ืืกื ืฉืื ื ืืืขืจืืช ืืื ืืงืืืฅ app/javascript/entrypoints/application.js, ืืื ืื ื ืืืืชื ืืขืืืฃ ืฉืืื ืืืื ืขื ืืกืืืืช jsx ืืื ืฉืืืื ืืืชืื ืื ืงืื jsx. ืืื ื ืฉื ื ืื ืืช ืืฉื ื application.jsx:
$ mv app/javascript/entrypoints/application.js app/javascript/entrypoints/application.jsx
ืืืืงืืื ืืงืืืฅ app/views/layouts/application.html.erb ืื ื ืืืืืฃ ืืช ืืฉืืจื ืฉืืชืืืื ื vite_javascript_tag ืืืืงืืื ืืืชื:
<%= vite_javascript_tag 'application.jsx' %>
ยกYa disponible! Investigaciรณn de Telegram 2025 โ los principales insights del aรฑo 
