ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 418
Obunachilar
+124 soatlar
-27 kunlar
-530 kunlar
Postlar arxiv
1 418
ืฉืืืช ืืขืื ืืฉืืขืืช?
ืจืืื 3.4 ืืืกืืคื ืชืืืื ืืืืื ืฉืืืจื ืืืฉื - it. ืขืืฉืื ืืคืฉืจ ืืืชืื:
users
.reject(&:admin?)
.flat_map { find_teams(it) }
.uniq
ืืขื ืืื ืืฉืื ืื ืฉืจืง ืืคื ื 5 ืฉื ืื ืืฆืื ืืืจืกื 2.7 ืฉื ืจืืื ืฉืืืกืืคื ืืช ืืชืืืื ื _1, ืืืืชื ืืจืื ืืชืืืืืช ืกืืื ืื ืื ืขื ืื ืืืื ื ืืืชืืื:
users
.reject(&:admin?)
.flat_map { |user| find_teams(users) }
.uniq
ืืืื ื 2019 ืื ืื ื ืืืืืื ืืืชืื:
users
.reject(&:admin?)
.flat_map { find_teams(_1) }
.uniq
ืืคื ืืืงืื ืืืืืจ ืืคืืกืงื ืืจืืฉืื ื ืืืฉืืื - ืื ืืขืฆื ืงืจื ืคื? ืืื ืฆืจืื ืื _1 (ืืืช ืืืืจืื ืฉืื _2 ืืคืจืืืจ ืืฉื ื, _3 ืืฉืืืฉื ืืขื _9) ืืื ืืช it ืฉืืชื ืื ืืืืืง ืืื _1 ืฉืืืจ ืงืืื?
ืืื ืืืื ืืืชืจ ื ืืื ืืืกืชืื ืขื ืืชืืกืคืช ืืืืช ืืื ืขืื ืืืง ืืคืืื ืืชืจืืืชื ืฉื ืจืืื. ืื ืืืง ืืืืืจื ืฉื ืืื ืืืฆืืจ ืฉืคื ืขื ืืจืื ืืืืื, ืืฉืชืืื ืืืื ืฉืืชืืืื ืืื ืืืจ. ืืฉืจืืืื _1 ืืชืื ืืืืง ืืคืฉืจ ืืชืืืช ืืื ืืฉ ืื _2 ืืืื ืืื ืื ืืชืื ืฉื. ืืฉืจืืืื it ืืจืืจ ืฉืืฉ ืจืง ืคืจืืืจ ืืื, ืืขืืืจ ืืืชื ืืงืจืื ืืืืื ืืืืฉื ืฉืืคืจื ืงืฆืช ืืช ืืงืจืืืืช ืฉื ืืงืื. ืืื ืขื "ืฆืจืืื ืืืืืช ืจืง ืืจื ืืืช ืืจืืจื ืืขืฉืืช ืืืจืื?" ื ื, ืื ืืืื ืืฉืคื ืืืจืช.1 418
ืงืืืช ืืืืข ื Streaming ืืื ืืืืงื ืื ืคืฉืืื
ืืืฉืงื Chat ืืืื ืืืืืื ืืืฉืชืืฉ ื Streaming ืื ื AI ืืืงื ืืืื ืืื ืืืืฆืจ ืืช ืืชืฉืืื. ืืฆื ืืืงืื ืืฉืืืช ืืืืข ืืฉืจืช HTTP ื Streaming ืืชืืจืจื ืืืฉืืื ืื ืคืฉืืื ืื ื ืืืืืง ืคื ืืช ืืงืื ืืืืจืื ืืืกืืจ:
export default async function* sendQuestion(questionText: string) {
const res = await fetch('http://localhost:11434/api/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'llama3.2',
prompt: questionText,
stream: true,
}),
})
if (!res.ok) throw new Error('Failed to connect to Ollama server')
const reader = res.body?.getReader()
if (!reader) throw new Error('Failed to initialize stream reader')
while (true) {
const { done, value } = await reader.read()
if (done) break
// Decode the stream data
const chunk = new TextDecoder().decode(value)
const json = JSON.parse(chunk)
yield json
}
}
ืืงืื ืคืื ื ืืฉืจืช ืฉื Ollama ืฉืจืฅ ืืฆืื ืืงืืืืช ืขื ืืืืฉื ืืฉืืื ืื ืฉืืื. ืืคืจืืืจ stream ืืงืื ืขืจื ืืืช ืืื ืื ืื ืืืจืื ืื ืื ืืจืืจืช ืืืืื ืฉื ืคืจืืืจ ืื. ืื ืืชืฉืืื ืืืชื ืืืืขื ืืชืืจ ืืืืืงื ืืื ืืืืชื ืืคืขืื ืืช res.json() ืื res.text() ืืื ืืงืื ืืืชื, ืืื ืืืื ืฉืืชืฉืืื ืืืืขื ืืชืืจ ืืจื ืฉื ืืืืืงืืื ืื ื ืงืืจื ื getReader ืขื ื body, ืืื ืืงืื ืืืฉืง ืงืจืืื. ื body ืืื ืืขืฆื ReadableStream ืืืคืฉืจ ืืงืจืื ืขืืื ืืืจืืื ืืืฃ ืืชืืขืื:
https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader
ืืืจื ืฉืืงืืชื ืืช ื Reader ืืชืืื ืืืืง ืืืขืืืฃ - ืขืืื ื ืืงืจืื ืื Reader ืืช ืืืืืข ืืืง ืืืจื ืืืง ืืืคืขื ื ืื ืคืขื ืืช ืืืืง ืืื ืืชืืจ ืืืืืงื JSON. ืืงืื ืืื ืื ื ืื ืื ืฉืื Chunk ืืืื ืืืืืงื JSON ืฉืื, ืืืจืืช ืฉืืขืืื ืืืืืชื ืืืชืื ืืืืืจืฉ ืืืคืื ืืืชืจ ืคืจืื ื ืืฉืคืืขื ืื ืฉื Chunk ื ืืฉื ืื ืืืื ืื ืืืง ืฉืืืืืง ืจืง ืืืง ืืืืืืงื ื JSON ืืืืืฉื ืฉืื ืืื ื Chunk ืืื. ืฉืืื ืื ืืฉืืืืฉ ื TextDecoder ืฉืืื ืข ืืขืื ืืืื ืขืืืจ ืคืืขื ืื ืืืงืกื, ืืืืืจ ื decode ืฉื TextDecoderืืืืข ืืืชืื ืืช ืืืืืื ืืขืืืคืื ืื ืืฉ ืืืืืืืง ืืืชื ืืืชืืื ืฉื ื Chunk ืืื ืืื ืฉืืืื ืืืคืื ืืืืื ืืืงืกื.
ืืคืื ืงืฆืื ืืืื ืืื Generator ืืืคืฉืจ ืืืฉืชืืฉ ืื ืืืฉื ืืชืื ืงืืืคืื ื ืืช vue ืืืืคื ืืื:
<script setup lang="ts">
import { ref } from 'vue'
import streamChatResponse from '../streamChatResponse';
const question = ref('')
const response = ref('')
const isLoading = ref(false)
const error = ref<string | null>(null)
async function sendQuestion() {
for await (const chunk of streamChatResponse(question.value)) {
response.value += chunk.response;
}
question.value = '';
}
</script>
<template>
<div class="chat-container">
<form @submit.prevent="sendQuestion" class="question-form">
<textarea
v-model="question"
placeholder="Ask a question..."
:disabled="isLoading"
class="question-input"
/>
<button
type="submit"
:disabled="isLoading || !question.trim()"
class="submit-button"
>
{{ isLoading ? 'Thinking...' : 'Send' }}
</button>
</form>
<div v-if="error" class="error-message">
{{ error }}
</div>
<div v-if="response" class="response-container">
<div class="response-text">{{ response }}</div>
</div>
</div>
</template>
<style scoped>
.chat-container {
max-width: 800px;
margin: 0 auto;
padding: 1rem;
}
.question-form {
display: flex;
gap: 1rem;
margin-bottom: 1rem;
}
.question-input {
flex: 1;
min-height: 80px;
padding: 0.5rem;
border: 1px solid #ccc;
border-radius: 4px;
resize: vertical;
}
.submit-button {
padding: 0.5rem 1rem;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.submit-button:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
.error-message {
color: #dc3545;
margin-bottom: 1rem;
}
.response-container {
padding: 1rem;
background-color: #f8f9fa;
border-radius: 4px;
}
.response-text {1 418
ืืืื ืืื ืืื
ืืฉืืื ืืืชืื ืืืฉืื ืจืืืงื ืืืื ืืื ืืืืื ืืืืฆืืื ืืืชืืืื ืขื ืืจืืฉืืช ืืืฉืืช ืฉืืืืขืืช ืืืืจื ืืื ืืืื ืฆืจืื ืืืืื ืื ืื State Management, ืฆืจืื ืืืืืื ืื ืจืืฆืื ืืืฉืชืืฉ ื Context ืืื ืืฉืืืจ ืกืืืื, ืื ืืกืชืคืงืื ืืกืคืจืืืช ื ืืืื ืกืืืื ืงืื ื ืืื Valtio ืื ืฉืืืืืื ืขื ืื ืืงืืคื ืืืฉืืืื ืจืืืืงืก. ืืื ืืชืืืืช ืืืจื ืื ืืฉืืืืฉืื ืงืื ืืืืื ืืืื ืืืืืื ืืืื ืืืืื.
ืืืื ืืฉืืื - ืขื ืืื ืฆืจืื ืืืชืืืฅ ืืืืื ืืื ืจืืืืงืก ืขืืื ืืฉืื ืื ื ืจืง ืืืืืื ืจืืืงื? ืขื ืืื ืืฉืื ืืืืื ืืื GraphQL ืขืืื ืืฉืื ืื ื ืจืง ืืชืืืืื ืืืืื ืขื ืคืืชืื ืงืื ืฆื ืฉืจืช? ืขื ืืื ืืฉืื "ืืืชืจืื" ืืฉืืืช ืขืืืื ืืกืืืืช ืจืง ืืืื ืฉืืื Best Practice ืืชืขืืืจ ืื ื ืืขืชืื?
ืืืื ืืชืงืืืื ืื ืืืืืืช ืื ืฉื ืืืจืื ืืื ืฉื ืชืืืืืื. ืชืืืืืื ืจืืฆืื ืืืืื ืขืืืื ืื ืื ืื ืฉื ืืฆื ืืฉืืืืฉ ืืชืขืฉืืื ืืื ืื ื ืจืืฆืื ืืืขืช ืืขืืื ืืื ืฉืืืื ืขืืืืื. ืืืจืื ืจืืฆืื ืืืื ืืืชื ืื ืืฉืื ืื ื ืืืืืื ืืืื ืืกืืืืื ืืงืืจืก ื ืจืื ืืืชืจ ืงืฉื ืืชืืืืืื ืืจืืืฉืื ืฉืื ืืฆืืืื ืืืชืจ, ืื ืฉืื ืืื ืืฆืืืืื ืืืืื ืืช ืืืื ืืื ืืงืืจืก. ืืื ืืืืช ืืื ืฉืจืืื ื ื ืจืืืื ืื ื ืืืชืจ ืขื ืืืืื ืืืชืงืืืื ืืฉืืื ืืืืืื ืืจืืฉืื ืื ืื ืชืืงื ืืืกืืืืช. ืืืชื ืืืจืื ืฉืืฉืืืืืื ืืืชื ืื ืื ื ืจืืื ืืกืืืืื ืืื ืืืจื ืืกืคืืง ืชืจืืื ืืขืืืื ืืืชื ืืชืืืืื ืืืืืข ืืืขืืืช ืฉืขืืืจื ืคืืชืื ืืืืื ืืืชืงืืืื.
ืืืื ืืื ืืื ืืื ืืื ืฉืคืืชืจ ืืขืื ืฉืขืืฉืื ืืฉ ืื.
1 418
ืืืืืช ืงืื: ืืืืื ืงืื ืืฉืจืช ืขื yup
ืืคื ื ืืื ืืืื ืืจืืืชื ืืื ืืื ืืืืืง ืงืื ืืืืคืก ืฆื ืืงืื ืขื yup. ืจืืื ื ืฉ yup ืืืืข ืขื ืืืื ืืืืืืช ืืื ืืืืืืจ ืฉืื ืืืืฉืง ืืืจืฉ ืขืืืื ืืืจืื ืืืงืจืื ืืคืฉืจ ืืงืื ืชืืฆืื ืืืื ืืืชืจ ืืจื ืืืืื ืืืืื ืื ื HTML. ืืฆื ืฉื ื ืืขืืืืช ืฆื ืฉืจืช ืื ืื ื ืืืืื ืืื yup ืืขืื ืืื ืืืื ื ืืืกืื ืืจืื ื ืฉืื ื ืจืื ืืืื ืืืืื ื, ืื ืืืืื ืื ื APIs ื node ืื ืืกืื ืืจืื ืืื. ืฉืืื ืื ืืงืื ืืื ืืฆื ืฉืจืช ืขืืืจ REST API ืขื Hono:
app.post('/signup', async (c) => {
const body = await c.req.parseBody()
try {
await signupUserSchema.validate(body);
// create the user and redirect
return c.json({ ok: true });
} catch (err) {
throw new HTTPException(401, {message: String(err)})
}
});
ืืงืื ืืืงื ื ืชืื ืื ืฉืืืืขื ืืืงืฉืช POST ืืืืคืก ืืืืืื ืฉืื ืชืงืื ืื ืชืื ืฉืืืืฉ ืืกืืืื ืฉื yup. ืืืื ื ืืื ืืื ืื ืืื ืืคืจืื ืืื "ืื ืฉืฆืจืื ืืขืฉืืช" ื"ืืื ืฆืจืื ืืขืฉืืช ืืช ืื", ืืืืืจ ืืจืืจ ืืฉืืกืชืืืื ืขื ืืงืื ืฉืืฉ ืคื ืืืืืืฆืื, ืืจืืจ ืื ืงืืจื ืื ืืืืืืืฆืื ืืฆืืืื ืื ืื ืืื ื ืืฉืืช, ืืื ืืืืืืืฆืื ืขืฆืื ืืืืกืกืช ืขื ืกืืืื ืฉืืืืืจืช ืืืงืื ืืืจ. ืื ืืขืชืื ื ืจืฆื ืืฉื ืืช ืฉืืืช ืืืืคืก ืื ืืช ืืืงื ืืืืืืืฆืื ืฉืืื ืื ื ืฆืืจื ืืืขืช ืืงืื ืฉื ื Endpoint.
ืืจืง ืืฉืืื ืืืฉืืื ืืช ืืชืืื ื ืื ืงืื ืืกืืืื ืืชืื ืืงืืืฅ signupUserSchema:
import {object, string} from 'yup';
export default object().shape({
email: string().required().email(),
password: string().required().min(3),
});
ืืงืื ืืืืคืก:
<!DOCTYPE html>
<html>
<body>
<h1>Sign Up</h1>
<form action="/signup" method="post">
<label>
Email
<input type="email" name="email" required />
</label>
<label>
Password
<input type="password" name="password" required minlength="3" />
</label>
<input type="submit" />
</form>
</body>
</html>1 418
"ืจืง" ืขืื render ืืื
ืืืขืื ืืื ืื ื"ืจืง" ืขืื render ืืื ืฉืืงืืืคืื ื ืื ืฉืื ืืืกืืคื ืืืขืจืืช ืืืื ืฉืืืืฉ ืื ื ืืื ื useEffect.
ืืืขืื ืืื ืืืืช ื render-ืื ืฉืืชืืืกืคื ืืืจืืข ืืฉื ืื ืืงืจืืืืช ืืฉืื ืฉืื ืืขืชืืงื ืืช ืืงืื ืืื ืืขืื ืืงืืืืช ืืืฉืชืืฉื ืืงืืืคืื ื ืื ืืืจืืื ืื ืฆืคืืืืช.
ืืฉ ืจืง ืฉืชื ืืจืืื ืืืื ืงืืืื ืืืฉืืืจ ืขื ืืืืจืืช ืืืืจื ืืื:
1. ืืคืฉืจ ืืืชืื ืชืืื ืืช ืืงืื ืืื ื ืืื (ืงืฉื ืืืื).
2. ืืคืฉืจ ืืืชืื ืงืื ืขืืื ืืคืขื ืืืื ืืืื ืื ืงืืช ืืืชื (ืื ืงืฉื ืืืื).
ืืื ืืจืืจ ืื ืฉืืื ืืจื ืงืื ืืืื ืงืืืื ืืืืืจืืช ืืืืจื ืืื. ืืืืื ืื ืื ืกืคืจ ืืืืื ืืจืืื ื ืืืจ ืืกืคืืง ืืขืจืืืช ืฉืืืื ืงืฉื ืืื ืืืฆืื. ืืืื ืืืช, ื ืกื ืืืืืจ ืืช ืื ืืคืขื ืืืื ืฉืืชื ืืืฉืืื "ืืฃ ืืื ืื ืืฉืื ืื ืื ืืืกืืฃ ืจืง ืขืื render ืืื".
1 418
ืืื ืืืื ืืื ืืช
ืืชืื ืชืื ืื ืืกืื ืืืืขืื ืืืชืจ ืืื ืืจืืืช ืืขืืืช ืืจืืฉ ืืืืืืช ืืืคื ืืืจืื ืืืื ืืืฉืืจื. ืืฉืื ืื ื ืืืืืกืื ืืชืื ืชืื ืื ืืกืื ื ืืื ืืืฉืชืืฉ ืืืืืื ืืช ืืืช ืืจืืืื ืืช ืขืืืื ืืื ืื ืืงืื ืฉืืื ืืืชืจ ืืขื ืืื ืช ืืื ืืกื ื ืืื ืืืชืจ ืื ืฉืื ืฉืืืืช ืขืืื ืขื ืืื ืืืืืื ืืกืืืืช ืืืืื ืืืขืืืืช ืฉืขืฉื. ืื ื ืืื ืืืืืืืช ืืกืื ืืฉืืืืช ืฉืฉืืื ืืืคืฉ:
1. ืืฉ ืื ืฉืจืช REST API ืืืื ื Endpoints ืฉืื. ืื ืืืืืืช ืืืืืช ืืืขืืืช ืืืืฉืง ืฉืืืจืชื? ืืืื ืืจืืฉื ืื ืืจืืฉืืช ืืงืื ืืืื ืื ืงืฉื ืืืืฉ?
2. ื ืชืื ื ืกืคืจืืืช ืจืืืงื ืืื ื API ืฉืื. ืืืืื ืกืืื ืืขืจืืืช ืืืื ืงื ืืฉืื ืืืชื? ืืืืคื ืืืื ืงืฉื?
3. ื ืชืื ืืื ื ืืืืืืืช ืืืกืืก ืื ืชืื ืื. ืืื ืืืื ืืฉืื ืื ืืฉืืืฆืจืื ืืช ืืกืืก ืื ืชืื ืื? ืืืื ืคืืฆ'ืจืื ืืืื ืงื ืื ืงืฉื ืืืืฉ ืขื ืืืืืืช ืืื? ืืืื ืคืืฆ'ืจ ืขืืื ืืืืื ืืืชื ื Data Migration ืืฉืืขืืชื?
4. ื ืชืื ืงืื ืฉืขืืฉื X. ืืืื ืืจืืฉื ืืืฉื ืืืืื ืืืืืข ืืืืงืื ืฉืชืฉืืืจ ืืช ืืงืื ืืื? ืขื ืืืื ืืจืืฉืืช ืืงืื ืืืื ืืืื ืงื ืืืชืืืื ืืขืืจืช ืืงืื ืืงืืื?
5. ื ืชืื ืื ืฉืืืฉื ืืืืืฉืื ืืคืื ืงืฆืื X, ืืืื ืืืืืจืื ืืช ืืืชื ืชืืฆืื. ืื ืืืชืจืื ืืช ืืืืกืจืื ืืช ืฉื ืื ืืืืืฉ?
ืืืฉืืชืฃ ืืืืื: ืืืงืื ืืฉืืื "ืืื ืขืืฉืื X" ืื ืื ื ืขืืืจืื ืืฉืืื "ืืื ืืืื ืืขืฉืืช X".
1 418
ืืืืืืฆืืืช ืงืืืื ืืฆื ืืงืื ืื ืชืืื ืืื ืจืืฉ ืืื ืื ืจืง ื ืืื ืืืชืจ ืืขืืืฃ ืืฉืฆืจืื ืืืืจ ืืื ืืืืืืืฆืื ืืกืคืจืืืช SPA. ืกืคืจืืืช ืงืื ืืืืคืื ืืืืืืื ืืืืจืื ืืืื ืงืืืืืช ืืื ืืืืช ืฉืืื ืงืื ืชืืื ืขืืืฃ ืขื ืงืื ืฉืืืืื ืืชืื ืกืคืจืืื. ืฉืืืืฉ ืืคืงืืืืช ืืืืื ืืช ื HTML ืืืกื ืืืื ืืื ืขืืืคืื ื DOM ืืืืกื ืืฉืชื ืื ืจืืืงืืืืืื ืืื ืื ืขืืืืช JavaScript.
ืืื ืืชืื? ืืื ืืชื ืืืืืื ืื ืื ืืช ืืืคืกืื ืฉืืื? ืื ืชืชืืืืฉื ืืฉืชืฃ ืืชืืืืืช ืื ืืืืืจื.
1 418
ืืืืืช ืงืื: ืืืืงืช ืืืคืก ืขื yup ื vue
ืืืจื ืืื ืงืื ืืืื ืืขืืื ืขื ืืคืกืื ืืื ืืืื ืขืืืื ืืกืคืจืืืช ื SPA ืฉืื ื, ืืืืฉืชืืฉ ืืืืคืืื ื ื HTML ื ValidityState ืฉื ืจืืืื ืืงืื ืืื ืืืฆืื ืืืืขืืช ืืืฉืชืืฉืื. ืืขืืืื ืืคืขืืื ืื ืื ื ืฆืจืืืื ืืืืงืืช ืืืชืจ ืืกืืืืืช ืื ืฉืจืืฆืื ืืืจืืฅ ืชืืืื ืืืชืจ ืืกืืืจ ืกืืื ืื ืืฉื ืฉื ืืืืงืืช ืงืื ืืฆื ืืงืื. ืืืฆืืื ืืืื ื ืืื ืืืฉืชืืฉ ืืกืคืจืื ืืื yup ืืื ืืชืืจ ืืช ืืืืคืก ืืืงืื ืืขืืื ืืช ืืืืขืืช ืืฉืืืื ืืชืื ืืคืืืงืฆืืืช vue ืื ืจืืืงื. ืืืื ื ืจืื ืืื ืื ืขืืื.
ืกืืืืช yup
ืกืคืจืืืช yup ืืื ืกืคืจืืืช ืืืืืืฆืื ืืืืืข ืฉืืืคืฉืจืช ืืืจืืฅ ืืืืงืืช ืืืืฆืข ืืืจืืช ืขื ืงืื ืฉืงืืืื. ืืฉ ืื ืืืื ืืืคืฆืืืช ืืื ืืืืืืจ ืืช ืืงืื ืืื ืื ื ื ืืงื ืืื ืืืืื ืคืฉืืื ืขืืืจ ืืืคืก ืจืืฉืื ืฉืืงืื ืืชืืืช ืืืืืื ืืกืืกืื, ืฉื ืืื ืืืจืืืื ืืืืจื ืืกืืกืื ืฆืจืื ืืืืืช ืืคืืืช 8 ืชืืืื. ืื ืืงืื ืืื ืืืฆืืจ ืืช ืืกืืืื ืขื yup:
import {object, string} from 'yup';
export const signupFormSchema = object({
email: string()
.email()
.required(),
password: string()
.min(8, 'password must be at least 8 characters long')
.required(),
});
ืกืืืื ืฉื yup ืืืืขืช ืืงืื ืืืืืงื ืืืืืื ืื ืืื ืืชืืื ืื ืื ืืขืืจืช ืคืื ืงืฆืื ืืกืื ืืจืื ืืช ืืฉื validate. ืืืืืื ืืงืื ืืื:
try {
await signupFormSchema.validate({email: 'ynon@demo.com', password: '12345678'});
console.log('OK');
} catch (err) {
console.log(err);
}
ืืืคืืก ืืช ืืืืืขื OK, ืืื ืืงืื ืืื ืืืคืืก ืืืืขืช ืฉืืืื ืื ืืกืืกืื ืงืฆืจื ืืื:
try {
await signupFormSchema.validate({email: 'ynon@demo.com', password: '123'});
console.log('OK');
} catch (err) {
console.log(err);
}
ืืืืืจ ืืกืืืื ืืืืคืก
ืืืืืจ ืืกืืืื ืืืืคืก ืืื ืืกืืื ืฉืื ื ืืขืืืฃ ืืืขื ืชืืื ืืืฉืชืืฉ ืืคืงืืืืช ืืืืื ืืช ื HTML ืขื ืคื ื ืงืื, ืืืืืื ืืขืืืื ืขื ืกืคืจืืืช SPA. ืืื ืืืืจืื ืฉืืืืชื ืฆืจืื ืืขืฉืืช ื vue ืืฉืืื ืืืืืืจ (ืืื ืื ื ืืืืข ืฉืืฉ ืกืคืจืืืช ืฉืืขืฉื ืืช ืืืืืืจ ืืื ืืฉืืืื. ืืืืืื ืงืื ืืชืื ืกืคืจืื ืื ืืขืืื ืืืชื):
1. ืืืืจืชื ืืฉืชื ื ืจืืืงืืืื ืฉืืฉืืืจ ืืช ืืฉืืืืืช.
2. ืืืืจืชื ืืฉืชื ื ืจืืืงืืืื ื ืืกืฃ ืฉืืฉืืืจ ืืช ืืฆื ืืืืฉื ืฉื ืืืืคืก (ืื ืืืจ ืืืฉืชื ืืืชื ืื ืื).
3. ืืืืจืชื ืคืื ืงืฆืื ืืืคื ืืืืจืืข submit ืฉื ืืืืคืก ืืืืฆืข ืืืืืืฆืื ืขื ืืืืืข ืฉืืืืคืก.
4. ืืืกืคืชื ืืืื ืื HTML ืืืฆืืช ืืืืขืืช ืืฉืืืื.
ืกื ืืื ืงืื ืืืืคืก ื vue ืืื:
<script setup lang="ts">
import {signupFormSchema} from '../schemas/signup1';
import { ValidationError } from 'yup';
import {computed, ref, Ref} from 'vue';
const errors = ref<Array<ValidationError>>([]);
const status = ref<'pending'|'submitted'>('pending');
const errorsObject: Ref<Record<string, Array<ValidationError>>> = computed(() =>
Object.groupBy(errors.value, e => e.path))
async function signup(ev: Event) {
const form = ev.target as HTMLFormElement;
const fd = new FormData(form);
const data = Object.fromEntries(fd);
try {
await signupFormSchema.validate(data, {abortEarly: false})
errors.value = [];
status.value = 'submitted';
} catch (err) {
if (err instanceof ValidationError) {
errors.value = err.inner;
console.log(err.inner);
} else {
throw err
}
}
}
</script>
<template>
<div v-if="status == 'submitted'">
Ready!
</div>
<form @submit.prevent="signup">
<div class="errors" v-if="errors.length > 0">
<h3>Form Erorrs:</h3>
<ul >
<li
v-for="(error, index) in errors"
:key="index"
>
{{ error.message }}
</li>
</ul>
</div>
<div>
<label>
<span>Email: </span>
<input name="email" type="email" />
</label>
</div>
<div>
<label>
<span>
Password:
</span>
<input name="password" type="password" />
</label>
</div>
<div>
<input type="submit" value="Signup" :disabled="status === 'submitted'" />
</div>
</form>
</template>
<style scoped>
label > span {
width: 100px;
display: inline-block;
}
form > div {
text-align: left;
margin: 10px;
}
.errors {
text-align: left;
list-style: none;
padding-left: 10px;
}
</style>
ืืกืงื ืืช1 418
ืืื ืื ืื ืืชื ื ืืคืืืงืก
ืืฉืืืืฉ ื ืื ืก ืืืืื ืืืชืจ, ืืื ืืื ืืืคืืคื ืฉืื ืฆืจืื ืืขืืื ืืืืจืืฅ JavaScript ืืคื ื ืฉืืื ืืืื ืืืฉืชืืฉ ืืืชืจ? ืืกืชืืจ ืฉืืืืืฆืข ืืชืฉืืื ืชืืืื ืืจืื ืืืชืจ ืืืื ืืืืืื ืืืชื ืืืจืชื ืืื ืืช ืืช ืืืชืจ ืืืฉืจ ืืคืืฆ'ืจืื ืฉื ืืืชืจ ืขืฆืื. ืืืืชื ื Page Speed ืืืืืง 9 ืืชืจื ืจืืืงื ื next.js ืืื ืืืคืชืขืชื ืืืชืืฆืืืช:
1. ืืฉืืื ืืงืจืื ืืืืจ ืืืืชืจ ืฉื vercel ืฆืจืื ืืืจืืฅ JavaScript ืืืฉื 2.5 ืฉื ืืืช.
2. ืืฃ ืืืืช ืฉื nike ืืขืกืืง ืืช ืืืคืืคื ืืืฉื 8.1 ืฉื ืืืช ืจืง ืืืจืฆืช ืืงืื.
3. ืืฃ ืืืืช ืฉื solana ืขื ืืกืืืื Poweful for developers, Fast for everyone ืืืื "ืจืง" 1.6 ืฉื ืืืช ืืืจืฆืช ืงืื.
4. ืืคื ื ืฉืืืืจืื ืืจืืื ื wegmans ืืืคืืคื ืฆืจืื ืืืืืช 10 ืฉื ืืืช ืืืจืฆืช ื JavaScript ืฉืืื.
5. ืืคื ื ืฉืืืืจืื ืงืืจืก ืืืงืืืื ืฉื ืงืื ืฆืจืื ืืืืืช 2.9 ืฉื ืืืช ืืื ืืืจืืฅ ืืช ื JavaScript ืืฆืื ืืขืืื.
6. ืืคื ื ืฉืืคืฉืจ ืืงืจืื ืขืืืื ืื ืืจืืื ื ืงืืืฉ 2.3 ืฉื ืืืช ืืืจืฆืช JavaScript.
7. ืืงืืจืกืจื ื ืืื 3.8 ืฉื ืืืช ืืืจืฆืช ื JavaScript ืืคื ื ืฉื ืืื ืืืืื ืก ืืงืืจืกืื.
8. ืืืืื ืืืคื ืืืชืจ ืืืืื ืขื 3.1 ืฉื ืืืช ืืื ืจืืฆื ืฉื JavaScript ืืื ืืกื ืืขืืื.
ืฆืจืื ืืืืื - ืืฉืชืืฉืื ืื ืจืืฆืื ืืืืืช ืืื ืืืืชื ื ื JavaScript ืฉืืจืืฅ. ืื ืืคืฉืจ ืืื ืืื ืืช ืืช ืืืชืจ ืืฆืืจื ืฉืชืชื ืืช ืืืชื ืคืื ืงืฆืืื ืืืืืช ืืื ืืื 10 ืฉื ืืืช ืฉื ืืื ืจืืฆื ืฉื JavaScript ืืืื ืืื ืฉืืืื ืืืชืจ. ืื ืฉืืฉืืชืฃ ืืื ืืืชืจืื ืืจืฉืืื ืืื ืืืืืจื ื React, ืืืงื ืืฉืืจืืช ืืืืงื ืื ืขื next.js. ืื ืืืื ืืขื ืืื ืืืืืง ืื ืคืจืืืืืืจืงืื ืืืจืื ืืื ืื ืืืช ืื ืงืืื ืืื. ืืืื ื ืกืชืื ืขื ืขืื ืฉื ื ืืชืจืื ืืขื ืืื ืื:
ืืจืืฉืื ืืื ืืืชืจ ืืื, ืืืงืื. ืืืืงืื ืืื ืืกื ืืืฃ ืืืืช ืืืคืืคื ืืืื 0.8 ืฉื ืืืช ืืืจืฆืช JavaScript. ืื ืืืชืจ ืืื ืืื ืืชืจื ืืจืืืงื ืฉืืจืฉืืื (ืืื ืื ืืืช ืืกืืืืช ืืืืื ื ืคืจืืชื ืืจืืืงื ืืืจ ืืคื ื ืืื ืฉื ืื). ืื ื ืื ื ืืคืืืงืก ืืืื ืื ืืช ืืช ืืจืฆืื ืื ืืืฉืืืื ืืืืืื ืืคืจืืืืืืจืง ืืื ืฉืืคืื ืืืืขื ื ืืืจ.
ืืชืจ ืฉื ื ืืื ื ืืคืืืงืก, ืืืืขืชื ืฉืืื ืืืื. ื ืืคืืืงืก ืืืืขืื ืื ืื ืขืืฉืื ืืืืื ืื ืืืฉืงืืข ืืชืืืืื ืคืืชืื, ืืืคืืืืืืฆืืืช ืืื ืื. ืขืืื ื jobs ืฉืืื ืืืชืืืช
jobs.netflix.com ืืฉืชืืฉ ืืจืืืงื ืืฆืืจื ืืืื ืืคืงืืืืืช ืืืืื ืจืง 0.6 ืฉื ืืืช ืืืจืฆืช JavaScript ืืฉืืืฃ ื ืืขื. ืืืฃ ืื ืืชืจ ืืชืืขืื ืฉื ืจืืืงื ืืืื ืืขืื ืืืืืข ืืชืืฆืืืช ืืืืืช ืืืฃ ืืืืืช ืืืชืจ.
ืืกืืคืืจ ืขื ืืคืจืืืืืืจืง ืืื ืื ืฉืื ืืฃ ืจืืืงื ืื next ืืืื ืืืืืขื ืืื ืื ืืืืืช ืืืื ืืื ืืืจืฆืช JavaScript. ืื ืืชื ืืืืขืื ืื ืืชื ืขืืฉืื ืืืืื ืื ืืืชืืืืก ืืืขืืืช ืืืฆืืขืื ืืื ืืื ืืื ืืืจ ืืคืฉืจ ืืงืื ืืื ื ืืขืื ื ืืืืื ืืืจืืช ืจืืืงื. ืืืืช ืืืคืชื ืืื "ืืืจืืช".1 418
ื fix ืืฉื ื ืืืืชืจ
ืืืื ืืืื ื ืืืืื ืืกืืืจ ืืช ืืกืืืจื-ืืค ืฉืื ืืคืจืกื ืืช ืื ืืงืื ืฉืื ืืชืื ืืืืืืื ืืื ืฉืืืจืื ืื ืืืื ืืคื. ืื ื ืืืื ืืืื ืืืืื ืืืืช ืื ืื ืืืคืฉืจ ืืฆืฆื ืืคืืชืื ืฉื ืืขืจืืช ืืืืชืืช, ืืืฆืื ืืืืชืืื ืืงืื ืืืืชื ืฉื ืืชื.
ืืฉืื ื ืืชืืื ืืืกืชืื ืขื ืงืื ืืื ืืืกืืื ืืจืืฉืื ืื ืฉืื ื ืคืืชื ืืื ืืกืืืืจืืืช ืืงืืืืืื. ืืืืจื ืืื ืืืืื ืงืฆืช ืืช ืืืืฉืื ืฉื ืื ืฉืืืชื ืืช ืืงืื, ืืคื ื ืฉืื ื ืฆืืื ืืืขืืืช ืขืฆืื ืืืคืืชืจืื ืืช ืฉื ืืืจื. ืืจืืคื ืฉื konfig, ืืกืืืจื-ืืค ืฉื ืืืชื ืืืื, ืชืืคืขื ืืืช ืืืื ืืืื ืืืกื ืืงืืืืืื. ืื ื ืืื ืืืืืืืช:
f1ed4259c fix
75e825f62 fix
c388772ec remove unnecessary env group
1cc57ce33 fix sizing of logo
d26a25c47 fix sizing
f510e4f5d update
89007aad9 update
0d9701a14 updates to workflow
ืืจืื ืืืงืืืืืื, ืื ืืืชืจ ื ืืื ืืืืขืืช ืืงืืืื, ืืืคืืขืืช ืฉืื ืืฉืื. ืืืืืื ืืจืืฉืื ื ืื ื ืืืืืื ืฉืืืจื ืฉืืื ืืืจืื ืืช ื env group ืืืืืชืจืื ืืืชื ืืืื ืชืงืื ืื fix ืืชืืืืก ืืชืืงืื ืืืชื ืชืงืื, ืืืืื ืืชืืงืื ืื ืืฆืืื ืืกืคืืง ืืื ืืคืขื ืืจืืฉืื ื ืื ืืื ืืืจืื ืืื fix ื ืืกืฃ ืฉืืชืงื ืืช ืืชืืงืื. ืืืืจ? ืืจืืจ. ืืื ืืฉ ืื ืืจื ืืืชืจ ืืืื. ื ื ืกื ืืช ืื.
ืืฆืจืชื ืจืืคื ืจืืง ืืืชืืื ืจืง ืืช ืฉืืืฉืช ืืงืืืืืื ืื ืฉืืืื ืืื:
41a1948 fix
0a197d4 fix
e7572cf remove unnecessary env group
daf174b initial commit
ืืืื ืฉืื ืืืคืชื ืืช ืืฉืื ืืืื ืืฉืื ืืงืื, ืื ืื ืฉืฆืจืื ืืฉืืื ืืฉื ืืช ืืช ืฉืืืฉืช ืืืืขืืช ืืงืืืื ืืื "ืืืืืจ ืืืืจื" ืฉืืืฉื ืงืืืืืื ืืืขืฉืืช ืงืืืื ืืืืฉ:
$ git reset HEAD~3
Unstaged changes after reset:
M textfile.txt
$ git add .
$ git commit -m 'remove unnecessary env group'
ืืคืจืืืงื ืืขืช ื ืืฆื ืืืืชื ืืฆื ืฉื ืงืืืื 41a1948 ืืื ืืืื ืืื:
622a0da remove unnecessary env group
daf174b initial commit
ืืื ืฉืืกืชืื ืืืื ืืจืื ืืชืื ืงืืืื 622a0da ืืช ืื ืืฉืื ืืืื ืฉื ืื ืฉืืืฉืช ืืงืืืืืื ืืืงืืจืืื.
ื .ื. ืืฉ ืืขืจืืืช ืฉืืืจืืืืช ืืืชื ืืขืฉืืช Push ืืื ืืืคืขืื CI Pipeline. ืฉืื ืื ืงืืืืืื ืืืจื ืืืืคื ืืื ืชืืืื ืืจืื ืคืืืช ืืืืืืชื ืืืืื ืืืืื ืืคืชืืื ืืืจืื ืฉืืืจ ืืฉืื ืืช ืืงืืืืืื ืืงืืืืื. ืืืฆืืื ืืืื ืื ื ืืืื ืืืฆืืจ ืขื ืฃ ื ืคืจื ืืฆืืจื ืืคืขืืช ื CI ืืื ืืืจื ืฉืกืืืืชื ืืืืืง ืื ื ืืืื ืืช ืืขื ืฃ ืืืืืง ืืช ืืงืืืืืื ืืืืืชืจืื ืขื ืจืืืืืก.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
