en
Feedback
ToCode

ToCode

Open in Telegram

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Show more
1 418
Subscribers
+124 hours
-27 days
-530 days
Posts Archive
ToCode
1 418
ืžื” ื ืฉืืจ ืžื—ื•ืฅ ืœืงื•ืจืก ื”ืืชื’ืจ ื”ื›ื™ ื’ื“ื•ืœ ื‘ื‘ื ื™ื™ืช ืงื•ืจืก ื”ื•ื ืœื”ื—ืœื™ื˜ ืžื” ื™ื”ื™ื” ื‘ืงื•ืจืก. ื‘ืืžืช. ืื—ืจื™ ืฉื™ืฉ ืœื›ื ืจืฉื™ืžืช ื ื•ืฉืื™ื ื˜ื•ื‘ื” ื›ืœ ื”ืฉืืจ ื–ื” ื˜ื›ื ื™, ืืคื™ืœื• Chat GPT ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืืช ื”ืžืฆื’ืช. ื”ื”ื—ืœื˜ื” ืžื” ื™ื”ื™ื” ื‘ืงื•ืจืก ื•ืขืœ ืžื” ืœื ืžื“ื‘ืจื™ื ื”ื™ื ืงื•ื“ื ื›ืœ ื”ื”ื—ืœื˜ื” ื”ื›ื™ ื—ืฉื•ื‘ื” ืฉื™ืฉ ื‘ื‘ื ื™ื™ืช ืงื•ืจืก. ืœืžื“ื• ื“ื‘ืจื™ื ื‘ืกื™ืกื™ื™ื ืžื“ื™ ื•ืื ืฉื™ื ื™ืฉืชืขืžืžื•, ืœืžื“ื• ื“ื‘ืจื™ื ืžืกื•ื‘ื›ื™ื ืžื“ื™ ื•ืื ืฉื™ื ื™ืœื›ื• ืœืื™ื‘ื•ื“. ื”ื”ื—ืœื˜ื” ืขืœ ื”ื ื•ืฉืื™ื ื”ื™ื ื—ืฉื•ื‘ื” ื›ื™ ื”ื™ื ื‘ืขืฆื ื”ืžื”ื•ืช ืฉืœ ืžื” ืื ื—ื ื• ืžืœืžื“ื™ื. ืื‘ืœ ืžื” ืฉืžืืชื’ืจ ื–ื” ืฉื”ื”ื—ืœื˜ื” ื”ื–ืืช ืžืžืฉื™ื›ื” ืœื”ื™ื•ืช ืงืฉื” ื‘ืจืงื•ืจืกื™ื” ื’ื ืœืชื•ืš ื”ื ื•ืฉืื™ื ืขืฆืžื, ื›ื™ ื‘ืชื•ืš ื›ืœ ื ื•ืฉื ืฆืจื™ืš ืœื‘ื—ื•ืจ ืขืœ ืื™ื–ื” ืชืชื™ ื ื•ืฉืื™ื ืžื“ื‘ืจื™ื ื•ื’ื ืฉื ืืคืฉืจ ืœืฆืœื•ืœ ืขืžื•ืง ืžื“ื™ ื•ืœื”ื™ืฉืืจ ืœื‘ื“, ืื• ืœื“ื‘ืจ ืฉื˜ื—ื™ ืžื“ื™ ื•ืฉื•ื‘ ืœื”ื™ืฉืืจ ืœื‘ื“. ื™ืฉ ื›ืœ ืžื™ื ื™ ืจืขื™ื•ื ื•ืช ืฉืœื ืขื•ื‘ื“ื™ื, ืœื“ื•ื’ืžื”: 1. ืชื’ื™ื“ ื›ืœ ืžื” ืฉืืชื” ื™ื•ื“ืข ืขืœ ื”ื ื•ืฉื ื›ื“ื™ ืœื ืœื”ืฉืžื™ื˜ ื›ืœื•ื (ืœื ืขื•ื‘ื“. ืื ืืชื” ืฆืจื™ืš ืœืœืžื“ ืžืฉื”ื• ืืชื” ื›ื ืจืื” ื™ื•ื“ืข ืขืœื™ื• ื™ื•ืชืจ ืžืžื” ืฉื”ืชืœืžื™ื“ื™ื ืฉืœืš ืฆืจื™ื›ื™ื ืœื“ืขืช). 2. ืชื’ื™ื“ ืืช ืžื” ืฉื™ื’ืจื•ื ืœื›ื•ืœื ืœื”ืจื’ื™ืฉ ืฉื”ื ืžื‘ื™ื ื™ื (ืขื•ื‘ื“ ื–ืžื ื™ืช. ื”ื ืื•ืœื™ ื™ืชื ื• ืœืš ืืช ื”ืฆื™ื•ืŸ ื”ื›ื™ ื’ื‘ื•ื” ื‘ืžืฉื•ื‘ ื‘ืกื•ืฃ ื”ืงื•ืจืก, ืื‘ืœ ืžื”ืจ ืžืื•ื“ ื”ื ื™ื‘ื™ื ื• ืฉืœื ื”ืกื‘ืจืช ืืช ื”ื“ื‘ืจื™ื ื”ืงืฉื™ื ื•ื”ื ื‘ืขืฆื ืœื ืžื•ื›ื ื™ื ืœืขื•ืœื ื”ืืžื™ืชื™). 3. ืงื— ืžืžื™ืฉื”ื• ืžืฆื’ืช ื•ืชื’ื™ื“ ืžื” ืฉื›ืชื•ื‘ ื‘ื” (ืจื•ื‘ ื”ืžืฆื’ื•ืช ืฉืœืงื—ืชื™ ืžืื—ืจื™ื ืœื ื”ื™ื• ืžืกืคื™ืง ื˜ื•ื‘ื•ืช). ืžื” ืฉื›ืŸ ืขื•ื‘ื“ ื”ื•ื ื“ื•ื•ืงื ื”ื›ื™ื•ื•ืŸ ื”ื›ื™ ืคืฉื•ื˜: ืœื”ืกืชื›ืœ ืขืœ ื”ืื ืฉื™ื ืฉืžื’ื™ืขื™ื ืœืงื•ืจืก. ืœืฉืื•ืœ ืžื” ื”ื ื™ื•ื“ืขื™ื ืœืขืฉื•ืช ื”ื™ื•ื ื•ืžื” ื”ื ืฆืจื™ื›ื™ื ืœื“ืขืช ืœืขืฉื•ืช ื‘ืขืชื™ื“, ื•ืขื›ืฉื™ื• ืœื‘ื ื•ืช ืืช ื”ืžืกืœื•ืœ ื”ืžื”ื™ืจ ื‘ื™ื•ืชืจ ืฉื™ื‘ื™ื ืื•ืชื ืœืฉื. ืื ื™ ืื•ื”ื‘ ืœื”ืชื—ื™ืœ ืžื”ืชืจื’ื•ืœื™ื ื•ืœื‘ื ื•ืช ืจืฉื™ืžื” ืฉืœ ืžืฉื™ืžื•ืช ื‘ื“ืจื’ืช ืงื•ืฉื™ ืขื•ืœื”, ื›ืืฉืจ ื”ืžืฉื™ืžื•ืช ื”ืื—ืจื•ื ื•ืช ื”ืŸ ื”ื“ื‘ืจื™ื ืฉืื ืฉื™ื ื‘ืืžืช ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ื‘ืกื•ืฃ ื”ืงื•ืจืก. ืื—ืจื™ ืฉื™ืฉ ืœื™ ืืช ื”ืจืฉื™ืžื” ืื ื™ ืžืชื—ื™ืœ ืœืขื‘ื•ืช ืื•ืชื” ื‘ื”ืกื‘ืจื™ื ืฉืœ "ืœืคื ื™" ื•"ืื—ืจื™" ื”ืชืจื’ื™ืœ. ื›ืฉื ื’ืžืจื• ื”ื”ืกื‘ืจื™ื ืื ื™ ืื•ืกื™ืฃ ืขื•ื“ ื“ื•ื’ืžืื•ืช ื›ื“ื™ ืœื—ื–ืง ืืช ื”ืขืงืจื•ื ื•ืช ืฉื ืœืžื“ื• ื‘ื”ืกื‘ืจ. ื‘ื‘ื ื™ื™ื” ื›ื–ืืช ื”ืฉืืœื” ื”ื™ื ืœื "ืžื” ืœื ืœืœืžื“" ืืœื ืžื” ื›ืŸ - ืื™ืš ืžื’ื™ืขื™ื ืžื ืงื•ื“ื” ื ืœ-ื‘.

ToCode
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;
  }
}

ToCode
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
ื”ืจื‘ื” ื–ืžืŸ ื—ืฉื‘ืชื™ ืฉื›ื“ืื™ ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ืืœื” ืœืคื™ ื”ื”ืงืฉืจ. ื›ืฉืฆืจื™ืš ืœื–ืจื•ืง ืฉื’ื™ืื” ืื ื™ ืื‘ื—ืจ ืืช ื”ืกื•ื’ ืฉื–ื•ืจืง ืฉื’ื™ืื•ืช, ื•ื›ืฉืฆืจื™ืš ืœื”ื—ื–ื™ืจ ืขืจืš ืฉื’ื™ืื” ืื ื™ ืืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ืžื”ืกื•ื’ ืฉืžื—ื–ื™ืจ ืขืจื›ื™ื. ืฉืžืชื™ ืœื‘ ืฉืœืื•ืจืš ื–ืžืŸ ืื ื™ ืžืชื—ื™ืœ ืœื‘ื ื•ืช ืžื ื’ื ื•ื ื™ื ืกื‘ื™ื‘ ืฉื™ื˜ืช ื”ืขื‘ื•ื“ื” ืฉื‘ื—ืจืชื™, ืคื•ื ืงืฆื™ื•ืช ืฉืงื•ืจืื•ืช ืœืคื•ื ืงืฆื™ื•ืช ื•ื”ืจื’ืœื™ื ืื™ืš ืœื“ื‘ื’ ื›ืœ ื‘ืขื™ื”, ื•ื›ื›ืœ ืฉื”ืžืขืจื›ืช ื’ื“ืœื” ืขืจื‘ื•ื‘ ืฉื ื™ ื”ืกื•ื’ื™ื ื‘ืื•ืชื• ืคืจื•ื™ืงื˜ ื’ื•ืจืจ ื›ืชื™ื‘ื” ืฉืœ ืงื•ื“ ื›ืคื•ืœ ืžืกื‘ื™ื‘. ืœืื—ืจื•ื ื” ืื ื™ ืžื ืกื” ืœื”ืชืจื’ืœ ืœื”ืฉืชืžืฉ ืชืžื™ื“ ื‘ืื•ืชื• ืกื˜ ืฉืœ ืคื•ื ืงืฆื™ื•ืช ื•ื—ื™ื™ื‘ ืœื”ื•ื“ื•ืช ืฉื–ื” ื‘ื™ื ืชื™ื™ื ืžื•ื›ื™ื— ืืช ืขืฆืžื•. ื•ืžื” ืืชื›ื? ืื™ื–ื” ืžืฉืชื™ ื”ืฉื™ื˜ื•ืช ืืชื ืžืขื“ื™ืคื™ื? ื•ืžื” ืœื’ื‘ื™ ืขืจื‘ื•ื‘ ื”ืฉื™ื˜ื•ืช ื‘ืื•ืชื• ืคืจื•ื™ืงื˜?

ToCode
1 418
ืขืœ ื”ืขืจืš ืฉืœ "ืœื”ื™ื•ืช ื‘ืขืฉื™ื™ื”" ืฉืœื•ืฉื” ืคื—ื“ื™ื ืฉืžืฉื•ืชืคื™ื ืœื”ืจื‘ื” ืื ืฉื™ื ืฉืœื•ืžื“ื™ื ื ื•ืฉื ื—ื“ืฉ: 1. "ืœืขื•ืœื ืœื ืื”ื™ื” ืžืกืคื™ืง ื˜ื•ื‘ ื‘ื–ื”. ืื ื™ ืจืง ืžื‘ื–ื‘ื– ืืช ื”ื–ืžืŸ ืขื›ืฉื™ื•". 2. "ืขื“ ืฉืื”ื™ื” ืžืกืคื™ืง ื˜ื•ื‘ ื›ื‘ืจ ื™ื”ื™ื” ืžืื•ื—ืจ ืžื“ื™ (ื”ื ื•ืฉื ืœื ื™ื”ื™ื” ืจืœื•ื•ื ื˜ื™, ืื ื™ ื›ื‘ืจ ืœื ืื•ื”ื‘ ืื•ืชื•)". 3. "ืื ื™ ืœื ื‘ื›ื™ื•ื•ืŸ ื”ื ื›ื•ืŸ. ื‘ื“ืจืš ื”ื–ืืช ืœืขื•ืœื ืœื ืืฆืœื™ื— ืœืœืžื•ื“ ืืช ื”ื ื•ืฉื". ื”ืคื—ื“ื™ื ื”ืืœื” ืขืœื•ืœื™ื ืœื”ื•ืจื™ื“ ืื•ืชื ื• ืžื”ืžืกืœื•ืœ, ื“ื•ื•ืงื ืžืชื•ืš ืžืงื•ื ื˜ื•ื‘ ืฉืœ ืจืฆื•ืŸ ืœื”ืฆืœื—ื”. ื–ื” ื”ืžืฆื‘ ื›ืฉืžืจื•ื‘ ืฉืืชื” ืจื•ืฆื” ืœื”ืฆืœื™ื— ืœืœืžื•ื“ ืจื™ืืงื˜ ืืชื” ืจืง ืขื•ื‘ืจ ื‘ื™ืŸ ืงื•ืจืกื™ื ืœื—ืคืฉ ืืช ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ, ื›ืœ ืคืขื ืžืชื—ื™ืœ, ืžืจื’ื™ืฉ ืฉื–ื” ืœื ืžืกืคื™ืง ื˜ื•ื‘ ื•ืื– ืžื—ืคืฉ ืžืฉื”ื• ื™ื•ืชืจ ื˜ื•ื‘. ื›ืœ ืžืขื‘ืจ ืจืง ืžื’ื“ื™ืœ ืืช ื”ืœื—ืฅ ื›ื™ ื”ื–ืžืŸ ืงืฆืจ ื•ืฆืจื™ืš ื“ื—ื•ืฃ ืœืžืฆื•ื ืขื‘ื•ื“ื” ื—ื“ืฉื”. ื”ื—ื™ืคื•ืฉ ื‘ื ืขืœ ื—ืฉื‘ื•ืŸ ื”ืขืฉื™ื™ื” ื•ืœื ืžืืคืฉืจ ืœื”ืชืงื“ื. ื ืฉื•ื•ื” ืืช ื–ื” ืœืžื™ืฉื”ื™ ืฉืžื—ืœื™ื˜ื” ืœืœืžื•ื“ ืจื™ืืงื˜ ื“ืจืš ืขืฉื™ื™ื”. ื”ื™ื ืชืชื—ื™ืœ ืขื ื”ืงื•ืจืก ื”ืจืืฉื•ืŸ ืฉื”ื™ื ืžื•ืฆืืช ืื• ืืคื™ืœื• ื”ืžื“ืจื™ืš ื”ื—ื™ื ืžื™ ื”ืจืืฉื•ืŸ ื‘ื™ื•ื˜ื™ื•ื‘, ืชื‘ื ื” ืืคืœื™ืงืฆื™ื” ืจืืฉื•ื ื” ื•ืื– ืชืžืฉื™ืš ืœื ืกื•ืช ืœื‘ื ื•ืช ืขื•ื“ ืžืขืจื›ื•ืช ื•ืžืขืจื›ื•ืช ืžืชื•ื—ื›ืžื•ืช ื™ื•ืชืจ. ื›ืŸ ื”ื™ื ื”ื•ืœื›ืช ืœื”ื™ืชืงืข, ื•ืœืขืฉื•ืช ื˜ืขื•ื™ื•ืช ื•ืœื‘ื ื•ืช ื“ื‘ืจื™ื ืœื ื ื›ื•ืŸ ืื‘ืœ ื”ื™ื ืžืžืฉื™ื›ื” ืœืขืฉื•ืช ืืช ื–ื” ื›ืœ ื™ื•ื ื—ืฆื™ ืฉืขื” ืื• ืฉืขื” ื‘ื™ื•ื. ื•ื–ื” ื”ื‘ืกื™ืก. ืœืื˜ ืœืื˜ ืื•ืชื” ืชืœืžื™ื“ื” ืชื—ืคืฉ ื•ืชืžืฆื ื˜ื™ืคื™ื ื‘ืจืฉืช ืœืขื–ื•ืจ ื‘ื“ื‘ืจื™ื ืขืœื™ื”ื ื”ื™ื ื ืชืงืขืช ื•ื’ื ืขื•ื“ ืจืขื™ื•ื ื•ืช ืœืชืจื’ื™ืœื™ื ื•ืคืจื•ื™ืงื˜ื™ื ืฉื”ื™ื ื™ื›ื•ืœื” ืœื‘ื ื•ืช. ืื—ืจื™ ืžืกืคื™ืง ื–ืžืŸ ื”ื™ื ืชื•ื›ืœ ื’ื ืœืงื—ืช ืงื•ืจืก ื•ื™ื”ื™ื” ืœื” ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœื‘ื—ื•ืจ ื•ืœื”ื‘ื™ืŸ. ื”ืขืฉื™ื™ื” ื”ื™ื ืฉืœื›ื. ื”ื™ื ืงื•ืจื™ืช ื‘ืงืฆื‘ ืฉืœื›ื, ืกื‘ื™ื‘ ื”ื“ื‘ืจื™ื ืฉืžืขื ื™ื™ื ื™ื ืืชื›ื ื•ืžื”ื•ื•ื” ืืช ื”ื‘ืกื™ืก ืœืชื”ืœื™ืš ื”ืœื™ืžื•ื“ื™. ื›ืฉืื ื—ื ื• ื‘ื•ื ื™ื ืืช ื›ืœ ืฉืืจ ื”ืชื”ืœื™ืš ืกื‘ื™ื‘ื” ืื ื—ื ื• ืžื‘ื˜ื™ื—ื™ื ืœืขืฆืžื ื• ื”ื ืื” ื•ื’ื ืžื’ื“ื™ืœื™ื ืžืื•ื“ ืืช ืกื™ื›ื•ื™ื™ ื”ื”ืฆืœื—ื”.

ToCode
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/WbeeQqm

ToCode
1 418
ืžื•ืจื™ื ื‘ืขื™ื“ืŸ ื” Chat GPT ืžื‘ื—ื™ื ืช ืชืคืงื™ื“ ื”ืžื•ืจื” Chat GPT ืจืง ื—ื™ื–ืง ืชื”ืœื™ื›ื™ื ืฉื›ื‘ืจ ื”ื™ื• ืœืคื ื™ื•: ื›ืœ ื”ื™ื“ืข ืžืžื™ืœื ืงื™ื™ื ื‘ืจืฉืช, ืœื›ืœ ืฉืืœื” ื™ืฉ ื›ื‘ืจ ืชืฉื•ื‘ื•ืช ืžืฆื•ื™ื ื•ืช ื•ื”ืกื‘ืจื™ื ืžื“ื•ื™ืงื™ื, ื•ืขื›ืฉื™ื• ืืคืฉืจ ืืคื™ืœื• ืœืฉืื•ืœ ื›ืฉืœื ืžื‘ื™ื ื™ื ื•ืœืงื‘ืœ ื”ืกื‘ืจ ืžื•ืชืื ืื™ืฉื™ืช. ืื– ืžื” ื ืฉืืจ ืœืžื•ืจื™ื ืœืขืฉื•ืช? ื”ื ื” ืฉืœื•ืฉ ืžืฉื™ืžื•ืช ื—ืฉื•ื‘ื•ืช: 1. ืœืงื‘ื•ืข ืืช ื”ืชืคืจื™ื˜ - ืžืกืชื‘ืจ ืฉืื™ืŸ ื“ืจืš ืื—ืช ืœืœืžื“ React (ืื• ื›ืœ ื ื•ืฉื ืื—ืจ). ืžื•ืจื™ื ืฉื•ื ื™ื ื™ื•ื›ืœื• ืœื‘ื ื•ืช ืชื•ื›ื ื™ื•ืช ืœื™ืžื•ื“ื™ื ืฉื•ื ื•ืช, ื›ืœื•ืžืจ ื™ื‘ื—ืจื• ืืช ื”ื ื•ืฉืื™ื ื•ืกื“ืจ ื”ื ื•ืฉืื™ื ืฉืขืœื™ื ื• ืœืœืžื•ื“. ื›ืŸ ื™ืฉ ื”ื›ืœ ื‘ืื™ื ื˜ืจื ื˜, ืื‘ืœ ื”ืœื™ืžื•ื“ ื”ื•ื ื”ืจื‘ื” ื™ื•ืชืจ ื™ืขื™ืœ ื›ืฉืžื™ืฉื”ื• ืขื•ื–ืจ ืœื™ ืœื‘ื—ื•ืจ ืžื” ื”ื“ื‘ืจ ื”ื‘ื ืฉืฆืจื™ืš ืœื“ืขืช. 2. ืœื–ื”ื•ืช ื˜ืขื•ื™ื•ืช - ืื ื™ ื™ื•ื“ืข ืœืฉืื•ืœ ืืช Chat GPT ืžื” ืืคืฉืจ ืœืฉืคืจ ื‘ืงื•ื“ ืฉื›ืชื‘ืชื™, ื•ืœืคืขืžื™ื ื™ื”ื™ื• ืœื• ืขืฆื•ืช ื˜ื•ื‘ื•ืช ืื‘ืœ ื”ื•ื ืจื—ื•ืง ืฉื ื•ืช ืื•ืจ ืžืœื”ื‘ื™ืŸ ืืช ื”ืฆืจื›ื™ื ื”ืืžื™ืชื™ื™ื ืฉืœื™ ื•ืœื–ื”ื•ืช ืคืขืจื™ ื”ื‘ื ื”. ืื ื™ ืฆืจื™ืš ืžื•ืจื” ืฉื™ืขื–ื•ืจ ืœื™ ืœืฉื™ื ืœื‘ ื›ืฉืื ื™ ืขื•ืฉื” ื“ื‘ืจื™ื ืœื ื‘ืกื“ืจ, ืžืชื•ืš ื”ื‘ื ื” ืฉืœ ืขื•ืœื ื”ืชื•ื›ืŸ ืฉืœื™ ื•ื”ืืชื’ืจื™ื ื”ืกืคืฆื™ืคื™ื™ื ื‘ืชื•ื›ื•. 3. ืœืชืช ืžื™ืœื” ื˜ื•ื‘ื” - ืื—ืจื™ ื”ื”ืชืœื”ื‘ื•ืช ื”ืจืืฉื•ื ื™ืช ืœื™ืžื•ื“ ื“ื•ืจืฉ ื”ืชืžื“ื” ืœืื•ืจืš ื–ืžืŸ. ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœื”ืชืžื™ื“ ื›ืฉืื ื—ื ื• ืœื ืœื‘ื“, ื›ืฉื™ืฉ ืžื™ืฉื”ื• ืฉืžื—ื›ื” ืœืจืื•ืช ื›ืžื” ื”ืชืงื“ืžืชื™ ื”ืฉื‘ื•ืข ื•ื™ืฉืžื— ืื™ืชื™ ื›ืฉื“ื‘ืจื™ื ืžืฆืœื™ื—ื™ื (ืื• ื™ืขื•ื“ื“ ืื•ืชื™ ื›ืฉืื ื™ ืจื•ืฆื” ืœื•ื•ืชืจ). ื›ื›ืœ ืฉื ืงื“ื™ื ืœื”ื‘ื™ืŸ ืฉืื™ืŸ ืœื ื• ื‘ืขืœื•ืช ืขืœ ื”ื™ื“ืข ื ื•ื›ืœ ืœื”ืชืคื ื•ืช ืœืืชื’ืจื™ื ื”ืืžื™ืชื™ื™ื ืฉืœ ืžื•ืจื™ื ื‘ืžืื” ื”-21. ื›ื™ ืื ื™ืฉ ืžืฉื”ื• ืฉืœืžื“ื ื• ืžื”ืฉื ื™ื ื”ืื—ืจื•ื ื•ืช ื”ื•ื ืฉื™ื•ืชืจ ื™ื“ืข ื–ื” ืœื ืžืกืคื™ืง ื‘ืฉื‘ื™ืœ ืœืขืฉื•ืช ืื ืฉื™ื ื—ื›ืžื™ื ื™ื•ืชืจ.

ToCode
1 418
ืžื•ืจื™ื ื‘ืขื™ื“ืŸ ื” Chat GPT ืžื‘ื—ื™ื ืช ืชืคืงื™ื“ ื”ืžื•ืจื” Chat GPT ืจืง ื—ื™ื–ืง ืชื”ืœื™ื›ื™ื ืฉื›ื‘ืจ ื”ื™ื• ืœืคื ื™ื•: ื›ืœ ื”ื™ื“ืข ืžืžื™ืœื ืงื™ื™ื ื‘ืจืฉืช, ืœื›ืœ ืฉืืœื” ื™ืฉ ื›ื‘ืจ ืชืฉื•ื‘ื•ืช ืžืฆื•ื™ื ื•ืช ื•ื”ืกื‘ืจื™ื ืžื“ื•ื™ืงื™ื, ื•ืขื›ืฉื™ื• ืืคืฉืจ ืืคื™ืœื• ืœืฉืื•ืœ ื›ืฉืœื ืžื‘ื™ื ื™ื ื•ืœืงื‘ืœ ื”ืกื‘ืจ ืžื•ืชืื ืื™ืฉื™ืช. ืื– ืžื” ื ืฉืืจ ืœืžื•ืจื™ื ืœืขืฉื•ืช? ื”ื ื” ืฉืœื•ืฉ ืžืฉื™ืžื•ืช ื—ืฉื•ื‘ื•ืช: 1. ืœืงื‘ื•ืข ืืช ื”ืชืคืจื™ื˜ - ืžืกืชื‘ืจ ืฉืื™ืŸ ื“ืจืš ืื—ืช ืœืœืžื“ React (ืื• ื›ืœ ื ื•ืฉื ืื—ืจ). ืžื•ืจื™ื ืฉื•ื ื™ื ื™ื•ื›ืœื• ืœื‘ื ื•ืช ืชื•ื›ื ื™ื•ืช ืœื™ืžื•ื“ื™ื ืฉื•ื ื•ืช, ื›ืœื•ืžืจ ื™ื‘ื—ืจื• ืืช ื”ื ื•ืฉืื™ื ื•ืกื“ืจ ื”ื ื•ืฉืื™ื ืฉืขืœื™ื ื• ืœืœืžื•ื“. ื›ืŸ ื™ืฉ ื”ื›ืœ ื‘ืื™ื ื˜ืจื ื˜, ืื‘ืœ ื”ืœื™ืžื•ื“ ื”ื•ื ื”ืจื‘ื” ื™ื•ืชืจ ื™ืขื™ืœ ื›ืฉืžื™ืฉื”ื• ืขื•ื–ืจ ืœื™ ืœื‘ื—ื•ืจ ืžื” ื”ื“ื‘ืจ ื”ื‘ื ืฉืฆืจื™ืš ืœื“ืขืช. 2. ืœื–ื”ื•ืช ื˜ืขื•ื™ื•ืช - ืื ื™ ื™ื•ื“ืข ืœืฉืื•ืœ ืืช Chat GPT ืžื” ืืคืฉืจ ืœืฉืคืจ ื‘ืงื•ื“ ืฉื›ืชื‘ืชื™, ื•ืœืคืขืžื™ื ื™ื”ื™ื• ืœื• ืขืฆื•ืช ื˜ื•ื‘ื•ืช ืื‘ืœ ื”ื•ื ืจื—ื•ืง ืฉื ื•ืช ืื•ืจ ืžืœื”ื‘ื™ืŸ ืืช ื”ืฆืจื›ื™ื ื”ืืžื™ืชื™ื™ื ืฉืœื™ ื•ืœื–ื”ื•ืช ืคืขืจื™ ื”ื‘ื ื”. ืื ื™ ืฆืจื™ืš ืžื•ืจื” ืฉื™ืขื–ื•ืจ ืœื™ ืœืฉื™ื ืœื‘ ื›ืฉืื ื™ ืขื•ืฉื” ื“ื‘ืจื™ื ืœื ื‘ืกื“ืจ, ืžืชื•ืš ื”ื‘ื ื” ืฉืœ ืขื•ืœื ื”ืชื•ื›ืŸ ืฉืœื™ ื•ื”ืืชื’ืจื™ื ื”ืกืคืฆื™ืคื™ื™ื ื‘ืชื•ื›ื•. 3. ืœืชืช ืžื™ืœื” ื˜ื•ื‘ื” - ืื—ืจื™ ื”ื”ืชืœื”ื‘ื•ืช ื”ืจืืฉื•ื ื™ืช ืœื™ืžื•ื“ ื“ื•ืจืฉ ื”ืชืžื“ื” ืœืื•ืจืš ื–ืžืŸ. ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœื”ืชืžื™ื“ ื›ืฉืื ื—ื ื• ืœื ืœื‘ื“, ื›ืฉื™ืฉ ืžื™ืฉื”ื• ืฉืžื—ื›ื” ืœืจืื•ืช ื›ืžื” ื”ืชืงื“ืžืชื™ ื”ืฉื‘ื•ืข ื•ื™ืฉืžื— ืื™ืชื™ ื›ืฉื“ื‘ืจื™ื ืžืฆืœื™ื—ื™ื (ืื• ื™ืขื•ื“ื“ ืื•ืชื™ ื›ืฉืื ื™ ืจื•ืฆื” ืœื•ื•ืชืจ). ื›ื›ืœ ืฉื ืงื“ื™ื ืœื”ื‘ื™ืŸ ืฉืื™ืŸ ืœื ื• ื‘ืขืœื•ืช ืขืœ ื”ื™ื“ืข ื ื•ื›ืœ ืœื”ืชืคื ื•ืช ืœืืชื’ืจื™ื ื”ืืžื™ืชื™ื™ื ืฉืœ ืžื•ืจื™ื ื‘ืžืื” ื”-21. ื›ื™ ืื ื™ืฉ ืžืฉื”ื• ืฉืœืžื“ื ื• ืžื”ืฉื ื™ื ื”ืื—ืจื•ื ื•ืช ื”ื•ื ืฉื™ื•ืชืจ ื™ื“ืข ื–ื” ืœื ืžืกืคื™ืง ื‘ืฉื‘ื™ืœ ืœืขืฉื•ืช ืื ืฉื™ื ื—ื›ืžื™ื ื™ื•ืชืจ.

ToCode
1 418
1. ื™ืฆื™ืจืช ืงื‘ืฆื™ ืœื•ื’ื™ืงื” ืœื’ื™ืฉื” ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื, ื‘ื“ืจืš ื›ืœืœ ืœื™ื“ ื”ื’ื“ืจืช ื”ืกื›ื™ืžื”. ืื ื™ ืื•ื”ื‘ ืืช ื“ืจื™ื–ืœ ื•ืืช kysely, ืขื‘ื“ืชื™ ืขื Sequelize ื‘ JavaScript (ืœืคื ื™ ื˜ื™ื™ืคืกืงืจื™ืคื˜) ื•ื’ื ื”ื™ื™ืชื™ ืžืจื•ืฆื”. ืืช TypeORM ืœื ืื”ื‘ืชื™. ืื‘ืœ ื‘ืกื•ืฃ ื–ื” ืจืง ืขื ื™ื™ืŸ ืฉืœ ื˜ืขื ื›ื•ืœื ื˜ื•ื‘ื™ื. 2. ื™ืฆื™ืจืช ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืฉืจืช ืฉืžื•ืฉื›ื•ืช ืืช ื”ืžื™ื“ืข ื•ื”ื•ืคื›ื•ืช ืื•ืชื• ืœ JSX. 3. ื™ืฆื™ืจืช ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืœืงื•ื— ืฉื™ืคืขื™ืœื• ืขื Server Actions ืืช ืงื‘ืฆื™ ื”ืœื•ื’ื™ืงื”. ื”ืืชื’ืจ ื”ืžืจื›ื–ื™ ืฉืขื“ื™ื™ืŸ ื ืฉืืจ ื‘ืื™ื ื˜ื’ืจืฆื™ื” ื”ื•ื ืœืงื—ืช ืืช ื”ืชื•ืฆืื” ืฉืœ ื” Server Action ื•ืœืขื“ื›ืŸ ืืช ื”ืžื™ื“ืข ืฉืขืœ ื”ืžืกืš. ื‘ื“ื•ื’ืžื” ืฉืœื™ ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืืช likesCount ื‘ืชื•ืจ ืกื˜ื™ื™ื˜ ื‘ืฉื‘ื™ืœ ืฉืื•ื›ืœ ืœืขื“ื›ืŸ ืื•ืชื•. ื’ื™ืฉื” ืื—ืจืช ืฉืจืื™ืชื™ ื–ื” ืœื”ืคืขื™ืœ refresh ื•ืœืชืช ืœืฉืจืช ืœืจื ื“ืจ ืžื—ื“ืฉ ืืช ื” Server Components ืขื ื”ืžื™ื“ืข ื”ืžืขื•ื“ื›ืŸ.

ToCode
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 ืขื ื‘ืกื™ืก ื ืชื•ื ื™ื ื”ื ื‘ืกืš ื”ื›ืœ:

ToCode
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 ืฉืžืชื—ื™ืœ ืขื ื”ืขืจืš ืฉื”ื’ื™ืข ืžื”ืฉืจืช ืื‘ืœ ื™ื•ื›ืœ ืœื”ืฉืชื ื•ืช ื‘ืขืงื‘ื•ืช ืœื—ื™ืฆื” ืขืœ ื›ืคืชื•ืจื™ื.

ToCode
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)

ToCode
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 ื‘ืฆื“ ืฉืจืช ื•ื”ื›ืœ ื‘ืกื“ืจ. ื ืงืกื˜ ื”ื•ื ืœื ื”ื“ืจืš ื”ื™ื—ื™ื“ื” ืื• ืืคื™ืœื• ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ ืœื‘ื ื•ืช ื™ื™ืฉื•ืžื™ ืจื™ืืงื˜. ื›ืŸ ื”ื•ื ืžืกืคืง ืคื™ืชืจื•ืŸ ืœืกื•ื’ ืžืกื•ื™ื ืฉืœ ื™ื™ืฉื•ืžื™ื ื•ืื™ื ื˜ื’ืจืฆื™ื” ื˜ื•ื‘ื” ื‘ื™ืŸ ืฆื“ ืœืงื•ื— ื•ืฆื“ ืฉืจืช, ืื‘ืœ ื™ื—ื“ ืขื ื–ืืช ื›ืฉืฆืจื™ืš ืœื‘ื—ื•ืจ ื‘ื™ืŸ ื—ื™ื“ื•ืฉื™ื ืœื™ืฆื™ื‘ื•ืช ื‘ื ืงืกื˜ ืžืขื“ื™ืคื™ื ืืช ื”ื—ื™ื“ื•ืฉื™ื, ื•ื–ื• ืœื ื‘ื—ื™ืจื” ืฉืžืชืื™ืžื” ืœื›ืœ ืื—ื“.