ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 418
Obunachilar
+124 soatlar
-27 kunlar
-530 kunlar
Postlar arxiv
1 418
ืื ื ืฉืืจ ืืืืฅ ืืงืืจืก
ืืืชืืจ ืืื ืืืื ืืื ืืืช ืงืืจืก ืืื ืืืืืื ืื ืืืื ืืงืืจืก. ืืืืช. ืืืจื ืฉืืฉ ืืื ืจืฉืืืช ื ืืฉืืื ืืืื ืื ืืฉืืจ ืื ืืื ื, ืืคืืื Chat GPT ืืืื ืืืชืื ืืช ืืืฆืืช.
ืืืืืื ืื ืืืื ืืงืืจืก ืืขื ืื ืื ืืืืจืื ืืื ืงืืื ืื ืืืืืื ืืื ืืฉืืื ืฉืืฉ ืืื ืืืช ืงืืจืก. ืืืื ืืืจืื ืืกืืกืืื ืืื ืืื ืฉืื ืืฉืชืขืืื, ืืืื ืืืจืื ืืกืืืืื ืืื ืืื ืฉืื ืืืื ืืืืืื. ืืืืืื ืขื ืื ืืฉืืื ืืื ืืฉืืื ืื ืืื ืืขืฆื ืืืืืช ืฉื ืื ืื ืื ื ืืืืืื. ืืื ืื ืฉืืืชืืจ ืื ืฉืืืืืื ืืืืช ืืืฉืืื ืืืืืช ืงืฉื ืืจืงืืจืกืื ืื ืืชืื ืื ืืฉืืื ืขืฆืื, ืื ืืชืื ืื ื ืืฉื ืฆืจืื ืืืืืจ ืขื ืืืื ืชืชื ื ืืฉืืื ืืืืจืื ืืื ืฉื ืืคืฉืจ ืืฆืืื ืขืืืง ืืื ืืืืืฉืืจ ืืื, ืื ืืืืจ ืฉืืื ืืื ืืฉืื ืืืืฉืืจ ืืื.
ืืฉ ืื ืืื ื ืจืขืืื ืืช ืฉืื ืขืืืืื, ืืืืืื:
1. ืชืืื ืื ืื ืฉืืชื ืืืืข ืขื ืื ืืฉื ืืื ืื ืืืฉืืื ืืืื (ืื ืขืืื. ืื ืืชื ืฆืจืื ืืืื ืืฉืื ืืชื ืื ืจืื ืืืืข ืขืืื ืืืชืจ ืืื ืฉืืชืืืืืื ืฉืื ืฆืจืืืื ืืืขืช).
2. ืชืืื ืืช ืื ืฉืืืจืื ืืืืื ืืืจืืืฉ ืฉืื ืืืื ืื (ืขืืื ืืื ืืช. ืื ืืืื ืืชื ื ืื ืืช ืืฆืืื ืืื ืืืื ืืืฉืื ืืกืืฃ ืืงืืจืก, ืืื ืืืจ ืืืื ืื ืืืื ื ืฉืื ืืกืืจืช ืืช ืืืืจืื ืืงืฉืื ืืื ืืขืฆื ืื ืืืื ืื ืืขืืื ืืืืืชื).
3. ืงื ืืืืฉืื ืืฆืืช ืืชืืื ืื ืฉืืชืื ืื (ืจืื ืืืฆืืืช ืฉืืงืืชื ืืืืจืื ืื ืืื ืืกืคืืง ืืืืืช).
ืื ืฉืื ืขืืื ืืื ืืืืงื ืืืืืื ืืื ืคืฉืื: ืืืกืชืื ืขื ืืื ืฉืื ืฉืืืืขืื ืืงืืจืก. ืืฉืืื ืื ืื ืืืืขืื ืืขืฉืืช ืืืื ืืื ืื ืฆืจืืืื ืืืขืช ืืขืฉืืช ืืขืชืื, ืืขืืฉืื ืืื ืืช ืืช ืืืกืืื ืืืืืจ ืืืืชืจ ืฉืืืื ืืืชื ืืฉื. ืื ื ืืืื ืืืชืืื ืืืชืจืืืืื ืืืื ืืช ืจืฉืืื ืฉื ืืฉืืืืช ืืืจืืช ืงืืฉื ืขืืื, ืืืฉืจ ืืืฉืืืืช ืืืืจืื ืืช ืื ืืืืจืื ืฉืื ืฉืื ืืืืช ืฆืจืืืื ืืขืฉืืช ืืกืืฃ ืืงืืจืก. ืืืจื ืฉืืฉ ืื ืืช ืืจืฉืืื ืื ื ืืชืืื ืืขืืืช ืืืชื ืืืกืืจืื ืฉื "ืืคื ื" ื"ืืืจื" ืืชืจืืื. ืืฉื ืืืจื ืืืกืืจืื ืื ื ืืืกืืฃ ืขืื ืืืืืืืช ืืื ืืืืง ืืช ืืขืงืจืื ืืช ืฉื ืืืื ืืืกืืจ. ืืื ืืื ืืืืช ืืฉืืื ืืื ืื "ืื ืื ืืืื" ืืื ืื ืื - ืืื ืืืืขืื ืื ืงืืื ื ื-ื.
1 418
ืฉืืืื ืขื Input ื React ืืขืืืช Vue
ืืงืื ืืื ื Vue ืืืื ืืืืขืืช:
<script setup lang="ts">
import {ref} from 'vue';
const data = ref('a');
function handleInput(e: any) {
if (Math.random() * 10 < 2) {
data.value = e.target.value;
}
}
</script>
<template>
<input type="text" @input="handleInput" :value="data" />
</template>
ืืืืืื ืื ืืฉืืืื ืืืชื ืืงืื ืืงืืื ืืจืืืงื:
function App() {
const [data, setData] = useState('a');
function handleInput(e) {
if (Math.random() * 10 < 2) {
setData(e.target.value);
}
}
return <input type="text" value={data} onChange={handleInput} />
}
ืืืจืกืช ืืจืืืงื ืชืขืืื ืืช ืืืงืกื ืืชืืื ืจืง ื 20% ืืืืงืจืื. ืืฉืืจ ืืืงืจืื ืื ืืืฉืชื ื data ืืื ืชืืืช ืืืงืกื ืฉืืืคืืขื ืขื ืืืกื ืืืฉืืจื ืืกืื ืืจื ืื ืืืฆืืื ืืช ืืืงืกื ืืืฉื. ืจืืืงื ืืชืขืื ืืืืืืฆืืช.
ืืืืจืกืช ื vue ืืืชื ืืืืช ืฉืื ื: ืื ืื ื ืขืืืื ื ืื ืกืื ืืคืื ืงืฆืื ืืขืืืื ืจืง ื 20% ืืืืงืจืื ื ืื ืกืื ืืืืืง ืืืืฆืืข ืฉื ืืชื ืื, ืืื ืืืงืกื ืืชืืื ืชืืื ืืฉืชื ื - ืืื ืงืฉืจ ืืืฆื ืฉื ืืืฉืชื ื data. ื ืฉืื ืื ืฉืฉืื ืื ืฉื data ืืืงืื ืืืจ ืขืืืื ืืืจืื ืืขืืืื ืฉื ืชืืืช ืืืงืกื, ืืืืืจ ืืืืจืกืช ื vue ืื ื ืืืื ืืืืกืืฃ ืืคืชืืจ:
<input type="text" @input="handleInput" :value="data" />
<button @click="data = ''">Reset</button>
ืืื ืืืืฆืืช ืขื ืืืคืชืืจ ืืืคืกื ืืช ืืืฉืชื ื ืืื ืืช ืืืงืกื ืืชืืื. ืืื ืื ืื ืืจืืืงืืืื ืฉื Vue ืืืืจ ืฉืืฉืืฉ ืฉืื ืื ืืืฉืชื ื ืื ืชืืืช ืืืงืกื ืขื ืืืกื ืชืขืืืื, ืืื ืืฉืืื ืฉืื ืื ืืืฉืชื ื ืืชืืื ืื ืืงืจื ืืืื.
ืื ืืืืจืช v-model ืขื ืืคืฉืจืืช ืืืชืืื ืชืืฉืืจ ืขื ืืืชื ืืชื ืืืืช ืืืืืืช:
<script setup lang="ts">
import {computed, ref} from 'vue';
const data = ref('a');
const dataModel = computed({
get() {
return data.value;
},
set(newValue) {
if (Math.random() * 10 < 2) {
data.value = newValue;
}
}
})
</script>
<template>
<Todos />
<input type="text" v-model="dataModel" />
<button @click="data = ''"></button>
</template>
ืื ืืืฆื ืื ื 20% ืืืืงืจืื ืชืืื ืืชืืื ืืืฉืชื ื ืืื ืืฉืืจ 80% ืื ืชืืื ืืชืืื ืืืฉืชื ื ืืืืงืกื ืืชืืืช ืืืงืกื ืืฆื ืืกืื ืืจืื, ืืชืืื ืชืฆืื ืืช ืืืงืกื ืฉื ืืชื ืืื ืืืฉืชื ื ืื ืืืื ืืืชื.
ืื ืืื ืืืช ืืคืฉืจ ืืขืฉืืช? ืื ืืชื ืจืืฆืื ืืช ืืืชื ืืืืช ืฉื ืจืืืงื ืชืฆืืจืื ืืืชืื ืืืชื ืืขืฆืืื:
function handleInput(e) {
if (Math.random() * 10 < 2) {
data.value = e.target.value;
} else {
e.target.value = data.value;
}
}1 418
ืืืืืืจ ืื ืืืจืืง
ืฉืคืืช ืจืืืช ืืืคืฉืจืืช ืื ื ืืืืืจ ืื ืืืืืืจ ืขืจื ืฉืืกืื ืฉืืืื ืื ืืืจืืง ืืช ืืฉืืืื ืืฉืืืจืื ืื ืงืืจืื ืืื ืฉืชืื ื ื. ืื ืืคืืืชืื ืื ื ืืืื ืืืืฆืื ืขืจื ืืืคื ืขื ืืคืื ืงืฆืื
get, ืืื ืื ืืืคืชื ืื ืงืืื ืื ื ืืงืื None:
>>> d = {"a": 10, "b": 20}
>>> d.get("a")
10
>>> d.get("d")
ืื ืขื ืืืคืจืืืจ ืกืืืจืืื ืืจืืืขืื ืฉืืืจืง ืฉืืืื ืื ืืขืจื ืื ืงืืื:
>>> d['a']
10
>>> d['d']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'd'
ืืกืงืืื ืืคืื ืงืฆืื get ืืืืืจื ืขืจื ืืืคื ืืื ืืื ืื ืงืืื ืืืืืจื None:
scala> Map("a" -> 10, "b" -> 20).get("a")
val res1: Option[Int] = Some(10)
scala> Map("a" -> 10, "b" -> 20).get("d")
val res3: Option[Int] = None
ืืืคืฉืจ ืื ืืืคืขืื ืืช ืืืคื ืืื ืคืื ืงืฆืื ืขื ืืืคืชื ืืฉืืื ืืฉืืืฃ ืขืจื ืื ืืืจืืง ืฉืืืื ืื ืืืคืชื ืื ืงืืื:
scala> Map("a" -> 10, "b" -> 20)("a")
val res2: Int = 10
scala> Map("a" -> 10, "b" -> 20)("d")
java.util.NoSuchElementException: key not found: d
at scala.collection.immutable.Map$Map2.apply(Map.scala:316)
... 30 elided
ืืจืื ืืื ืืฉืืชื ืฉืืืื ืืืฉืชืืฉ ืืคืื ืงืฆืืืช ืืื ืืคื ืืืงืฉืจ. ืืฉืฆืจืื ืืืจืืง ืฉืืืื ืื ื ืืืืจ ืืช ืืกืื ืฉืืืจืง ืฉืืืืืช, ืืืฉืฆืจืื ืืืืืืจ ืขืจื ืฉืืืื ืื ื ืืฉืชืืฉ ืืคืื ืงืฆืืืช ืืืกืื ืฉืืืืืจ ืขืจืืื.
ืฉืืชื ืื ืฉืืืืจื ืืื ืื ื ืืชืืื ืืื ืืช ืื ืื ืื ืื ืกืืื ืฉืืืช ืืขืืืื ืฉืืืจืชื, ืคืื ืงืฆืืืช ืฉืงืืจืืืช ืืคืื ืงืฆืืืช ืืืจืืืื ืืื ืืืื ืื ืืขืื, ืืืื ืฉืืืขืจืืช ืืืื ืขืจืืื ืฉื ื ืืกืืืื ืืืืชื ืคืจืืืงื ืืืจืจ ืืชืืื ืฉื ืงืื ืืคืื ืืกืืื. ืืืืจืื ื ืื ื ืื ืกื ืืืชืจืื ืืืฉืชืืฉ ืชืืื ืืืืชื ืกื ืฉื ืคืื ืงืฆืืืช ืืืืื ืืืืืืช ืฉืื ืืื ืชืืื ืืืืื ืืช ืขืฆืื.
ืืื ืืชืื? ืืืื ืืฉืชื ืืฉืืืืช ืืชื ืืขืืืคืื? ืืื ืืืื ืขืจืืื ืืฉืืืืช ืืืืชื ืคืจืืืงื?1 418
ืขื ืืขืจื ืฉื "ืืืืืช ืืขืฉืืื"
ืฉืืืฉื ืคืืืื ืฉืืฉืืชืคืื ืืืจืื ืื ืฉืื ืฉืืืืืื ื ืืฉื ืืืฉ:
1. "ืืขืืื ืื ืืืื ืืกืคืืง ืืื ืืื. ืื ื ืจืง ืืืืื ืืช ืืืื ืขืืฉืื".
2. "ืขื ืฉืืืื ืืกืคืืง ืืื ืืืจ ืืืื ืืืืืจ ืืื (ืื ืืฉื ืื ืืืื ืจืืืื ืื, ืื ื ืืืจ ืื ืืืื ืืืชื)".
3. "ืื ื ืื ืืืืืื ืื ืืื. ืืืจื ืืืืช ืืขืืื ืื ืืฆืืื ืืืืื ืืช ืื ืืฉื".
ืืคืืืื ืืืื ืขืืืืื ืืืืจืื ืืืชื ื ืืืืกืืื, ืืืืงื ืืชืื ืืงืื ืืื ืฉื ืจืฆืื ืืืฆืืื. ืื ืืืฆื ืืฉืืจืื ืฉืืชื ืจืืฆื ืืืฆืืื ืืืืื ืจืืืงื ืืชื ืจืง ืขืืืจ ืืื ืงืืจืกืื ืืืคืฉ ืืช ืืืื ืืืืชืจ, ืื ืคืขื ืืชืืื, ืืจืืืฉ ืฉืื ืื ืืกืคืืง ืืื ืืื ืืืคืฉ ืืฉืื ืืืชืจ ืืื. ืื ืืขืืจ ืจืง ืืืืื ืืช ืืืืฅ ืื ืืืื ืงืฆืจ ืืฆืจืื ืืืืฃ ืืืฆืื ืขืืืื ืืืฉื. ืืืืคืืฉ ืื ืขื ืืฉืืื ืืขืฉืืื ืืื ืืืคืฉืจ ืืืชืงืื.
ื ืฉืืื ืืช ืื ืืืืฉืื ืฉืืืืืื ืืืืื ืจืืืงื ืืจื ืขืฉืืื. ืืื ืชืชืืื ืขื ืืงืืจืก ืืจืืฉืื ืฉืืื ืืืฆืืช ืื ืืคืืื ืืืืจืื ืืืื ืื ืืจืืฉืื ืืืืืืื, ืชืื ื ืืคืืืงืฆืื ืจืืฉืื ื ืืื ืชืืฉืื ืื ืกืืช ืืื ืืช ืขืื ืืขืจืืืช ืืืขืจืืืช ืืชืืืืืืช ืืืชืจ. ืื ืืื ืืืืืช ืืืืชืงืข, ืืืขืฉืืช ืืขืืืืช ืืืื ืืช ืืืจืื ืื ื ืืื ืืื ืืื ืืืฉืืื ืืขืฉืืช ืืช ืื ืื ืืื ืืฆื ืฉืขื ืื ืฉืขื ืืืื. ืืื ืืืกืืก. ืืื ืืื ืืืชื ืชืืืืื ืชืืคืฉ ืืชืืฆื ืืืคืื ืืจืฉืช ืืขืืืจ ืืืืจืื ืขืืืื ืืื ื ืชืงืขืช ืืื ืขืื ืจืขืืื ืืช ืืชืจืืืืื ืืคืจืืืงืืื ืฉืืื ืืืืื ืืื ืืช. ืืืจื ืืกืคืืง ืืื ืืื ืชืืื ืื ืืงืืช ืงืืจืก ืืืืื ืื ืืจืื ืืืชืจ ืงื ืืืืืจ ืืืืืื.
ืืขืฉืืื ืืื ืฉืืื. ืืื ืงืืจืืช ืืงืฆื ืฉืืื, ืกืืื ืืืืจืื ืฉืืขื ืืื ืื ืืชืื ืืืืืื ืืช ืืืกืืก ืืชืืืื ืืืืืืื. ืืฉืื ืื ื ืืื ืื ืืช ืื ืฉืืจ ืืชืืืื ืกืืืื ืื ืื ื ืืืืืืื ืืขืฆืื ื ืื ืื ืืื ืืืืืืื ืืืื ืืช ืกืืืืื ืืืฆืืื.
1 418
ืืื ืืืงืฉืชื ืืฉืื ืืช ืื ืืืืฆืข
ื ืชืืื ื ืขื ืืืืจืช ื CSS ืืืื:
body, html {
height: 100vh;
padding: 0;
margin: 0;
}
main {
display: flex;
place-items: center;
background: #a0a0a0;
}
ืื HTML ืฉืืชืื ื body ืืืื ืืกื ืืื:
<main>hello world</main>
ืงืฆืช ืืคืชืืข ืืืืืช ืฉืืืงืกื ืื ืืืคืืข ืืืืฆืข ืืืกื, ืื ืืืคืงืืช ืืื ืื ืืืช. ืื ืงืืจื ืืื?
1. ืืืื ื ื body ืืื ืืืืืจ ืืชืคืืก ืืช ืื ืืืืื ืฉื ืืืกื, ืืื ืืื ืืืืจืช ืืืื ืขื ื main ืืืื ืืืืื ืืืงืืข ืืคื ืืชืืื. ืืืืจ ืืืชืืื ืืื ืฉืืจื ืืืืืช ืื ืืืื ืืืื ืืืืื ื.
2. ืืคืงืืื place-items: center ืืืืช ืงืืืขืช ื main ืืืงื ืืช ืืืืืื ืฉืื ืืืืฆืข ืฉืื. ืืื ืฉืืื ืื ืฉืื ืืืืื ืืื ืฉืืจื ืืืช ืืืื ืืฉืืจื ืืืืืืช ืชืืคืกืช ืืช ืื ืืืืื.
3. ืืื ืืืื ืืจืืื? ืืืื ื main ืชืืคืก ืืืจืืจืช ืืืื ืืช ืื ืจืืื ืืขืืื, ืืืื ืืฉืื ืกืื ืืฉืื ืืืชื "ืืืืฆืข" ืืื ืขืืืื ืชืืคืก ืืช ืื ืจืืื ืืขืืื.
ืืื ืืื ืืืช ื ืฉืื ืืช ืืืงืกื ืืืืฆืข ืืืกื, ืื ืืืคืงืืช ืืื ืื ืืืช? ืืจืืข ืฉืืืื ืื ืืช ืืืขืื ืืชืืงืื ืื ืื ืคืฉืืืื:
1. ื ืงืืข ืืช ืืืืื ืฉื main ืืืกืคืจ ืงืืืข ืื ืืืืื ืฉื ืืืืื ืฉืื, ืืืงืื ืืืืื ืฉื ืืชืืื ืฉืื, ืขื ืืื ืืืืจืช height: 100%.
2. ืื ืื ืื ื ืจืืฆืื ืฉืืืงืกื ืืืื ืืืืฆืข ื main ื ืืื ืืืืืืจ ืืืคืืื text-align ืขื ื main. ืืืืจืช text align ืงืืืขืช ืืช ืืืฉืืจ ืืืงืกื ืืชืื ืืืืง ืืชืฆืืื.
3. ืื ืื ืื ื ืจืืฆืื ืืืืืืจ ืืืคืืื ื ืืืืง ื ืืกืคืื ืืืงืกื ื ืืื ืืืืืืจ ืกืืืื p ืืืงืืืข ืืช ืจืืื ืืคืืกืงื ืืืืืช ืืืืืง ืจืืื ืืชืืื. ืื ืืคืฉืจ ืืืื ืืืืกืืฃ ืขืื ืคืืกืงืืืช ืืืงืื ืืกืคืจ ืืืื ืืื ืืืืฆืข.
ืกื ืืื ืืืืืื ืขื ืืืืฉืืจ ืืงืืืคื:
<iframe height="300" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/ynonp/embed/WbeeQqm?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/ynonp/pen/WbeeQqm">
Untitled</a> by Ynon Perek (<a href="https://codepen.io/ynonp">@ynonp</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
ืืืงืืฉืืจ:
https://codepen.io/ynonp/pen/WbeeQqm1 418
ืืืจืื ืืขืืื ื Chat GPT
ืืืืื ืช ืชืคืงืื ืืืืจื Chat GPT ืจืง ืืืืง ืชืืืืืื ืฉืืืจ ืืื ืืคื ืื: ืื ืืืืข ืืืืื ืงืืื ืืจืฉืช, ืืื ืฉืืื ืืฉ ืืืจ ืชืฉืืืืช ืืฆืืื ืืช ืืืกืืจืื ืืืืืงืื, ืืขืืฉืื ืืคืฉืจ ืืคืืื ืืฉืืื ืืฉืื ืืืื ืื ืืืงืื ืืกืืจ ืืืชืื ืืืฉืืช.
ืื ืื ื ืฉืืจ ืืืืจืื ืืขืฉืืช? ืื ื ืฉืืืฉ ืืฉืืืืช ืืฉืืืืช:
1. ืืงืืืข ืืช ืืชืคืจืื - ืืกืชืืจ ืฉืืื ืืจื ืืืช ืืืื React (ืื ืื ื ืืฉื ืืืจ). ืืืจืื ืฉืื ืื ืืืืื ืืื ืืช ืชืืื ืืืช ืืืืืืื ืฉืื ืืช, ืืืืืจ ืืืืจื ืืช ืื ืืฉืืื ืืกืืจ ืื ืืฉืืื ืฉืขืืื ื ืืืืื. ืื ืืฉ ืืื ืืืื ืืจื ื, ืืื ืืืืืื ืืื ืืจืื ืืืชืจ ืืขืื ืืฉืืืฉืื ืขืืืจ ืื ืืืืืจ ืื ืืืืจ ืืื ืฉืฆืจืื ืืืขืช.
2. ืืืืืช ืืขืืืืช - ืื ื ืืืืข ืืฉืืื ืืช Chat GPT ืื ืืคืฉืจ ืืฉืคืจ ืืงืื ืฉืืชืืชื, ืืืคืขืืื ืืืื ืื ืขืฆืืช ืืืืืช ืืื ืืื ืจืืืง ืฉื ืืช ืืืจ ืืืืืื ืืช ืืฆืจืืื ืืืืืชืืื ืฉืื ืืืืืืช ืคืขืจื ืืื ื. ืื ื ืฆืจืื ืืืจื ืฉืืขืืืจ ืื ืืฉืื ืื ืืฉืื ื ืขืืฉื ืืืจืื ืื ืืกืืจ, ืืชืื ืืื ื ืฉื ืขืืื ืืชืืื ืฉืื ืืืืชืืจืื ืืกืคืฆืืคืืื ืืชืืื.
3. ืืชืช ืืืื ืืืื - ืืืจื ืืืชืืืืืช ืืจืืฉืื ืืช ืืืืื ืืืจืฉ ืืชืืื ืืืืจื ืืื. ืืจืื ืืืชืจ ืงื ืืืชืืื ืืฉืื ืื ื ืื ืืื, ืืฉืืฉ ืืืฉืื ืฉืืืื ืืจืืืช ืืื ืืชืงืืืชื ืืฉืืืข ืืืฉืื ืืืชื ืืฉืืืจืื ืืฆืืืืื (ืื ืืขืืื ืืืชื ืืฉืื ื ืจืืฆื ืืืืชืจ).
ืืื ืฉื ืงืืื ืืืืื ืฉืืื ืื ื ืืขืืืช ืขื ืืืืข ื ืืื ืืืชืคื ืืช ืืืชืืจืื ืืืืืชืืื ืฉื ืืืจืื ืืืื ื-21. ืื ืื ืืฉ ืืฉืื ืฉืืืื ื ืืืฉื ืื ืืืืจืื ืืช ืืื ืฉืืืชืจ ืืืข ืื ืื ืืกืคืืง ืืฉืืื ืืขืฉืืช ืื ืฉืื ืืืืื ืืืชืจ.
1 418
ืืืจืื ืืขืืื ื Chat GPT
ืืืืื ืช ืชืคืงืื ืืืืจื Chat GPT ืจืง ืืืืง ืชืืืืืื ืฉืืืจ ืืื ืืคื ืื: ืื ืืืืข ืืืืื ืงืืื ืืจืฉืช, ืืื ืฉืืื ืืฉ ืืืจ ืชืฉืืืืช ืืฆืืื ืืช ืืืกืืจืื ืืืืืงืื, ืืขืืฉืื ืืคืฉืจ ืืคืืื ืืฉืืื ืืฉืื ืืืื ืื ืืืงืื ืืกืืจ ืืืชืื ืืืฉืืช.
ืื ืื ื ืฉืืจ ืืืืจืื ืืขืฉืืช? ืื ื ืฉืืืฉ ืืฉืืืืช ืืฉืืืืช:
1. ืืงืืืข ืืช ืืชืคืจืื - ืืกืชืืจ ืฉืืื ืืจื ืืืช ืืืื React (ืื ืื ื ืืฉื ืืืจ). ืืืจืื ืฉืื ืื ืืืืื ืืื ืืช ืชืืื ืืืช ืืืืืืื ืฉืื ืืช, ืืืืืจ ืืืืจื ืืช ืื ืืฉืืื ืืกืืจ ืื ืืฉืืื ืฉืขืืื ื ืืืืื. ืื ืืฉ ืืื ืืืื ืืจื ื, ืืื ืืืืืื ืืื ืืจืื ืืืชืจ ืืขืื ืืฉืืืฉืื ืขืืืจ ืื ืืืืืจ ืื ืืืืจ ืืื ืฉืฆืจืื ืืืขืช.
2. ืืืืืช ืืขืืืืช - ืื ื ืืืืข ืืฉืืื ืืช Chat GPT ืื ืืคืฉืจ ืืฉืคืจ ืืงืื ืฉืืชืืชื, ืืืคืขืืื ืืืื ืื ืขืฆืืช ืืืืืช ืืื ืืื ืจืืืง ืฉื ืืช ืืืจ ืืืืืื ืืช ืืฆืจืืื ืืืืืชืืื ืฉืื ืืืืืืช ืคืขืจื ืืื ื. ืื ื ืฆืจืื ืืืจื ืฉืืขืืืจ ืื ืืฉืื ืื ืืฉืื ื ืขืืฉื ืืืจืื ืื ืืกืืจ, ืืชืื ืืื ื ืฉื ืขืืื ืืชืืื ืฉืื ืืืืชืืจืื ืืกืคืฆืืคืืื ืืชืืื.
3. ืืชืช ืืืื ืืืื - ืืืจื ืืืชืืืืืช ืืจืืฉืื ืืช ืืืืื ืืืจืฉ ืืชืืื ืืืืจื ืืื. ืืจืื ืืืชืจ ืงื ืืืชืืื ืืฉืื ืื ื ืื ืืื, ืืฉืืฉ ืืืฉืื ืฉืืืื ืืจืืืช ืืื ืืชืงืืืชื ืืฉืืืข ืืืฉืื ืืืชื ืืฉืืืจืื ืืฆืืืืื (ืื ืืขืืื ืืืชื ืืฉืื ื ืจืืฆื ืืืืชืจ).
ืืื ืฉื ืงืืื ืืืืื ืฉืืื ืื ื ืืขืืืช ืขื ืืืืข ื ืืื ืืืชืคื ืืช ืืืชืืจืื ืืืืืชืืื ืฉื ืืืจืื ืืืื ื-21. ืื ืื ืืฉ ืืฉืื ืฉืืืื ื ืืืฉื ืื ืืืืจืื ืืช ืืื ืฉืืืชืจ ืืืข ืื ืื ืืกืคืืง ืืฉืืื ืืขืฉืืช ืื ืฉืื ืืืืื ืืืชืจ.
1 418
1. ืืฆืืจืช ืงืืฆื ืืืืืงื ืืืืฉื ืืืกืืก ืื ืชืื ืื, ืืืจื ืืื ืืื ืืืืจืช ืืกืืืื. ืื ื ืืืื ืืช ืืจืืื ืืืช kysely, ืขืืืชื ืขื Sequelize ื JavaScript (ืืคื ื ืืืืคืกืงืจืืคื) ืืื ืืืืชื ืืจืืฆื. ืืช TypeORM ืื ืืืืชื. ืืื ืืกืืฃ ืื ืจืง ืขื ืืื ืฉื ืืขื ืืืื ืืืืื.
2. ืืฆืืจืช ืงืืืคืื ื ืืืช ืฆื ืฉืจืช ืฉืืืฉืืืช ืืช ืืืืืข ืืืืคืืืช ืืืชื ื JSX.
3. ืืฆืืจืช ืงืืืคืื ื ืืืช ืฆื ืืงืื ืฉืืคืขืืื ืขื Server Actions ืืช ืงืืฆื ืืืืืืงื.
ืืืชืืจ ืืืจืืื ืฉืขืืืื ื ืฉืืจ ืืืื ืืืจืฆืื ืืื ืืงืืช ืืช ืืชืืฆืื ืฉื ื Server Action ืืืขืืื ืืช ืืืืืข ืฉืขื ืืืกื. ืืืืืื ืฉืื ืืืืชื ืฆืจืื ืืืืืืจ ืืช likesCount ืืชืืจ ืกืืืื ืืฉืืื ืฉืืืื ืืขืืื ืืืชื. ืืืฉื ืืืจืช ืฉืจืืืชื ืื ืืืคืขืื refresh ืืืชืช ืืฉืจืช ืืจื ืืจ ืืืืฉ ืืช ื Server Components ืขื ืืืืืข ืืืขืืืื.
1 418
2. ืืขืช ืืืืฆื ืขื ืืืคืชืืจ ืืคืื ืงืฆืื ืคืื ื ืืฉืจืช ืืืคืขืืื ืืช ืืคืื ืงืฆืื
likeLink ืฉืืืืืจืช ืฉื. ืื ื ืจืื ืืื ืืคืขืื ืจืืืื ืฉื ืคืื ืงืฆืื ืืื ืืขืฆื ืืืืืจ ืขื Server Action - ืืืืืจ ืงืจืืืช Ajax ืฉืืืจืืช ืืืคืขืืช ืคืื ืงืฆืื ืืฆื ืฉืจืช ืืืืืจืช ืืชืืฆืื. ืืคืื ืงืฆืื ืืืฉืืื ืืืืืงืช ืืชืืฆืื ืืืคื ืื ืืืืืื ืื ืืขืืืื ืืฆืืื ืืื ืื ืืื ืืขืื ืืช ืืกืคืจ ืืืืืงืื ืฉื ืืืื ืง. ืืืคืืืงืฆืื ืืืืื ืืืชืจ ืืืื ื ืืืืืื ืืฉืื ืจืืืืงืก ืืื ืืืื ื ืืืืืื ืืฆื ืฉืจืช ืืืฆืืจ ืืช ืืืืืงื ื Action ืืืชืืื ืืืคืื ืงืฆืื ืืฆื ืืืคืืคื ืืืชื ืขืืฉื ืื dispatch.
3. ืืชื ืฉืืื ืื ืฉืืขืืจืชื ืืช ื user ืืชืืจ prop. ืืฆืขืจื ืืื ื RSC ืชืืืื ื Context. ืืฉ ืืื ืืจืืงืื ืฉืืคืฉืจ ืืขืฉืืช ืืื ืืขืงืืฃ ืืช ืื ืืืืืืืจ Context ืืฆื ืืงืื ืืื ืืจืืื ืขื ืื ืืคืืกื ืืืจ. ืื ืื ืืื ืืกืคืืง ืืฉืื ืืืื. ืืืืื ืืืขืจืืช ืืืืชืืช ืชืฉืชืืฉื ืืื ืื ืื ื ืืืื ืืฉืชืืฉืื ืืื ืืืชืจ.
ืกืงืจืืคืืื ืื ืืืื
ืืขืืืื ืขื ืืจืืื ืงืื ืืคืงืืื:
$ npx drizzle-kit generate
ืืกืชืืืช ืขื ืืกืืืื ืืขื ืืกืืก ืื ืชืื ืื ืืืืืฆืจืช ืงืืืฅ SQL ืฉืืขืืื ืืช ืืกืืก ืื ืชืื ืื ืืื ืืืชืืื ืืกืืืื. ืืงืืืฅ ื ืฉืืจ ืืชืืงืืืช drizzle ืืืคืฉืจ ืืจืืืช ืฉืืคืจืืืงื ืืืืืื ืืฉ ืื ืงืืืฅ ืืื ืืื ืขื ืืชืืื ืืื:
CREATE TABLE \likes\ (
\id\ integer PRIMARY KEY AUTOINCREMENT NOT NULL,
\user_id\ integer NOT NULL,
\link_id\ integer NOT NULL,
FOREIGN KEY (\user_id\) REFERENCES \users\(\id\) ON UPDATE no action ON DELETE cascade,
FOREIGN KEY (\link_id\) REFERENCES \links\(\id\) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE \links\ (
\id\ integer PRIMARY KEY AUTOINCREMENT NOT NULL,
\user_id\ integer NOT NULL,
\href\ text NOT NULL,
FOREIGN KEY (\user_id\) REFERENCES \users\(\id\) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE \users\ (
\id\ integer PRIMARY KEY AUTOINCREMENT NOT NULL,
\name\ text NOT NULL
);
ืฉืืื ืื ืืืขืจื --> statement-breakpoint - ืืื ืืืืืช ืืืืคืืข ืืื ืคืงืืืืช ืฉืื ืืช ืืงืืืฅ ืืื ืฉืืจืืฆื ืื ืืคืงืืืืช. ืืื ื ืืฆืจืช ืืืืืืืืช ืืคืงืืืช generate ืืื ืื ืืชื ืขืืฉืื ืขืืืื ืืื ื ืื ืชืฉืืื ืืืชืื ืืืชื.
ืื ืืกืฃ ืืืฆืืจืช ืืกืืืื ืื ื ืืืื ืืืืืืง ืกืงืจืืคืืื ืืืื ืกืช ืืืืข ืืืกืืก ืื ืชืื ืื ืื ืืืืงืชื. ืืคืจืืืงื ืืืืืื ืืฆืจืชื ืกืงืจืืคื ืืื ืฉืฉืืืจ ืืืืข ืืคืืชืื:
import { db } from './db';
import { usersTable, linksTable, likesTable } from './db/schema';
async function seedDatabase() {
// Insert users
const userIds = await db.insert(usersTable).values([
{ name: 'Alice' },
{ name: 'Bob' },
{ name: 'Charlie' },
{ name: 'Dave'},
]).returning({ id: usersTable.id });
// Insert links
const linkIds = await db.insert(linksTable).values([
{ user_id: userIds[0].id, href: 'https://www.duckduckgo.com' },
{ user_id: userIds[1].id, href: 'https://www.tocode.co.il' },
{ user_id: userIds[2].id, href: 'https://nextjs.org/blog/next-15' },
]).returning({ id: linksTable.id });
// Insert likes
await db.insert(likesTable).values([
{ user_id: userIds[0].id, link_id: linkIds[1].id },
{ user_id: userIds[1].id, link_id: linkIds[2].id },
{ user_id: userIds[2].id, link_id: linkIds[1].id },
{ user_id: userIds[1].id, link_id: linkIds[0].id },
{ user_id: userIds[0].id, link_id: linkIds[1].id },
]);
console.log('Database seeded successfully!');
}
seedDatabase().catch(console.error);
ืืกืงืจืืคื ืืืจ ืฉืืืืง ืืช ืืืืืข:
import { db } from './db';
import { usersTable, linksTable, likesTable } from './db/schema';
async function truncateDatabase() {
await db.delete(usersTable)
await db.delete(linksTable);
await db.delete(likesTable);
}
truncateDatabase().catch(console.error);
ืืืจืืื ืืื ืขืืืื ืืจื ืืืื ืืช ืืืจืืฅ ืกืงืจืืคืืื ืืืื ืื ืืืกืคืชื ืืช ืืคืงืืืืช ื package.json:
"scripts": {
"dev": "next dev",
"seed-dev": "tsx src/seed-dev.ts",
"truncate-dev": "tsx src/truncate-dev-db.ts",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
ืกืืืื
ืืืืงืื ืืืจืืืืื ืืคืจืืืงื next ืขื ืืกืืก ื ืชืื ืื ืื ืืกื ืืื:1 418
.leftJoin(users, eq(links.user_id, users.id))
.leftJoin(likes, eq(links.id, likes.link_id))
.groupBy(links.id, users.name);
}
export async function likeLink(user_id: number, link_id: number) {
console.log(\user id = ${user_id}, link_id = ${link_id}\);
// Check if the like already exists
const existingLike = await db
.select()
.from(likes)
.where(and(eq(likes.user_id, user_id), eq(likes.link_id, link_id)))
.limit(1);
if (existingLike.length > 0) {
console.log('User has already liked this link.');
return { success: false, message: 'You have already liked this link.' };
}
// Add the like
const newLike = await db
.insert(likes)
.values({ user_id, link_id })
.returning();
console.log('Like added successfully:', newLike);
return { success: true, message: 'Like added successfully!', like: newLike };
}
ืขืืฉืื ืืจืืื ืืืื ืืืืืช ืืขืืืฃ ืืขืืืก, ืืื ืืงืืจืื ื SQL ืืฉ ืื ืืชืจืื ืืช. ืงืืื ืื ืืจืืจ ืืืื ืื ืงืืจื ืืื ืคืื ืงืฆืื, ืืืืื ืงื ื AI ืืงืื ืกืืืื ืืืืชืื ืืฉืืืืื ืฉืืืืชืืช ืืจืืื. ืื ืืืื ืืืื ORM, ืคื ืื ืืฉ ืืขืืช ืืฉืืืืชื ืื ืืขืืืช ืืืฆืืขืื ืจืืืื ืืืชื ืืื.
ืืขืืจืช ืืืืืข ืืืคืืคื
ืืืืง ืืฉื ื ืืชืืื ืืช ืืื ืืขืืจืช ืืืืืข ืืืคืืคื, ืืคื next.js ืขืืฉื ืืช ืืงืกื ืฉืื. ืืงืืืฅ page.tsx ืืื Server Component ืืืื ืืื ืืืื ืืืคืขืื ืื ืคืื ืงืฆืื ืืฆื ืฉืจืช, ืืืื ืคืื ืงืฆืืืช ืืืฉื ืืืกืืก ืื ืชืื ืื. ืื ืืงืื:
import { queryHomepageLinks } from "@/db/links";
import { login } from "@/db/users";
import Link from './client/Link';
export default async function Home() {
const homepageLinks = await queryHomepageLinks();
const currentUser = (await login('Dave')).user!;
return (
<div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
<main className="flex flex-col gap-8 row-start-2 items-center sm:items-start">
<ul className="space-y-4 text-left text-gray-500 dark:text-gray-400">
{homepageLinks.map(link => (
<Link user={currentUser} key={link.linkId} link={link} />
))}
</ul>
</main>
</div>
);
}
ืืฉืืื ืืคืฉืืืช ืื ืืขืจืืช ืืืชืืืจืืช ืคื ืืืื ืื ืืื ืช. ืื ืื ืฉื ืื ืก ืืืขืจืืช ืืืืื ืืชืืจ "Dave" ืืืื ืกืืกืื. ืืืชืจ ืืขื ืืื ืื ืืืขืจื homepageLinks, ืฉืืืืข ืืืคืื ืงืฆืื queryHomepageLinks ืฉืืืืืจื ืืงืืืฅ ืืืืฉื ืืืกืืก ืื ืชืื ืื. ืืืขืจื ืืื ืื ืื ื ืืืจ ืืฉืชืืฉืื ืืืชืืืช ืืงืืืคืื ื ืื.
ืขืืฉืื ืคื ืืืงืื ืืืืืืจ ืฉืขื ืืคื ื ืืื ืฉื ืื (ืืขืืืื ืืืขืจืืืช ืจืืืช ืฉืื ื ืืืืจ) ืฉืืืช ืืขืืืื ืขื ืืืืข ืฉืืืืข ืืืกืืก ืื ืชืื ืื ืืืชื ืืชืืืช ืฉืืืืชื ืืคืืื - ืงืืื ืืืงืืื ืืช ื HTML, CSS, JS ืืืฉืจืช, ืืื ืืฉ ืงืจืืืช Ajax ืฉืืืฉืืช ืืช ืืืืืข ืืจืืฉืื ื (ืืขืจื ืืืื ืงืื ืืืืืื ืฉืื ื). ืืขืืืื ืขื RSC ืืืกืืช ืืช ืืืคืืืืช ืืืืชืจ ืืื, ืืืืจ ืฉืืงืืืคืื ื ืื ืืชืจื ืืจืช ืจืง ืืฆื ืืฉืจืช ืืืงืื ืฉืื ืืคืืื ืื ื ืฉืื ืืืคืืคื.
ืื ืฉืื ื ืฉืื ืืืคืืคื ืื ืืงืื ืฉื ืงืืืคืื ื ืืช Link ืฉืืืืืจืช ืืงืืืฅ client/link.tsx:
'use client'
import { likeLink } from "@/db/links";
import { useState } from "react";
export default function Link({link, user}: {
link: {
linkId: number,
href: string,
likesCount: number,
},
user: { id: number, name: string },
}) {
const [likesCount, setLikesCount] = useState(link.likesCount);
async function handleClick() {
const result = await likeLink(user.id, link.linkId);
if (result.success) {
setLikesCount(c => c + 1);
} else {
alert(result.message);
}
}
return <li className="flex items-center space-x-3 rtl:space-x-reverse">
<span className="mx-2 inline-block w-4">{likesCount}</span>
<button onClick={handleClick} className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-2 rounded">+1</button>
<span className="font-bold">{link.href}</span>
</li>
};
ืืงืืืคืื ื ืื ืืงืืืช ืืช ืืืื ืง ืืงืืืคืื ื ืืช ืฆื ืืฉืจืช ืืืฆืืื ืืืชื, ืืื ืืฉ ืื ืขืื ืฉื ื ืืจืืงืื:
1. ืืฉืชืืฉ ืืืื ืืืืืฅ ืขื ืคืืืก ืืื ืืขืฉืืช "ืืืืง" ืืืื ืง. ืืฉืืื ืื ืืงืืืคืื ื ืื ืืืืืจื ืืฉืชื ื state ืฉืืชืืื ืขื ืืขืจื ืฉืืืืข ืืืฉืจืช ืืื ืืืื ืืืฉืชื ืืช ืืขืงืืืช ืืืืฆื ืขื ืืคืชืืจืื.1 418
ืคืจืืืงื ืืืืื: next ืขื ืืกืืก ื ืชืื ืื drizzle
ืืจืื ืืื ืื ื ืจืืฆื ืืืงืืื ืืืืืช ืืืืื ืฉืืกืืืจื ืืื ืืื ืืช ืคืจืืืงื ื next.js ืืฉืืืื ืขื ืืกืืก ื ืชืื ืื. ืืืืจ ืืื ื ืื ืืืื ืืชื ืืืืข ืืื ืืฉืืชื ืืืชืืื ืขื ืืืจืื ืืงืกื ืฉืืจืื ืืช ืื ืืืืงืื ืืืฉืืืื. ืืื ืืื ืืืื ืื ืืืื ืืืืื ืืื ืืืกืืฃ ืืื ืง ืืคืืกื ืืื.
ืืื ื ืืืขืจืืช
ืืืืช ืฉ Server Actions ื React Server Components ืืืจืืืื ืืจืื ืื ืฉืงืืจื ืืคืจืืืงื ืืื, ืืืกืืก ืื ืชืื ืื ืืื ืจืง ืืืืง ืืงืื.
ืืช ืืงืื ืืืื ืืชื ืืืืืื ืืืฆืื ืืงืืฉืืจ:
https://github.com/ynonp/demo-next-sql-drizzle
ืืื ืืืืงืื ืืืจืืืืื ืืงืื:
1. ืกืคืจืืืช src/db ืืืืืงื ืืช ืื ืืงืื ืฉืงืฉืืจ ืืขืืืื ืขื ืืกืืก ืื ืชืื ืื.
2. ืืืืืช ืืฉืืืืฉ ื Server Actions ื RSC ืืื ืฆืืจื ืืืืืืจ API. ืืืืฉื ืืฉืจืช ืืื ืืกื ืืื ืืคืขืืช ืคืื ืงืฆืื. ืืคืจืืืงื ืืืืืื ืืฉ ืืืฉื ืืืช ืืชืื ืงืื ืฆื ืฉืจืช ืืงืืืฅ
page.tsx ืืืืฉื ืืืช ืืชืื ืงืื ืฆื ืืงืื ืืงืืืฅ client/link.tsx.
3. ืืชืืงืืื ืืจืืฉืืช ืฉื ืืคืจืืืงื ืืืืจืชื ืฉื ื ืกืงืจืืคืืื ืืืื ืกืช ืืืืข ืืืืืื ืืืกืืก ืื ืชืื ืื ืืืืืงืชื. ืื ืืกืฃ ืืชืืงืืืช ืืคืจืืืงื ืืจืืฉืืช ืืงืืืฅ drizzle.config.ts ืืืจืื ืขื ืืืืจืช ืืืืืืจ ืืืกืืก ืื ืชืื ืื.
ืขืืฉืื ืืืื ื ืขืืืจ ืขื ืฉืืืฉืช ืืืืงืื.
ืืกืืก ืื ืชืื ืื
ืืกืืก ืื ืชืื ืื ื ืฉืืจ ืืืืืื ืืชืืจ ืงืืืฅ SQLite ืืื ืื ื ืจืืืื ืืช ืคืจืื ืืืชืืืจืืช ืืงืืืฅ ืืงืื ืคืืืืจืฆืื ืฉื ืืจืืื:
import 'dotenv/config';
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
out: './drizzle',
schema: './src/db/schema.ts',
dialect: 'sqlite',
dbCredentials: {
url: process.env.DB_FILE_NAME!,
},
});
ืืคืจืืืงื ืืฉืชืืฉ ื drizzle-kit ืื ืฉืืืืจืืช ืืกืืก ืื ืชืื ืื ืืืืขืืช ืืงืืืฅ ืืกืืืื. ืืคืจืืืงื ืืืืืื ืฉืืชืืชื ืืฉ ืืฉืชืืฉืื, ืืืฉืชืืฉืื ืืคืจืกืืื ืืื ืงืื ืืืืืืื ืืขืฉืืช "ืืืืง" ืืืื ืงืื ืฉืื ืื ืืืจืื ืคืจืกืื. ืืืช ืืกืืืื:
import { int, sqliteTable, text } from "drizzle-orm/sqlite-core";
export const usersTable = sqliteTable("users", {
id: int().primaryKey({ autoIncrement: true }),
name: text().notNull(),
});
export const linksTable = sqliteTable("links", {
id: int().primaryKey({ autoIncrement: true }),
user_id: int().references(() => usersTable.id, {onDelete: 'cascade'}).notNull(),
href: text().notNull(),
});
export const likesTable = sqliteTable('likes', {
id: int().primaryKey({autoIncrement: true}),
user_id: int().references(() => usersTable.id, {onDelete: 'cascade'}).notNull(),
link_id: int().references(() => linksTable.id, {onDelete: 'cascade'}).notNull(),
});
ืื ืืกืฃ ืื ื ืืืื ืืืื ืืืืืืจ ืคืื ืงืฆืืืช ืืขืืืื ืขื ืืกืืก ืื ืชืื ืื ืืงืืฆืื ืงืื ืื ืืชืืงืืืช db. ืื ื ืืกืืจ ืืช ืืคืื ืงืฆืืืช ืืคื ื ืืฉืืื ืืืื ื ืืฉื ืืฉ ืงืืืฅ, ืืืืืื ืืงืืืฅ users.ts ืืืจืื ืขื ืคืื ืงืฆืืืช ืฉืงืฉืืจืืช ืืืฉืชืืฉืื. ืื ืชืืื ื:
import {linksTable, usersTable, likesTable as likes} from './schema';
import {db} from './index';
import { eq } from 'drizzle-orm';
export async function login(name: string) {
// Check if the user already exists
const existingUser = await db
.select()
.from(usersTable)
.where(eq(usersTable.name, name))
.limit(1);
if (existingUser.length > 0) {
console.log('User logged in:', existingUser[0]);
return { success: true, user: existingUser[0] };
} else {
return { success: false, user: null };
}
}
ืืงืืฆืื ืืืื ืชืืฉืืจ ืื ืืืืืืงื ืฉื ืืืขืจืืช. ืืืื ืฉ Drizzle ืื ืงืฉืื ืืื TypeORM ืื Sequelize, ืืคืฉืจ ืืืจืื ืืช ืืงืืฆืื ืืื ืฆืืจื ืฉืืชืืืื ืืื. ืื ื ืืืื ืืืชืืื ืคืจืืืงื ืขื ืงืืืฅ ืืืืืงื ืืื ืืืื ืืื ืืคืฆื ืืืชื ืืงืืฆืื ืืืชืจ ืงืื ืื ืืฉืืื ืืชืืื ืืืจืืืฉ ืขืืืก.
ืืื ืงืืืฅ ืืืืืืงื ืืฉื ื ืืืชืืงืืื ื ืงืจื links ืืฉื ืืชืืชื ืืช ืืฉืืืืชืืช ืืืฉืืืช ืคืจืื ืืืื ืงืื:
'use server';
import {
linksTable as links,
usersTable as users,
likesTable as likes} from './schema';
import {db} from './index';
import { eq, sql, and } from 'drizzle-orm';
/**
* Returns a list of all links joined with their authors
* and number of likes
*/
export async function queryHomepageLinks() {
return db.select({
linkId: links.id,
href: links.href,
authorName: users.name,
likesCount: sql<number>\COUNT(${likes.id})\, // Aggregates likes
})
.from(links)1 418
ืฉืืื ืื - ืจืืืงื 19 ื next
ืืืจืกื 15 ืฉื ื ืงืกื ืืืจ ืืืืขื ืขื ืจืืืงื 19 (ื RC, ืื ื 19 ืืจืฉืื ืขืื ืื ืืฆื). ืื ื ืืืื ืฉ vercel ืืืืขืื ืฉืื ืืกืชืืืื ืขื ืืืจืกืช RC ืืฉืืืงืืกืืกืื ืขืืืื ืื ืชืืื. ืื ื ืื ืืืื ืฉืื ื ืืืื ืืื ืื ืื ืื ืืืืจืื.
ืืื ืื ืืขืืืฃ? ืื ื ืืชืงื ื ืืืฉื ืฉื next ื drizzle:
$ npx create-next-app@latest my-next-app
$ cd my-next-app
$ npm i drizzle-kit drizzle-orm @libsql/client dotenv
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: next-and-sql-demo@0.1.0
npm error Found: react@19.0.0-rc-66855b96-20241106
npm error node_modules/react
npm error react@"19.0.0-rc-66855b96-20241106" from the root project
npm error peer react@"*" from @op-engineering/op-sqlite@10.1.0
npm error node_modules/@op-engineering/op-sqlite
npm error peerOptional @op-engineering/op-sqlite@">=2" from drizzle-orm@0.36.3
npm error node_modules/drizzle-orm
npm error drizzle-orm@"*" from the root project
npm error 4 more (expo-sqlite, expo, @expo/dom-webview, react-native-webview)
npm error
npm error Could not resolve dependency:
npm error peerOptional react@">=18" from drizzle-orm@0.36.3
npm error node_modules/drizzle-orm
npm error drizzle-orm@"*" from the root project
ืืื ืฉื react-select:
$ npm install react-select
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: next-and-sql-demo@0.1.0
npm error Found: react@19.0.0-rc-66855b96-20241106
npm error node_modules/react
npm error react@"19.0.0-rc-66855b96-20241106" from the root project
npm error
npm error Could not resolve dependency:
npm error peer react@"^16.8.0 || ^17.0.0 || ^18.0.0" from react-select@5.8.3
npm error node_modules/react-select
npm error react-select@"*" from the root project
ืืืฉ ืขืื ืืืื.
ืขืืฉืื ืื ื ืืืืข ืืื ืืฉื ืื ืืช ืืจืืืงื ืืคืจืืืงื ื ืงืกื ืืืืฉ ืฉืื (ืื ืขืื ืืื ืืฉืชืืฉ ื Pages Router, ืื App Router ืื ืืืจืฉ ืืช ืจืืืงื 19). ืื ื ืื ืืืืข ืืื ืืืืฉืืจ ืืืืจืกื 14 ืฉื ื ืงืกื ืขืื ืงืฆืช, ืืืจืืช ืฉ 15 ืืืื ืฉืืคืืจืื ืืชืืงืื ื ืืืืื ืืืืืชื ืืขืืืฃ ืืงืื ืืืชื ืืคืจืืืงื. ืืืงืจื ืืืจืืข ืื ื ืื ืืืืข ืืืืจืื ืืช npm ืืืชืงืื ืืช ืืชืืืืืช ืื ืืขืฉืืช fork ืืชืืืืืช ืืืื ืืช ืืืจืกืืืช ืฉืืื ืฉืืชืืืืืช ืืจืืืงื 19. ืืื ืืคืฉืจ ืื ืืืืืช ืขื ืฉืืฆื ืจืืืงื 19.
ืื ืฉืฆืืจื ืืื ืืื ืืชืคืืกื ืืงืืืื ืืืื ืืชืคืงืื ืฉื next ืืืืืืื ืฉื ืืชืื ืชืื ืจืืื ืืืืื next ืื ืืืืืฉืื ืืจืืจืช ืืืื ืืคืืชืื ืจืืืงื. ืขื ืื ืืืืื ื next ืืืื ืืืืืจ ืฉืืืื ืื ืฉืื ืขืืืืื ืืจืืืงื ืืฆื ืืงืื ืืืืฉืืื ืืืืข ื REST API ืืฆื ืฉืจืช ืืืื ืืกืืจ. ื ืงืกื ืืื ืื ืืืจื ืืืืืื ืื ืืคืืื ืืืืื ืืืืชืจ ืืื ืืช ืืืฉืืื ืจืืืงื. ืื ืืื ืืกืคืง ืคืืชืจืื ืืกืื ืืกืืื ืฉื ืืืฉืืืื ืืืื ืืืจืฆืื ืืืื ืืื ืฆื ืืงืื ืืฆื ืฉืจืช, ืืื ืืื ืขื ืืืช ืืฉืฆืจืื ืืืืืจ ืืื ืืืืืฉืื ืืืฆืืืืช ืื ืงืกื ืืขืืืคืื ืืช ืืืืืืฉืื, ืืื ืื ืืืืจื ืฉืืชืืืื ืืื ืืื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
