DatoCMS рдореЗрдВ Asyntai AI рдЪреИрдЯрдмреЙрдЯ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ
DatoCMS-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛
рд╣реЗрдбрд▓реЗрд╕ CMS: DatoCMS рдПрдХ рд╣реЗрдбрд▓реЗрд╕ CMS рд╣реИ рдЬреЛ APIs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЪреИрдЯрдмреЙрдЯ рдХреЛрдб рдЖрдкрдХреЗ рдлреНрд░рдВрдЯрдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди (Next.js, Gatsby, Nuxt, рдЖрджрд┐) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, DatoCMS рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рдирд╣реАрдВред
рдЪрд░рдг 1: рдЕрдкрдирд╛ рдПрдореНрдмреЗрдб рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдкрдиреЗ Asyntai рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рдиреАрдЪреЗ "Embed Code" рдЕрдиреБрднрд╛рдЧ рддрдХ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВред рдЕрдкрдирд╛ рдпреВрдирд┐рдХ рдПрдореНрдмреЗрдб рдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВ, рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
<script>(function(){var l=function(){var s=document.createElement("script");s.src="https://widget.asyntai.com/static/js/chat-widget.js";s.async=true;s.setAttribute("data-asyntai-id","YOUR_WIDGET_ID");document.head.appendChild(s)};if(document.readyState==="complete"){l()}else{window.addEventListener("load",l)}})();</script>
рдиреЛрдЯ: рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреИрд╢рдмреЛрд░реНрдб рд╕реЗ рдЕрдкрдирд╛ рдЕрджреНрд╡рд┐рддреАрдп рдПрдореНрдмреЗрдб рдХреЛрдб рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЖрдкрдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рдЬреЗрдЯ ID рд╣реЛрддреА рд╣реИред
рдЪрд░рдг 2: Next.js рдлреНрд░рдВрдЯрдПрдВрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп)
Next.js DatoCMS рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдлреНрд░рдВрдЯрдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред Script рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреИрдЯрдмреЙрдЯ рдЬреЛрдбрд╝реЗрдВ:
App Router (app/layout.tsx):
- рдЕрдкрдиреА рд░реВрдЯ рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:
app/layout.tsx - Script рдХрдВрдкреЛрдиреЗрдВрдЯ рдЖрдпрд╛рдд рдХрд░реЗрдВ рдФрд░ рдЪреИрдЯрдмреЙрдЯ рдЬреЛрдбрд╝реЗрдВ:
import Script from 'next/script'
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<Script
src="https://asyntai.com/static/js/chat-widget.js"
data-asyntai-id="YOUR_WIDGET_ID"
strategy="afterInteractive"
/>
</body>
</html>
)
} YOUR_WIDGET_IDрдХреЛ рдЕрдкрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдЬреЗрдЯ ID рд╕реЗ рдмрджрд▓реЗрдВ- рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЕрдкрдирд╛ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕рд░реНрд╡рд░ рдкреБрдирдГ рд╢реБрд░реВ рдХрд░реЗрдВ
Pages Router (pages/_app.tsx):
- рдЕрдкрдиреА
pages/_app.tsxрдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ - Script рдХрдВрдкреЛрдиреЗрдВрдЯ рдЬреЛрдбрд╝реЗрдВ:
import Script from 'next/script'
import type { AppProps } from 'next/app'
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Component {...pageProps} />
<Script
src="https://asyntai.com/static/js/chat-widget.js"
data-asyntai-id="YOUR_WIDGET_ID"
strategy="afterInteractive"
/>
</>
)
}
рд╕реБрдЭрд╛рд╡: strategy="afterInteractive" рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪреИрдЯрдмреЙрдЯ рдкреГрд╖реНрда рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд▓реЛрдб рд╣реЛ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рдмреАрдЪ рдЕрдЪреНрдЫрд╛ рд╕рдВрддреБрд▓рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ 1: Gatsby рдлреНрд░рдВрдЯрдПрдВрдб
gatsby-source-datocms рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ DatoCMS рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реА Gatsby рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП:
- рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ
gatsby-ssr.jsрдмрдирд╛рдПрдБ рдпрд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:import React from 'react'
export const onRenderBody = ({ setPostBodyComponents }) => {
setPostBodyComponents([
<script
key="asyntai-chatbot"
async
src="https://asyntai.com/static/js/chat-widget.js"
data-asyntai-id="YOUR_WIDGET_ID"
/>
])
} YOUR_WIDGET_IDрдХреЛ рдЕрдкрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдЬреЗрдЯ ID рд╕реЗ рдмрджрд▓реЗрдВ- рдЕрдкрдирд╛ Gatsby рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕рд░реНрд╡рд░ рдкреБрдирдГ рд╢реБрд░реВ рдХрд░реЗрдВ
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ 2: Nuxt.js рдлреНрд░рдВрдЯрдПрдВрдб
DatoCMS рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ Nuxt.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП:
- рдЕрдкрдиреА
nuxt.config.tsрдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:export default defineNuxtConfig({
app: {
head: {
script: [
{
src: 'https://asyntai.com/static/js/chat-widget.js',
async: true,
'data-asyntai-id': 'YOUR_WIDGET_ID'
}
]
}
}
}) YOUR_WIDGET_IDрдХреЛ рдЕрдкрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдЬреЗрдЯ ID рд╕реЗ рдмрджрд▓реЗрдВ- рдЕрдкрдирд╛ Nuxt рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕рд░реНрд╡рд░ рдкреБрдирдГ рд╢реБрд░реВ рдХрд░реЗрдВ
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ 3: рд╕рд╛рдорд╛рдиреНрдп HTML / рд╕реНрдЯреИрдЯрд┐рдХ рд╕рд╛рдЗрдЯ
рдпрджрд┐ рдЖрдк рд╕реНрдЯреИрдЯрд┐рдХ HTML рд╕рд╛рдЗрдЯ рдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рд╕рд╛рдЗрдЯ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде DatoCMS рдХреА Content Delivery API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
- рдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ
</body>рдЯреИрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреА HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдореНрдмреЗрдб рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:<script>(function(){var l=function(){var s=document.createElement("script");s.src="https://widget.asyntai.com/static/js/chat-widget.js";s.async=true;s.setAttribute("data-asyntai-id","YOUR_WIDGET_ID");document.head.appendChild(s)};if(document.readyState==="complete"){l()}else{window.addEventListener("load",l)}})();</script> YOUR_WIDGET_IDрдХреЛ рдЕрдкрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдЬреЗрдЯ ID рд╕реЗ рдмрджрд▓реЗрдВ- рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЕрдкрдиреА рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ 4: React (Vite/CRA)
DatoCMS API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХ React рдРрдкреНрд╕ (Create React App, Vite) рдХреЗ рд▓рд┐рдП:
рд╡рд┐рдХрд▓реНрдк A: public/index.html рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
- рдЕрдкрдиреА
public/index.htmlрдлрд╝рд╛рдЗрд▓ (CRA) рдпрд╛index.html(Vite) рдЦреЛрд▓реЗрдВ - рдХреНрд▓реЛрдЬрд┐рдВрдЧ
</body>рдЯреИрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдПрдореНрдмреЗрдб рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:<script>(function(){var l=function(){var s=document.createElement("script");s.src="https://widget.asyntai.com/static/js/chat-widget.js";s.async=true;s.setAttribute("data-asyntai-id","YOUR_WIDGET_ID");document.head.appendChild(s)};if(document.readyState==="complete"){l()}else{window.addEventListener("load",l)}})();</script> - рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ
рд╡рд┐рдХрд▓реНрдк B: рд░реВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ useEffect
- рдПрдХ рдЪреИрдЯрдмреЙрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдмрдирд╛рдПрдБ рдпрд╛ рдЕрдкрдиреЗ рд░реВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
// components/Chatbot.jsx
import { useEffect } from 'react'
export default function Chatbot() {
useEffect(() => {
const script = document.createElement('script')
script.src = 'https://asyntai.com/static/js/chat-widget.js'
script.async = true
script.setAttribute('data-asyntai-id', 'YOUR_WIDGET_ID')
document.body.appendChild(script)
return () => document.body.removeChild(script)
}, [])
return null
} - рдЕрдкрдиреЗ
App.jsxрдпрд╛ рд░реВрдЯ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдХрдВрдкреЛрдиреЗрдВрдЯ рдЖрдпрд╛рдд рдХрд░реЗрдВ рдФрд░ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ
рдЪрд░рдг 3: рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ
рдЕрдкрдиреА DatoCMS-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╕рд╛рдЗрдЯ рдореЗрдВ рдЪреИрдЯрдмреЙрдЯ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ рдпрд╛ рдЕрдкрдирд╛ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕рд░реНрд╡рд░ рдЪрд▓рд╛рдПрдБред рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛ рдПрдХ рдирдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреИрдм рдпрд╛ рдЗрдирдХреЙрдЧреНрдирд┐рдЯреЛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЗрдЦреЗрдВред рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ рдЪреИрдЯ рд╡рд┐рдЬреЗрдЯ рдмрдЯрди рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЦреБрд▓рддрд╛ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдЬреЗрдЯ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛? рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реА рд╣реИред рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдЬрд╛рдБрдЪреЗрдВред рдпрджрд┐ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдЪрд▓рддреА рд╣реИред рдЕрдкрдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдпрд╛ рдЗрдирдХреЙрдЧреНрдирд┐рдЯреЛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░: рдмреЗрд╣рддрд░ рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП, рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреА рд╡рд┐рдЬреЗрдЯ ID рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдЬреИрд╕реЗ, Next.js рдХреЗ рд▓рд┐рдП NEXT_PUBLIC_ASYNTAI_ID рдпрд╛ Vite рдХреЗ рд▓рд┐рдП VITE_ASYNTAI_ID)ред
Weebly