uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
-27 kunlar
-530 kunlar
Postlar arxiv
ToCode
1 419
ืœืคืขืžื™ื ื›ืคืœ ืงื•ื“ ื“ื•ื•ืงื ื™ื›ื•ืœ ืœื”ื™ื•ืช ื™ื•ืชืจ ืงืจื™ื ื‘ื•ืื• ื ืจืื” ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ืž vue ืœืฆืžืฆื•ื ื›ืคืœ ืงื•ื“ ื•ืื– ื ื ืกื” ืœืจืื•ืช ืžื” ื“ืขืชื ื• ืขืœ ื”ืฉื™ื ื•ื™. ืื ื™ ืžืชื—ื™ืœ ืขื ืžืฉืชื ื” ื‘ืฉื seconds ื•ืฉื ื™ ืžืฉืชื ื™ื ืžื—ื•ืฉื‘ื™ื ื‘ืฉื minutes ื• hours:
const seconds = ref(0);
const minutes = computed(() => {
  get() { return seconds / 60},
  set(minutes) { seconds.value = minutes * 60}
});
const hours = computed(() => {
  get() { return hours / 3600},
  set(hours) {seconds.value = hours * 3600}
})
ื•ืื– ืื ื™ ืฉื ืœื‘ ืฉ minutes ื• hours ื‘ืขืฆื ื—ื•ืฉื‘ื• ื‘ืื•ืชื” ืฆื•ืจื” ืื– ืื ื™ ืžืืจื’ืŸ ืžื—ื“ืฉ ืืช ื”ืงื•ื“:
function deriveTime(start: Ref<number>, factor: number) {
  return computed({
    get() { return Number((start.value / factor).toFixed(2)) },
    set(newValue) { start.value = newValue * factor }
  })
}

const seconds = ref(0);
const minutes = deriveTime(seconds, 60);
const hours = deriveTime(seconds, 3600);
ื™ื•ืชืจ ืžื–ื”, ืžืื—ืจ ื• deriveTime ืœื ื‘ืืžืช ืงืฉื•ืจื” ืœืงื•ืžืคื•ื ื ื˜ื” ืื ื™ ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ืื•ืชื” ืœืงื•ื‘ืฅ ืื—ืจ ื•ืื– ื™ืฉ ืœื™ ืจืง:
const seconds = ref(0);
const minutes = deriveTime(seconds, 60);
const hours = deriveTime(seconds, 3600);
ื•ื”ืฉืืœื” - ืื™ื–ื” API ื˜ื•ื‘ ื™ื•ืชืจ? ื›ืžื” ืžื—ืฉื‘ื•ืช: 1. ื”ืคื•ื ืงืฆื™ื” deriveTime ืžืฉื ื” ื”ืชื ื”ื’ื•ืช. ื‘ื–ื” ืฉื”ื™ื ืžื—ื‘ื™ืื” ืงืจื™ืื” ืœ computed ื”ื™ื ืžื—ื–ื™ืงื” ื‘ืชื•ื›ื” ืžื˜ืขืŸ ืกืžื ื˜ื™ ืžืฉืžืขื•ืชื™. ื›ืœ ืžื™ ืฉื™ืงืจื ืืช ื”ืงื•ื“ ื™ืฆื˜ืจืš ืœื“ืขืช ืฉืคื•ื ืงืฆื™ื” ื–ื• ืžื—ื–ื™ืจื” ืขืจืš ืžื—ื•ืฉื‘ ื•ืฉื•ืžืจืช ืขืœ ืจื™ืืงื˜ื™ื‘ื™ื•ืช, ื•ืฉืืช ื”ืขืจืš ื”ืžื—ื•ืฉื‘ ื”ื–ื” ืืคืฉืจ ื’ื ืœืฉื ื•ืช. 2. ื‘ืžื™ืœื™ื ืื—ืจื•ืช ื”ื—ื•ื–ื” ืฉืœ ืคื•ื ืงืฆื™ื™ืช deriveTime ืขื ื”ืงื•ื“ ื”ื—ื™ืฆื•ื ื™ ื›ื•ืœืœ ื™ื•ืชืจ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ืžืžื” ืฉืจื•ืื™ื ื‘ืจืฉื™ืžืช ื”ืคืจืžื˜ืจื™ื. 3. ืื ื”ืคื•ื ืงืฆื™ื” ื ืžืฆืืช ื‘ืฉื™ืžื•ืฉ ื‘ื”ืจื‘ื” ืžืงื•ืžื•ืช ื‘ืงื•ื“ ื”ืžืขืจื›ืช ื™ืฉ ื”ื’ื™ื•ืŸ ืœื”ื•ืกื™ืฃ ืœื” ืืช ื”ืžื˜ืขืŸ ื”ืกืžื ื˜ื™ ื”ื–ื”. ืžืžื™ืœื ื›ืœ ืžื™ ืฉื™ืงืจื ืืช ื”ืงื•ื“ ืฆืคื•ื™ ืœื”ื›ื™ืจ ืื•ืชื”. ื›ื›ืœ ืฉื”ื™ื ืคื—ื•ืช ื ืžืฆืืช ื‘ืฉื™ืžื•ืฉ ื”ื™ื ืขืœื•ืœื” ืœื‘ืœื‘ืœ. 4. ืคื™ืชืจื•ืŸ ื˜ื•ื‘ ื™ื”ื™ื” ืœื”ื•ืกื™ืฃ ืชื™ืขื•ื“ ื‘ืืชืจ ื”ืงืจื™ืื” ืฉืžืกื‘ื™ืจ ืžื” ืงื•ืจื” ืคื”, ืžืฉื”ื• ื›ื–ื”:
const seconds = ref(0);
// create reactive modifiable computed refs for other time units:
const minutes = deriveTime(seconds, 60);
const hours = deriveTime(seconds, 3600);
ืžืฆื“ ืฉื ื™ ื›ื›ืœ ืฉื”ื”ืกื‘ืจ ื‘ืชื™ืขื•ื“ ื™ื•ืชืจ ืืจื•ืš ืื•ืœื™ ืขื“ื™ืฃ ืœื”ื™ืฉืืจ ืขื ื”ืงื•ื“ ื”ืžืงื•ืจื™. ืคื™ืชืจื•ืŸ ื‘ื™ื ื™ื™ื ื ื•ืกืฃ ืฉื™ื›ื•ืœ ืœืขื–ื•ืจ ื›ืืŸ ื”ื•ื ืœื”ืขื‘ื™ืจ ืจืง ืืช ื™ืฆื™ืจืช ื”ืื•ื‘ื™ืงื˜ ืœืคื•ื ืงืฆื™ื” ืื‘ืœ ืœื”ืฉืื™ืจ ืืช ื”ืงืจื™ืื” ืœ computed ื‘ืืชืจ ื”ืงืจื™ืื” ื›ืœื•ืžืจ:
const seconds = ref(0);
const minutes = computed(deriveTime(seconds, 60));
const hours = computed(deriveTime(seconds, 3600));
ื›ืชื™ื‘ื” ื›ื–ืืช ืžืฉืื™ืจื” ืืช "ืžื™ืœืช ื”ืžืคืชื—" computed ื‘ืžืงื•ื ื‘ื•ืœื˜ ื•ื›ืš ืื ื—ื ื• ื™ื•ื“ืขื™ื ืžื” ืื ื—ื ื• ื™ื•ืฆืจื™ื. ืขื“ื™ื™ืŸ ื’ื ื’ื™ืจืกื” ื–ืืช ืžืกืชื™ืจื” ืืช ื”ืขื•ื‘ื“ื” ืฉื”ืื•ื‘ื™ืงื˜ ื›ื•ืœืœ ื’ื getter ื•ื’ื setter ื•ืœื›ืŸ ืืคืฉืจ ืœืฉื ื•ืช ืืช ื”ื“ืงื•ืช ื•ื”ืฉืขื•ืช. ื”ื•ืฆืืช ืงื•ื“ ืœืคื•ื ืงืฆื™ื” ื›ื“ื™ ืœืžื ื•ืข ื—ื–ืจื” ื”ื™ื ื”ืจื‘ื” ืคืขืžื™ื ืจืขื™ื•ืŸ ื˜ื•ื‘. ื”ื™ื ืžืืคืฉืจืช ืชื—ื–ื•ืงื” ื˜ื•ื‘ื” ื™ื•ืชืจ ืฉืœ ื”ืงื•ื“ ื•ืชื™ืงื•ืŸ ื‘ืขื™ื•ืช ืจืง ื‘ืžืงื•ื ืื—ื“. ืžืฆื“ ืฉื ื™ ื›ืฉืื ื—ื ื• ืžืกืชื™ืจื™ื ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื•ืช ืœื™ื‘ื” ืฉืœ ื”ืคืจื™ื™ืžื•ื•ืจืง ื‘ืชื•ืš ืคื•ื ืงืฆื™ื™ืช ืขื–ืจ ืฉืœื ื• ื”ืชื•ืฆืื” ืขืœื•ืœื” ืœื”ื™ื•ืช ืงื•ื“ ืžื‘ืœื‘ืœ ื™ื•ืชืจ ื•ืจืง ืœื”ืงืฉื•ืช ืขืœ ื”ืชื—ื–ื•ืงื”. ืžื” ื“ืขืชื›ื? ื‘ืžืฆื‘ ื›ื–ื” ื”ื™ื™ืชื ืžืฉืชืžืฉื™ื ื‘ืคื•ื ืงืฆื™ื™ืช ืขื–ืจ, ื ืฉืืจื™ื ืขื ื”ืงื•ื“ ื”ื›ืคื•ืœ ืื• ื‘ื•ื—ืจื™ื ืคื™ืชืจื•ืŸ ืื—ืจ?

ToCode
1 419
ืžืฉื—ืงื™ื ืขื Embeddings ื—ื•ืฅ ืžืฉื™ื—ื•ืช, ChatGPT ื’ื ื™ื•ื“ืข ืœื—ืฉื‘ ืžืฉื”ื• ืฉื ืงืจื Embedding ืœื›ืœ ื˜ืงืกื˜ ืฉื ื™ืชืŸ ืœื•. ืืžื‘ื“ื™ื ื’ ื–ื” ื‘ืขืฆื ื•ืงื˜ื•ืจ ืฉืœ ืžืกืคืจื™ื ืฉืžื™ื™ืฆื’ ืื™ืคื” ื‘ืžื•ื— ืฉืœ ChatGPT ื”ื˜ืงืกื˜ ื”ื–ื” ื™ื•ืฉื‘, ื›ื™ ืืคืฉืจ ืœื“ืžื™ื™ืŸ ืืช ื”ืžื•ื— ืฉืœ ChatGPT ื‘ืชื•ืจ ืžืจื—ื‘ ืจื‘ ืžื™ืžื“ื™ ืฉืœ ื˜ืงืกื˜ื™ื. ื‘ืขื–ืจืช ื•ืงื˜ื•ืจ ื›ื–ื” ืืคืฉืจ ืœืคืขืžื™ื ืœืžืฆื•ื ื“ื‘ืจื™ื ืฉืงืฉื•ืจื™ื ืื—ื“ ืœืฉื ื™, ื›ื™ ื”ื ื›ื ืจืื” ื™ื”ื™ื• "ืงืจื•ื‘ื™ื" ื‘ืื•ืชื• ืžืจื—ื‘ ืจื‘ ืžื™ืžื“ื™. ื‘ืคื•ืกื˜ ื”ื™ื•ื ื”ืœื›ืชื™ ืœื ืกื•ืช ืœื—ืฉื‘ Embeddings ื•ืœืจืื•ืช ืื ื–ื” ื™ืขื–ื•ืจ ืœื™ ืœื–ื”ื•ืช ืคื•ืกื˜ื™ื ืžื”ื‘ืœื•ื’ ืฉืงืฉื•ืจื™ื ืœืคื•ืกื˜ ืžืกื•ื™ื. ื”ืžืกืงื ื” ืื™ื ื” ื—ื“ ืžืฉืžืขื™ืช ืื‘ืœ ืื ื™ ืžืงื•ื•ื” ืฉื”ื“ืจืš ืชื”ื™ื” ืžืขื ื™ื™ื ืช. ืื™ืš ืžื—ืฉื‘ื™ื Embedding ื”ืจืขื™ื•ืŸ ื”ืจืืฉื•ืŸ ื•ื”ื•ื ืžืื•ื“ ืคืฉื•ื˜ ื–ื” ืฉื‘ืฉื‘ื™ืœ ืœื—ืฉื‘ Embedding ืจืง ืฆืจื™ืš ืœืฉืœื•ื— ื˜ืงืกื˜ ืœืžื•ื“ืœ ืฉืคื” ื’ื“ื•ืœ, ื‘ืžืงืจื” ืฉืœื ื• ืœ ChatGPT. ืื ื™ ื‘ืจื•ื‘ื™ ืื– ืœืงื—ืชื™ ืกืคืจื™ื” ืฉื ืงืจืืช ruby-openai ื•ื”ืฉืชืžืฉืชื™ ื‘ืงื•ื“ ืฉื ืจืื” ื›ื›ื”:
response = client.embeddings(
  parameters: {
    model: "text-embedding-3-large",
    input: "The food was delicious and the waiter..."
  }
)

puts response.dig("data", 0, "embedding")
ื‘ืฉื‘ื™ืœ ืœื—ืฉื‘ Embeddings ืขืœ ืคื•ืกื˜ื™ื ื”ืคืขืœืชื™ ืืช ื”ืงื•ื“ ื”ื‘ื ืขืœ 100 ื”ืคื•ืกื˜ื™ื ื”ืื—ืจื•ื ื™ื ืฉืคืจืกืžืชื™:
sources = blogPost.last(100).map(&:markdown_source)

embeddings2 = sources.map do |s|
  client.embeddings(parameters: {model: "text-embedding-3-large", input: s })
end
ื•ืื—ืจื™ ื”ืžืชื ื” ืงืฆืจื” ืงื™ื‘ืœืชื™ ืžืขืจืš ืฉืœ 100 ืืžื‘ื“ื™ื ื’ืก ืขื‘ื•ืจ 100 ืคื•ืกื˜ื™ื ืื—ืจื•ื ื™ื ืžื”ื‘ืœื•ื’. ืžืจื—ืง ื‘ื™ืŸ Embeddings ืจืื™ืชื™ ื‘ืจืฉืช ื›ืœ ืžื™ื ื™ ื“ืจื›ื™ื ืœื—ืฉื‘ ืžืจื—ืงื™ื ื‘ื™ืŸ Embeddings ืื‘ืœ ื ืฉืžืข ืฉื”ืคื•ืคื•ืœืจื™ืช ื‘ื™ื•ืชืจ ืœืžืฆื•ื ื“ื‘ืจื™ื ืฉืงืฉื•ืจื™ื ืื—ื“ ืœืฉื ื™ ื ืงืจืืช cosine similarity. ื”ืœื›ืชื™ ืœ ChatGPT ื•ื‘ื™ืงืฉืชื™ ืžืžื ื• ืฉื™ื›ืชื•ื‘ ืœื™ ืคื•ื ืงืฆื™ื” ื‘ืจื•ื‘ื™ ืœื—ืฉื‘ ืืช ื–ื” ื‘ื™ืŸ ืฉื ื™ ื•ืงื˜ื•ืจื™ื:
def cosine_similarity(vec1, vec2)
  dot_product = vec1.zip(vec2).map { |a, b| a * b }.sum
  magnitude1 = Math.sqrt(vec1.map { |v| v**2 }.sum)
  magnitude2 = Math.sqrt(vec2.map { |v| v**2 }.sum)

  dot_product / (magnitude1 * magnitude2)
end
ื”ืชื•ืฆืื•ืช ืขื›ืฉื™ื• ื ืฉืืจ ืจืง ืœืฉื—ืง ืขื ื”ืžืกืคืจื™ื. ืœื“ื•ื’ืžื” ืœืงื—ืชื™ ืืช ื”ืคื•ืกื˜ ื”ืื—ืจื•ืŸ ืฉืคื™ืจืกืžืชื™ (ื ื™ืกื•ื™ ื›ืชื™ื‘ืช Directives ื‘ืจื™ืืงื˜) ื•ื—ื™ืคืฉืชื™ ืื™ื–ื” Embeddings ื”ื™ื• ื™ื—ืกื™ืช ืงืจื•ื‘ื™ื ืืœื™ื•, ื›ืœื•ืžืจ ื‘ืžืจื—ืง ื’ื“ื•ืœ ืž 0.5:
distances = embeddings2.map {|i| cosine_similarity(embeddings2[-1]["data"][0]["embedding"], i["data"][0]["embedding"])
 }
 
distances.each_index.select {|i| distances[i] > 0.5 } 
ื”ืชื•ืฆืื” ื›ืœืœื” ื“ื™ ื”ืจื‘ื” ืคื•ืกื˜ื™ื: 1. ืื™ืš ืขื•ื‘ื“ ืคืจื•ื™ืงื˜ Rails ืขื ESBuild 2. ืื– OpenAI ืขื‘ืจื• ืœืจืžื™ืงืก 3. ื—ืžืฉ ื“ืงื•ืช ืขื flet 4. ื ื™ืกื•ื™ ื“ื™ื ื• - ืžื” ืืคืฉืจ ืœืขืฉื•ืช ื”ื™ื•ื ืขื Deno ื• next.js 5. ื ื™ืกื•ื™ ืจื™ื™ืœืก: ืžืฉื—ืง ืื™ืงืก ืขื™ื’ื•ืœ 6. ื”ืฉืชืžืฉื• ื‘ืื™ื–ื” ืกืคืจื™ื•ืช ืฉืชืจืฆื• 7. ื˜ื™ืค LLM - ืื™ืš ื–ื” ืขื•ื‘ื“ ื‘ X ? 8. ืจื™ืืงื˜ ืื• Vue - ื”ื“ื’ืžื” ื“ืจืš ื”ื•ืง ืงืฆืจ 9. ื•ืื– ื–ื” ื ื’ืžืจ 10. ื ื™ืกื•ื™ React - ื•ืื ื”ื™ื• Directives? ืื ืžื—ืคืฉื™ื ืจืง ืคื•ืกื˜ื™ื ืฉื”ืžืจื—ืง ืฉืœื”ื ื’ื“ื•ืœ ืž 0.6 ืžืงื‘ืœื™ื ืจืง ืืช ื”ืคื•ืกื˜ ื”ืžืงื•ืจื™ ื•ืืช "ืจื™ืืงื˜ ืื• Vue - ื”ื“ื’ืžื” ื“ืจืš ื”ื•ืง ืงืฆืจ". ืฉื–ื” ื™ื•ืชืจ ื”ื’ื™ื•ื ื™ ื›ื™ ืžื“ื•ื‘ืจ ืขืœ ืฉื ื™ ืคื•ืกื˜ื™ื ืฉืžืฉื•ื•ื™ื ื‘ื™ืŸ ืจื™ืืงื˜ ืœ Vue ืžื–ื•ื•ื™ื•ืช ืฉื•ื ื•ืช. ืื—ืจื™ ื–ื” ืœืงื—ืชื™ ืืช ื”ืคื•ืกื˜ "ื ื™ืกื•ื™ ื“ื™ื ื• - ืžื” ืืคืฉืจ ืœืขืฉื•ืช ื”ื™ื•ื ืขื Deno ื• next.js" ื•ื—ื™ืคืฉืชื™ ื‘ืื•ืชื” ืฉื™ื˜ื” ืคื•ืกื˜ื™ื ืงืฉื•ืจื™ื. ื”ื’ืขืชื™ ืœ: 1. ื” Killer Feature ื”ื—ื“ืฉ ืฉืœ node.js (ืื•: ื”ืื ื–ื” ื”ืกื•ืฃ ืฉืœ ื“ื™ื ื•?) 2. ื”ื•ื ื• ื”ื•ื ื›ืœ ืžื” ืฉืจืฆื™ืชื™ ืž express 3. ืื– OpenAI ืขื‘ืจื• ืœืจืžื™ืงืก 4. ื“ื•ื’ืžืช ื“ื™ื ื•: ืฉืžื™ืจืช ืชืžื•ื ื•ืช ืžื•ื™ืงื™ืคื“ื™ื” ืฉื–ื” ื›ื‘ืจ ื“ื™ ืžื•ืฆืœื—. ื”ืฆืขื“ ื”ื‘ื ืขื›ืฉื™ื• ืฉื”ืชืฉืชื™ืช ื‘ืžืงื•ื ืืคื™ืœื• ืื ืœื ืžื•ืฉืœืžืช ืื ื™ ืžืงื•ื•ื” ืœืงื—ืช ืืช ื–ื” ืฆืขื“ ื ื•ืกืฃ ืงื“ื™ืžื” ื•ืœื”ืชื—ื™ืœ ืœื—ืฉื‘ Embeddings ืฉืœ ืคื•ืกื˜ื™ื ื›ืฉืื ื™ ืžืขืœื” ืื•ืชื ืœืืชืจ ื•ืœืฉืžื•ืจ ื‘ DB, ื•ื’ื ืœื”ืจื™ืฅ ื—ื™ืฉื•ื‘ ืžืจื•ื›ื– ืขืœ ื›ืœ ื”ืคื•ืกื˜ื™ื ืฉื›ื‘ืจ ืคื™ืจืกืžืชื™ (ืœืคื—ื•ืช ื‘ืฉื ื” ื”ืื—ืจื•ื ื”). ืื—ืจื™ ืฉื–ื” ื™ื”ื™ื” ื‘ืžืงื•ื ืืคืฉืจ ื™ื”ื™ื” ืœื”ื•ืกื™ืฃ ืงื•ืคืกืช "ืคื•ืกื˜ื™ื ืงืฉื•ืจื™ื". ืขื“ื™ื™ืŸ ืœื ื‘ืจื•ืจ ืื ื–ื” ื™ืขื‘ื•ื“, ืื‘ืœ ื”ื ื™ืกื•ื™ ื”ื™ื•ื ื”ืจืื” ืฉื™ืฉ ืกื™ื›ื•ื™.

ToCode
1 419
ื ื™ืกื•ื™ React - ื•ืื ื”ื™ื• Directives? ืื—ื“ ื”ืžื ื’ื ื•ื ื™ื ื”ื—ืžื•ื“ื™ื ืฉืœ Vue ื”ื•ื ื” Directives ืฉืžืืคืฉืจื™ื ืœื›ืชื•ื‘ ืคื—ื•ืช ืงื•ื“ ื‘ืงื•ื“ ื”ืชื‘ื ื™ืช ื•ืœืงื—ืช ื—ืœืงื™ื ืฉืœ ืงื•ื“ ืฉืžืฉืคื™ืขื™ื ืขืœ ื” DOM ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ื”ื ื‘ื›ืžื” ืžืงื•ืžื•ืช. ื‘ืฉื‘ื™ืœ ื”ืžืฉื—ืง ื‘ื•ืื• ื ื ืกื” ืœื‘ื ื•ืช ืžืฉื”ื• ื“ื•ืžื” ื‘ืจื™ืืงื˜. ืžื” ื–ื” Directives ืื—ืช ื”ืชื›ื•ื ื•ืช ืฉืื ืฉื™ื ืื•ื”ื‘ื™ื ื‘ Vue ื”ื™ื ื” Directives. ื‘ืงืฆืจื” ื–ืืช ื”ื™ื›ื•ืœืช ืœื›ืชื•ื‘ ืžืืคื™ื™ืŸ ื‘ืชื•ืš ืืœืžื ื˜ ื•ืœืงื‘ืœ ื”ืชื ื”ื’ื•ืช ืžืกื•ื™ืžืช ืขื‘ื•ืจ ื”ืžืืคื™ื™ืŸ ื”ื–ื”. ืœื“ื•ื’ืžื”:
<p v-if="seen">Now you see me</p>
ื”ืžืืคื™ื™ืŸ v-if ื”ื•ื ืžืืคื™ื™ืŸ ืžื™ื•ื—ื“ ืžืกื•ื’ ื–ื”. ื”ื•ื ื›ื•ืœืœ "ืงื•ื“" ืฉืจืฅ ื›ืœ ืคืขื ืฉืฆืจื™ื›ื™ื ืœืจื ื“ืจ ืืช ื”ืืœืžื ื˜ ื•ื”ืงื•ื“ ื”ื–ื” ื™ื›ื•ืœ ืœืฉื ื•ืช ืืช ื”ืืœืžื ื˜ ืื• ืืคื™ืœื• ืœื”ื•ืฆื™ื ืื•ืชื• ืœื’ืžืจื™ ืžื”ืขืฅ. ื‘ื“ื•ื’ืžื” ืฉืœ v-if ืื ื”ืžืฉืชื ื” seen ื”ื•ื ืืžื™ืชื™ ื”ืืœืžื ื˜ ื™ื•ืคื™ืข ื•ืื ื”ื•ื "ืฉืงืจ" ืื– ื”ืืœืžื ื˜ ืœื ื™ื•ืคื™ืข. ื”ื ืขื•ืฉื™ื ื”ืžื•ืŸ ื“ื‘ืจื™ื ืขื Directives ื‘ Vue ืื‘ืœ ืžื” ืฉื—ืฉื•ื‘ ืœืงื—ืช ืžื›ืืŸ ื–ื”: 1. ื“ื™ืจืงื˜ื™ื‘ืก ืžืืคืฉืจื™ื ืœื”ืฉืคื™ืข ืขืœ ืงื•ืžืคื•ื ื ื˜ื” ืžื‘ื—ื•ืฅ, ื‘ืœื™ ืงืฉืจ ืœืงื•ื“ ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ืขืฆืžื” (ืœื ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื’ืขืช ื‘ืงื•ื“ ืฉืœ p ื‘ืฉื‘ื™ืœ ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœื”ื•ืกื™ืฃ ืœื• v-if). 2. ืืคืฉืจ ืœื”ื•ืกื™ืฃ ื“ื™ืจืงื˜ื™ื‘ืก ืœื›ืœ ืงื•ืžืคื•ื ื ื˜ื”. 3. ื“ื™ืจืงื˜ื™ื‘ ื”ื•ื ื—ืœืง ืžืงื•ื“ ื”ืงื•ืžืคื•ื ื ื˜ื” ืฉืœื ื›ืชื•ื‘ ื‘ืชื•ื›ื” ื•ืžืชื•ื•ืกืฃ ืื• ืžื•ืกืจ ื‘ืฆื•ืจื” ืฉืœ ื”ืจื›ื‘ื”. ื—ืœื•ืžื•ืช ื‘ืจื™ืืงื˜ ืื– ื”ืœื›ืชื™ ืœื ืกื•ืช ืœื›ืชื•ื‘ ืžืฉื”ื• ื“ื•ืžื” ื‘ืจื™ืืงื˜, ืœืคื—ื•ืช ืืช ื”ืจืขื™ื•ืŸ. ื”ืชื—ืœืชื™ ืžื”ืงื•ื“ ื”ื‘ื ืœืงื•ืžืคื•ื ื ื˜ื” ื”ืจืืฉื™ืช App:
function App() {
  const [count, setCount] = useState(0)

  return (
    <>
      <div>        
        <Text v-if={count % 2 == 0}></Text>        
        <Text v-highlight={true} v-if={count % 2 == 0}></Text>
        <button onClick={() => setCount(c => c+1)}>{count}</button>
      </div>
    </>
  )
}
ื•ื›ื‘ืจ ืคื” ืื ื™ ืžื‘ื™ืŸ ืืช ื”ืžื’ื‘ืœื•ืช ืฉืœื™. ืื™ืŸ ืœื™ ืื™ืš ืœื”ืฉืคื™ืข ืขืœ ืงื•ืžืคื•ื ื ื˜ื•ืช ื›ืžื• p ืื• div ืื• ื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ืžื•ื‘ื ื™ืช ืื—ืจืช ื‘ืจื™ืืงื˜. ื”ื“ื‘ืจื™ื ื”ื™ื—ื™ื“ื™ื ืฉืื ื™ ื™ื›ื•ืœ ืœื”ืฉืคื™ืข ืขืœื™ื”ื ื”ื ืงื•ืžืคื•ื ื ื˜ื•ืช ืฉืื ื™ ื‘ื•ื ื”, ื•ืœื›ืŸ ื‘ืฉื‘ื™ืœ ืœื ืกื•ืช ืœื›ืชื•ื‘ Directives ื™ืฆืจืชื™ ืงื•ืžืคื•ื ื ื˜ื” ื‘ืฉื Text ืฉืžืฆื™ื’ื” ื˜ืงืกื˜. ืื ื™ ื’ื ื™ื•ื“ืข ืฉื‘ืฉื‘ื™ืœ ืœื”ื•ืกื™ืฃ ืชืžื™ื›ื” ืœ Directives ืฆืจื™ืš ืœื”ื™ื›ื ืก ืœืงื•ื“ ื”ืงื•ืžืคื•ื ื ื˜ื”, ืื‘ืœ ืื ื™ ืœื ืจื•ืฆื” ืœืขืฉื•ืช ืืช ื–ื” ืœื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ื‘ืžืขืจื›ืช ืœื›ืŸ ื™ืฆืจืชื™ ืคื•ื ืงืฆื™ื” ืฉืขื•ื˜ืคืช ื”ื’ื“ืจื” ืฉืœ ืงื•ืžืคื•ื ื ื˜ื•ืช:
const Text = directify((props) => {
  return <p>Hello World</p>
});
ื›ืœ ืขื•ื“ ืื ื™ ืžื’ื“ื™ืจ ืงื•ืžืคื•ื ื ื˜ื•ืช ืขื ื”ืคื•ื ืงืฆื™ื” directify ืืคืฉืจ ื™ื”ื™ื” ืœื”ื•ืกื™ืฃ ืœื”ืŸ Directives. ืงื•ื“ ื”ืคื•ื ืงืฆื™ื” ื”ื•ื ื“ื™ ืคืฉื•ื˜ ื›ื™ ื–ื” ืจืง ืคื•ืกื˜ ื‘ื‘ืœื•ื’, ื›ืžื•ื‘ืŸ ืฉืื ืชืจืฆื• ืœืงื—ืช ืืช ื”ืจืขื™ื•ืŸ ื”ื–ื” ืœืžื ื’ื ื•ืŸ ืืžื™ืชื™ ืชืฆื˜ืจื›ื• ืœื—ืฉื•ื‘ ืงืฆืช ื™ื•ืชืจ ืœืขื•ืžืง ืขืœ ืกื“ืจ ืคืขื•ืœื•ืช ื•ืžืชื™ ืžืคืขื™ืœื™ื ืืช ืงื•ื“ ื” Directive. ื‘ื™ื ืชื™ื™ื ื›ืชื‘ืชื™ ืืช ื–ื”:
export const Directives = {};

export function directify(c) {
  return (props) => {    
    let el = c(props);
    for (const [directiveName, directive] of Object.entries(Directives)) {
      if (directiveName in props) {
        if (el) {
          el = directive(el, props[directiveName]);          
        } else return el;
      }
    }
    return el;
  }
}
ื”ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช ืงื•ืžืคื•ื ื ื˜ื”, ืžืคืขื™ืœื” ืื•ืชื” ื•ืžืขื‘ื™ืจื” ืืช ื”ืชื•ืฆืื” ืœ Directives. ืœื™ื“ ื”ืคื•ื ืงืฆื™ื” ื™ืฉ ืื•ื‘ื™ื™ืงื˜ ื’ืœื•ื‘ืืœื™ ืฉืœ Directives. ื” Directives ืขืฆืžืŸ ื‘ืื•ื‘ื™ื™ืงื˜ ื”ื’ืœื•ื‘ืืœื™ ื ืจืื•ืช ื›ืš:
Directives['v-if'] = (el, value) => {
  if (value) {
    return el;
  } else {
    return false;
  }
}

Directives['v-highlight'] = (el, value) => {
  return cloneElement(el, {
    style: {
      ...(el.props.style),
      backgroundColor: 'yellow',
    }
  })
}
ืื– ื›ืŸ ื–ื” ืขื•ื‘ื“, ืื‘ืœ ืฆืจื™ืš ืขื•ื“ ื”ืจื‘ื” ืขื‘ื•ื“ื”. ืืคื™ืœื• ื‘ื“ื•ื’ืžื” ื”ืงื˜ื ื” ืฉืœ ื” v-if ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืฉ v-if ืืžื•ืจ ืœืจื•ืฅ ืœืคื ื™ ืฉืžืจื ื“ืจื™ื ืืช ื”ืืœืžื ื˜ ื•ืื ื”ื•ื ืžื—ื–ื™ืจ false ืื– ืœื ืฆืจื™ืš ืœืจื ื“ืจ ืืช ื”ืืœืžื ื˜ ื‘ื›ืœืœ. ืžืฆื“ ืฉื ื™ v-highlight ืขื•ื‘ื“ ื™ื—ืกื™ืช ื‘ืกื“ืจ. ืื ื™ ืœื ื‘ื˜ื•ื— ืื™ืš ืœื“ืžื™ื™ืŸ ืืช v-for ืื‘ืœ ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืชืจื’ื™ืœ ืžืขื ื™ื™ืŸ. ื”ื—ื™ืกืจื•ืŸ ื”ื›ื™ ื’ื“ื•ืœ ื”ื•ื ืฉืื™ ืืคืฉืจ ืœื”ื•ืกื™ืฃ Directives ื‘ื“ืจืš ื”ื–ืืช ืœืืœืžื ื˜ื™ื ื”ืžื•ื‘ื ื™ื ื‘ืจื™ืืงื˜, ืœื›ืŸ ื ืฆื˜ืจืš ื’ื ืœื™ืฆื•ืจ ื’ื™ืจืกื” "ืชื•ืžื›ืช Directives" ืฉืœ ื›ืœ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื”ืžื•ื‘ื ื•ืช. ืกืคืจื™ื” ืžืขื ื™ื™ื ืช ืฉื”ืœื›ื” ื‘ื›ื™ื•ื•ืŸ ื”ื–ื” ื”ื™ื react-directive. ืฉื ื”ื ื”ืชืžืงื“ื• ื‘ื”ื•ืกืคืช ืชืžื™ื›ื” ื‘ Directives ืœืืœืžื ื˜ div ื™ื—ื™ื“ ื•ืžื™ืžื•ืฉ ื” Directives ื”ืžื•ื‘ื ื™ื ื‘ืœื™ ืœื‘ื ื•ืช ืชืฉืชื™ืช ืœื”ืจื—ื‘ื” ืœ Directives ืฉืœื ื•.

ToCode
1 419
ื•ืื– ื–ื” ื ื’ืžืจ ืžื™ืฉื”ื• ื‘ืจื“ื™ื˜ ืฉืืœ- ื™ืฉ ืœื ื• ืืœืคื™ ื‘ื“ื™ืงื•ืช ืื ื–ื™ื ืœืคืจื•ื™ืงื˜ ืจื™ืืงื˜ ื•ืื ื™ ืจื•ืื” ืฉืื ื–ื™ื ื›ื‘ืจ ืœื ื ืชืžืš ื•ืจืง ื‘ื’ืœืœ ื”ื‘ื“ื™ืงื•ืช ืื ื—ื ื• ืชืงื•ืขื™ื ืขื ื’ื™ืจืกื” ื™ืฉื ื” ืฉืœ ืจื™ืืงื˜. ืžื” ืขื•ืฉื™ื? ื•ืื•ืชื” ืฉืืœื” ื—ื•ื–ืจืช ื›ืœ ื”ื–ืžืŸ ื•ื‘ืื™ื ืกื•ืฃ ื’ื™ืจืกืื•ืช ... ืžื” ืขื•ืฉื™ื ืขื ืืคืœื™ืงืฆื™ื™ืช ืื ื’ื•ืœืจ1? ืžื” ื™ืงืจื” ืขื ืืคืœื™ืงืฆื™ื™ืช ื” next.js ืฉืœื™ ื‘ืžืขื‘ืจ ืœ App Router? ืžื” ืขื•ืฉื™ื ืขื ื›ืœ ื”ืงืœืืกื™ื ื›ืฉื™ืฆืื• React Hooks? ืžื” ืขื•ืฉื™ื ืขื ืืชืจ ื”ืคืœืืฉ? ื”ืกื™ืœื‘ืจืœื™ื™ื˜? ื” Java Applet? ื•ื‘ื“ื™ืงื•ืช ื–ื” ืขื•ื“ ื”ื—ืœืง ื”ืงืœ. ืœื ื ืขื™ื ืื‘ืœ ืืคืฉืจ ืœืžื—ื•ืง ืืช ื›ืœ ื”ื‘ื“ื™ืงื•ืช ื•ืœื”ืชื—ื™ืœ ืœื›ืชื•ื‘ ืžื—ื“ืฉ ื‘ React Testing Framework. ืœืคืขืžื™ื ืฆืจื™ืš ืœืขื“ื›ืŸ ืงื•ื“ ื•ืœืคืขืžื™ื ืœื›ืชื•ื‘ ืžื•ืฆืจ ื—ื“ืฉ ืžืืคืก. ื™ืฉ ืฉื™ื’ื™ื“ื• ืฉืฉื™ื ื•ื™ื™ื ื›ืืœื” ื”ื ื”ืกื™ื‘ื” ืœื›ืชื•ื‘ Micro Services. ืื ื™ ืœื ื‘ื’ื™ืฉื” ื”ื–ืืช. ืฉื™ื ื•ื™ื™ื ื“ืจืกื˜ื™ื™ื (ืคืจื™ื™ืžื•ื•ืจืง ืฉืœื ืœื ืขื•ื‘ื“ ื™ื•ืชืจ) ืื™ื ื ืคืชืื•ืžื™ื™ื, ื•ื›ืžืขื˜ ืชืžื™ื“ ืืคืฉืจ ืœืฉื›ืชื‘ ื“ื‘ืจื™ื ื‘ื”ื“ืจื’ื” ืื• ืจืง ื—ืœืง ืžื”ืžื•ืฆืจ. ื‘ืกื•ืฃ ืื ื—ื ื• ื—ื™ื™ื ื‘ืขื•ืœื ื“ื™ื ืžื™ ื•ื›ื“ืื™ ืœื–ื›ื•ืจ ื”ื—ื“ืฉื™ื ื ื•ืฆืจื• ืžืกื™ื‘ื” - ื”ืจื‘ื” ืคืขืžื™ื ื›ืชื™ื‘ื” ืžื—ื“ืฉ ืฉืœ ืื•ืชื• ืงื•ื“ ืขื ื”ื›ืœื™ื ื”ื—ื“ืฉื™ื ืชื”ื™ื” ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ื™ืจื” ืžื”ื›ืชื™ื‘ื” ื‘ืคืขื ื”ืจืืฉื•ื ื”, ื’ื ื‘ื’ืœืœ ืฉืื ื—ื ื• ื™ื•ื“ืขื™ื ื™ื•ืชืจ ื˜ื•ื‘ ืžื” ืœืขืฉื•ืช ื•ื’ื ื‘ื’ืœืœ ืฉื”ื›ืœื™ื ื”ื—ื“ืฉื™ื ืคืฉื•ื˜ื™ื ื•ื˜ื•ื‘ื™ื ื™ื•ืชืจ.

ToCode
1 419
ืจื™ืืงื˜ ืื• Vue - ื”ื“ื’ืžื” ื“ืจืš ื”ื•ืง ืงืฆืจ ื”ืจื‘ื” ืื ืฉื™ื ืžื“ื‘ืจื™ื ืขืœ ืขืงื•ืžืช ื”ืœืžื™ื“ื” ืฉืœ ืจื™ืืงื˜ ื‘ื”ืฉื•ื•ืื” ืœ Vue ื•ื™ืฉ ื‘ื–ื” ืžืฉื”ื•. ื ื›ื•ืŸ ืœืจื™ืืงื˜ 18 (ื›ืœื•ืžืจ ืœืคื ื™ ืฉ Suspense ื™ื”ื™ื” ื“ื‘ืจ ื’ื“ื•ืœ ื•ืœืคื ื™ use ื•ื”ื‘ืขื™ื•ืช ืฉืœื•), ื”ืืชื’ืจ ื”ื›ื™ ื’ื“ื•ืœ ืขื ืจื™ืืงื˜ ื”ื™ื” useEffect. ื‘ื•ืื• ื ืจืื” ื“ื•ื’ืžื” ืงืฆืจื” ืฉืœ ืืคืงื˜ ื‘ื”ืฉื•ื•ืื” ื‘ื™ืŸ ืฉืชื™ ื”ืกืคืจื™ื•ืช ื›ื“ื™ ืœื”ื‘ื™ืŸ ืงืฆืช ืืช ื”ืจื•ื— ื•ื”ื™ื™ื—ื•ื“ื™ื•ืช ืฉืœ ื›ืœ ืื—ืช. ืจื™ืืงื˜: ื”ืงืฉื‘ื” ืœืชื ื•ืขืช ืขื›ื‘ืจ ื‘ื“ื•ื’ืžื” ืื ื™ ื›ื•ืชื‘ Hook ืฉืžืงืฉื™ื‘ ืœืชื ื•ืขืช ืขื›ื‘ืจ ื›ื“ื™ ืœื”ืฆื™ื’ ืืช ื”ืžื™ืงื•ื ื”ื ื•ื›ื—ื™ ืฉืœ ื”ืขื›ื‘ืจ ื‘ืืžืฆืข ื”ืžืกืš. ื–ื” ื”ืงื•ื“ ืฉืœ ื” Hook ื•ื”ืงื•ืžืคื•ื ื ื˜ื” ืฉืžืฉืชืžืฉืช ื‘ื•, ื‘ืฉื‘ื™ืœ ื”ืคืฉื˜ื•ืช ื‘ืื•ืชื• ืงื•ื‘ืฅ:
import { useEffect, useState } from 'react'
import './App.css'

function useMousePosition() {
  const [position, setPosition] = useState([0, 0]);

  useEffect(() => {
    function handleMove(ev: MouseEvent) {
      setPosition([ev.clientX, ev.clientY]);
    }

    window.addEventListener('mousemove', handleMove);

    return () => {
      window.removeEventListener('mousemove', handleMove);
    }
  }, [])

  return position;
}

function App() {
  const position = useMousePosition();

  return (
    <h1>Position: {position[0]}, {position[1]}</h1>
  )
}

export default App
ืžื‘ื—ื™ื ืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืฉื™ืžื•ืฉ ื‘ Custom Hook ื ืจืื” ืžืื•ื“ ืคืฉื•ื˜, ื•ื”ืงื•ืžืคื•ื ื ื˜ื” ื›ื•ืœืœืช ื‘ืกืš ื”ื›ืœ ืืช ืฉื•ืจืช ื”ื’ื“ืจืช ื”ืžืฉืชื ื” ื•ืืช ื”ืชื‘ื ื™ืช. ื‘ื–ื›ื•ืช ื˜ื™ื™ืคืกืงืจื™ืคื˜ ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉ position ืžื•ืจื›ื‘ ืžืฉื ื™ ืžืกืคืจื™ื, ื•ื’ื ื‘ Hook-ื™ื ื™ื•ืชืจ ืžืกื•ื‘ื›ื™ื ื˜ื™ื™ืคืกืงืจื™ืคื˜ ื™ื›ื•ืœ ืœืขื–ื•ืจ ืœื–ื›ื•ืจ ืžื” ื‘ื“ื™ื•ืง ื—ื•ื–ืจ ืžื”ืคื•ื ืงืฆื™ื”. ืžื‘ื—ื™ื ืช ืงื•ื“ ื” Hook ื™ืฉ ืคื” ืงืฆืช ื™ื•ืชืจ ืืชื’ืจ ื‘ื’ืœืœ ื”ืžื‘ื ื” ืฉืœ useState, useEffect ื•ื”ืงืฉืจ ื‘ื™ื ื™ื”ื: 1. ืคื•ื ืงืฆื™ื™ืช useState ืžื—ื–ื™ืจื” ืžืฉืชื ื” ื•ืคื•ื ืงืฆื™ื™ืช ืขื“ื›ื•ืŸ ืœืื•ืชื• ืžืฉืชื ื”. ื‘ืžืงืจื” ืฉืœ ืžืขืจื›ื™ื ื–ื” ืžื‘ืœื‘ืœ ื•ืฆืจื™ืš ืœื–ื›ื•ืจ ืฉืื™ ืืคืฉืจ ืคืฉื•ื˜ ืœืฉื ื•ืช ืขืจืš ื‘ืื—ื“ ื”ืชืื™ื ืฉืœ ื”ืžืขืจืš, ืืœื ืชืžื™ื“ ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื™ืช ื”ืขื“ื›ื•ืŸ. 2. ื™ื•ืชืจ ืžื‘ืœื‘ืœ ื”ื•ื ื”ืžืžืฉืง ืฉืœ useEffect, ื‘ื’ืœืœ ืฉื”ื•ื ืžื—ื•ืœืง ืœ-3 - ื”ืคื•ื ืงืฆื™ื” ื”ืจืืฉื•ื ื” ื ืงืจืืช ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”ืืคืงื˜, ื”ืคื•ื ืงืฆื™ื” ื”ืฉื ื™ื™ื” (ืฉื—ื•ื–ืจืช ืž useEffect) ืฆืจื™ื›ื” ืœื ืงื•ืช ืืช ื”ืืคืงื˜ ื•ืžืขืจืš ื”ืชืœื•ื™ื•ืช ืฉืงื•ื‘ืข ืžืชื™ ืœื™ืฆื•ืจ ืžื—ื“ืฉ ืืช ื”ืืคืงื˜. ื›ืœ ืื—ื“ ืžื”ื—ืœืงื™ื ื”ื›ืจื—ื™ ืื‘ืœ ื ื™ืชืŸ ืœื”ืฉืžื˜ื” ื•ื›ืœ ื—ืœืง ืฉืฉื•ื›ื—ื™ื ืœื›ืชื•ื‘ ื™ื›ื•ืœ ืœื”ื‘ื™ื ืœืชื•ืฆืื•ืช ืžื•ื–ืจื•ืช. ื’ื™ืจืกืช Vue ืื•ืชื” ื“ื•ื’ืžื” ื‘ื’ื™ืจืกืช Vue ืœื ื ืจืื™ืช ื™ื•ืชืจ ืžื“ื™ ืฉื•ื ื”, ื•ื–ื• ื”ืชื—ืœื” ื˜ื•ื‘ื”:
<script setup lang="ts">

import { ref, onMounted, onUnmounted } from 'vue'

function useMouse() {
  const position = ref([0, 0])

  function update(event: MouseEvent) {
    position.value = [event.clientX, event.clientY];
  }

  onMounted(() => window.addEventListener('mousemove', update))
  onUnmounted(() => window.removeEventListener('mousemove', update))

  return position;
}

const position = useMouse();
</script>

<template>
  <h1>{{ position[0] }}, {{ position[1] }}</h1>
</template>
ื”ืงื•ืžืคื•ื ื ื˜ื” ืžื’ื“ื™ืจื” ืืช position ื‘ืชื•ืจ ref ื‘ืžืงื•ื ื‘ืชื•ืจ useState, ื•ื”ืขื“ื›ื•ืŸ ืฉืœื• ืžืชื‘ืฆืข ืขืœ ื™ื“ื™ ื”ืฉืžื” ืœืžืืคื™ื™ืŸ .value. ื’ื ื›ืืŸ ืื™ ืืคืฉืจ ืœืฉื ื•ืช ืจืง ืชื ืื—ื“ ื‘ืžืขืจืš ื•ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื‘ืœื‘ืœ. ื”ืฉื™ื ื•ื™ ื”ื™ื•ืชืจ ื’ื“ื•ืœ ื”ื•ื ื”ืžืžืฉืง ืฉืœ ื” Hook - ื”ืคืขื ื‘ืžืงื•ื ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” ืื—ืช ืื ื—ื ื• ืงื•ืจืื™ื ืœ-2, ื”ืคื•ื ืงืฆื™ื” onMounted ื• onUnmounted, ื•ืคื” ื’ื ื”ืžืคืชื— ืœื”ื‘ื™ืŸ ืืช ื”ื”ื‘ื“ืœื™ื ื‘ื™ืŸ ื”ืกืคืจื™ื•ืช. ื‘ืขื•ื“ ืฉืจื™ืืงื˜ ื”ื›ื ื™ืกื” ืืช ื”ืžื™ืœื” Effect ื‘ืชื•ืจ ืื•ืกืฃ ืฉืœ 3 ื—ืœืงื™ื, ื‘ Vue ื”ืœื›ื• ืขืœ ื’ื™ืฉื” ื™ื•ืชืจ Low Level ื‘ื” ืื ื—ื ื• ืคืฉื•ื˜ ืžื’ื“ื™ืจื™ื ืื™ื–ื” ืงื•ื“ ืœื”ืคืขื™ืœ ืžืชื™. ื”ื™ื™ืชืจื•ืŸ ื‘ื’ื™ืฉื” ื”ื•ื ื”ืคืฉื˜ื•ืช ื•ืขืงื•ืžืช ื”ืœื™ืžื•ื“ ื”ื™ื•ืชืจ ืงืœื”, ื›ื™ ืœื ืฆืจื™ืš ืœื—ืฉื•ื‘ ืžื” ื–ื” ืืคืงื˜ ื•ืžืชื™ ื˜ื•ื‘ ืื• ืœื ื˜ื•ื‘ ืœื”ืฉืชืžืฉ ื‘ื•, ืื‘ืœ ื”ื—ื™ืกืจื•ืŸ ื”ื•ื ืฉื™ืฉ ื™ื•ืชืจ ืžืงื•ื ืœื˜ืขื•ื™ื•ืช ื›ืฉืฆืจื™ืš ืœื—ืฉื•ื‘ ืœืžืฉืœ ื‘ืื™ื–ื” ืžืฆื‘ื™ื ืจื•ืฆื™ื ืœื™ืฆื•ืจ ืžื—ื“ืฉ ืืช ื” Event Handler. ื”ืงืฉืจ ื‘ื™ืŸ onMounted ืœ onUpdated ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืกื•ืจื‘ืœ ืœื›ืชื™ื‘ื” ื•ืœื›ืŸ ื‘ืจื™ืืงื˜ ืขื‘ืจื• ืžืžื•ื“ืœ ืฉืœ Lifecycle ืœืžื•ื“ืœ ืฉืœ ืืคืงื˜ื™ื, ืื‘ืœ ืžืฆื“ ืฉื ื™ ื”ืžื•ื“ืœ ื”ื—ื“ืฉ ื‘ืจื™ืืงื˜ ื™ืฆืจ ืขืงื•ืžืช ืœื™ืžื•ื“ ื”ืจื‘ื” ื™ื•ืชืจ ืžืฉืžืขื•ืชื™ืช ื•ื‘ืคืจืกืคืงื˜ื™ื‘ื” ืฉืœ ื”ืฉื ื™ื ืฉืขื‘ืจื• ืžืื– ื™ืฆื™ืจืช ื”ืžื•ื“ืœ ืื ื™ ืœื ื‘ื˜ื•ื— ืฉื–ื” ื”ื™ื” ืจืขื™ื•ืŸ ื˜ื•ื‘. ืžื” ื“ืขืชื›ื? ืื™ื–ื” ืžื”ื’ื™ืฉื•ืช ืื”ื‘ืชื ื™ื•ืชืจ? ื•ืื™ื–ื” ืžืืคื™ื™ื ื™ื ื™ื™ื—ื•ื“ื™ื™ื ืฉืœ ื›ืœ ืกืคืจื™ื” ืืชื ืื•ื”ื‘ื™ื?

ToCode
1 419
ื˜ื™ืค CSS: ื›ื•ืชืจื•ืช ื“ื‘ื™ืงื•ืช ืœื˜ื‘ืœื” ื”ืขืจืš sticky ืฉืœ ืžืืคื™ื™ืŸ position ื‘ CSS ื™ื›ื•ืœ ืœื—ืกื•ืš ื”ืจื‘ื” ื›ืื‘ ืจืืฉ ื›ืฉืจื•ืฆื™ื ืœื‘ื ื•ืช ื˜ื‘ืœื” ืขื ื›ื•ืชืจื•ืช ื“ื‘ื™ืงื•ืช - ื›ืœื•ืžืจ ื˜ื‘ืœื” ืขื ืคืกื™ ื’ืœื™ืœื” ื‘ื” ืฉื•ืจืช ื”ื›ื•ืชืจืช ื ืฉืืจืช ืชืžื™ื“ ืœืžืขืœื” (ื›ืžื• ื‘ืืงืกืœ) ื›ืฉื’ื•ืœืœื™ื ืœืžื˜ื” ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืจืื•ืช ืืช ืฉืžื•ืช ื”ืขืžื•ื“ื•ืช, ื•ื‘ืื•ืชื• ืื•ืคืŸ ื”ืขืžื•ื“ื” ื”ืจืืฉื•ื ื” ืชื™ืฉืืจ ืชืžื™ื“ ืขืœ ื”ืžืกืš ื›ืฉื ื’ืœื•ืœ ื”ืฆื™ื“ื”. ื–ื” ื”ืงื•ื“ ื‘ืงืฆืจื”:
thead {
  position: sticky;
  top: 0;
  z-index: 2;
}

th:first-child, td:first-child  {
  position: sticky;
  left: 0; 
}

td:first-child {
  background-color: white;
}

th {
  background-color: #f2f2f2;
}
ื‘ื•ืื• ื ืขื‘ื•ืจ ืขืœ ื›ืœ ื”ืžืืคื™ื™ื ื™ื: 1. ื”ืžืืคื™ื™ืŸ position: sticky ื’ื•ืจื ืœืืœืžื ื˜ "ืœื”ื™ื“ื‘ืง" ืœืžื™ืงื•ื ืžืกื•ื™ื ืื ื’ืœื™ืœื” ืชื’ืจื•ื ืœื• ืœืฆืืช ืžื”ืžืกืš. ื–ื” ื‘ื“ื™ื•ืง ื”ืืคืงื˜ ืฉืื ื—ื ื• ืจื•ืฆื™ื ืœื›ื•ืชืจื•ืช ืฉืœ ื”ื˜ื‘ืœื”. ืœ thead ื”ื’ื“ืจืชื™ ืฉื™ื™ื“ื‘ืง ืœื—ืœืง ื”ืขืœื™ื•ืŸ ื‘ืขื–ืจืช top ื•ื›ืœ td ืฉื”ื•ื ื™ืœื“ ืจืืฉื•ืŸ, ื›ืœื•ืžืจ ื›ืœ ื”ืขืžื•ื“ื” ื”ืจืืฉื•ื ื”, ื ื“ื‘ืงืช ืœืฆื“ ืฉืžืืœ. 2. ื”ื’ื“ืจืช z-index ืขืœ thead ืงื‘ืขื” ืฉืฉื•ืจืช ื”ื›ื•ืชืจืช ื”ืขืœื™ื•ื ื” ืชื•ืคื™ืข ืžืขืœ ืขืžื•ื“ืช ื”ื›ื•ืชืจืช ื•ื›ืš ืฉื ื”ืขืžื•ื“ื” ื”ืจืืฉื•ื ื” ืœื ืžื•ืกืชืจ ื‘ื’ืœื™ืœื” ืœืžื˜ื” ืขืœ ื™ื“ื™ ื”ืขืจื›ื™ื ืฉืœ ื”ืขืžื•ื“ื”. 3. ืืœืžื ื˜ื™ื ืฉืžื•ื’ื“ืจื™ื ื‘ืชื•ืจ sticky ื™ื•ืคื™ืขื• "ืžืขืœ" ืืœืžื ื˜ื™ื ืื—ืจื™ื ื•ืœื›ืŸ ืฆืจื™ื›ื™ื ื”ื’ื“ืจืช ืฆื‘ืข ืจืงืข ื›ื™ ืื—ืจืช ื ื•ื›ืœ ืœืจืื•ืช ืืช ื”ื˜ืงืกื˜ ืฉืœ ื”ืฉื•ืจื•ืช ื›ืฉื”ืŸ ืขื•ื‘ืจื•ืช "ืžืชื—ืช" ืœืฉื•ืจืช ื”ื›ื•ืชืจืช ืื• ืฉืœ ื”ืขืžื•ื“ื•ืช ื›ืฉื”ืŸ ืขื•ื‘ืจื•ืช "ืžืชื—ืช" ืœืขืžื•ื“ืช ื”ื›ื•ืชืจืช. ื”ืขืœื™ืชื™ ืœืงื•ื“ืคืŸ ืืช ื”ืงื•ื“ ื”ืžืœื ืขื ื›ืœ ื” CSS ื•ื” HTML ืฉืœ ื”ื˜ื‘ืœื” ืžื•ื–ืžื ื™ื ืœืฉื—ืง ืขื ื–ื” ื‘ืงื™ืฉื•ืจ: https://codepen.io/ynonp/pen/zYgWKOM ืื• ืžื•ื˜ืžืข ื›ืืŸ: <iframe height="400" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/ynonp/embed/zYgWKOM?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/ynonp/pen/zYgWKOM"> Untitled</a> by Ynon Perek (<a href="https://codepen.io/ynonp">@ynonp</a>) on <a href="https://codepen.io">CodePen</a>. </iframe>

ToCode
1 419
ืกื˜ืจืื‘ื” ื›ื•ืื‘ ืœืฉื™ื ืœื‘ ืฉื”ืจื‘ื” ื‘ืขื™ื•ืช ืื‘ื˜ื—ืช ืžื™ื“ืข ื”ืŸ ื‘ืขืฆื ื‘ืขื™ื•ืช ืชื™ืื•ื ืฆื™ืคื™ื•ืช. ื”ื™ื” ืžืกืคื™ืง ืฉืกื˜ืจืื‘ื” ื”ื™ืชื” ืžืฆื™ื’ื” ืคื•ืค-ืืค ืœืคื ื™ ืฉื™ืชื•ืฃ ืžืกืœื•ืœ ืฉืื•ืžืจ ืžืฉื”ื• ื›ืžื•- > ืืชื” ืขื•ืžื“ ืœืฉืชืฃ ืžื™ื“ืข ืขืœ ืžืกืœื•ืœ ืจื™ืฆื” ืฉื‘ื™ืฆืขืช ืขื ื”ืื™ื ื˜ืจื ื˜. ืฉื™ื ืœื‘: ื›ืœ ื‘ืŸ ืื“ื ืื—ืจ ืฉืจืฅ ืืช ืื•ืชื• ืžืกืœื•ืœ ื™ื•ื›ืœ ืœืจืื•ืช ืืช ื”ืคืจื˜ื™ื ืฉืœืš ื•ืืช ื›ืœ ื”ืžืกืœื•ืœื™ื ื”ืื—ืจื™ื ื‘ื”ื ืจืฆืช. ื”ืื ืืชื” ื‘ื˜ื•ื— ืฉืืชื” ืจื•ืฆื” ืœื”ืžืฉื™ืš? ื•ืื•ืœื™ ื‘ืขืฆื ืื™ืฉ ื” Product ืฉื”ื™ื” ืžื ืกื— ื›ื–ืืช ื”ื•ื“ืขื” ื”ื™ื” ืžื‘ื™ืŸ ืฉืฉื™ืชื•ืฃ ื›ื–ื” ื”ื•ื ืฉื‘ื•ืจ ื•ื›ื•ืœืœ ื‘ืขื™ื™ืช ืื‘ื˜ื—ื” ืžื•ื‘ื ื™ืช ื•ื›ืš ื”ื™ื” ื ื—ืกืš ืžืื™ืชื ื• ืคื™ืฆ'ืจ ืจื™ื’ื•ืœ ืžื™ื•ืชืจ.

ToCode
1 419
ื˜ื™ืค ืœื“ื™ื‘ื•ื’ ื‘ืขื™ื•ืช ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืฉืœ Apache ืื ื™ ื™ื•ื“ืข ืืชื ื›ื‘ืจ ืœื ืžืฉืชืžืฉื™ื ื‘ Apache, ื™ืฉ ืœื›ื nginx ืื• ืฉืืชื ืฉืžื™ื ืืช ื”ืคืจื•ื™ืงื˜ื™ื ืฉืœื›ื ืขืœ vercel ืื• AWS ื•ืžื™ ื‘ื›ืœืœ ืžืชื—ื–ืง ืฉืจืชื™ื ื‘ื™ืžื™ื ื•. ื ื•, ืื ื™ ืฆื•ื—ืง. ื”ืžื•ืŸ ืื ืฉื™ื ืžืชื—ื–ืงื™ื ืฉืจืชื™ื, ื•ื‘ื”ืจื‘ื” ืžื”ื ืจืฅ ืขื“ื™ื™ืŸ Apache. ื•ืื—ืช ื”ื‘ืขื™ื•ืช ืขื Apache ื”ื™ื ืฉื”ื•ื“ืขื•ืช ื”ืฉื’ื™ืื” ืฉืœื• ืœื ืชืžื™ื“ ืงื™ื™ืžื•ืช ืื• ืœื ืžื“ื•ื™ืงื•ืช. ืื– ืื ืœื“ื•ื’ืžื” ื™ืฉ ืœื™ ืงื•ื‘ืฅ ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืœ Site ืขื ื˜ืขื•ืช, ืœืคืขืžื™ื ืืคืืฆ'ื™ ื™ืกืจื‘ ืœืขืœื•ืช. ืœืคืขืžื™ื ื”ื•ื ื™ืกืคืจ ืคืจื˜ื™ื ืขืœ ื”ื˜ืขื•ืช ื•ืœืคืขืžื™ื ื”ื•ื ืคืฉื•ื˜ ื™ืขื‘ื™ืจ ืืช ื”ืชื ื•ืขื” ืฉื ืฉืœื—ื” ืœ Site ื”ื–ื” ืœ Site ืื—ืจ ืขื ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื™ื•ืชืจ ื’ื ืจื™ืช. ื“ืจืš ืื—ืช ืœืงื‘ืœ ื™ื•ืชืจ ืื™ื ืคื•ืจืžืฆื™ื” ืขืœ Apache ื”ื™ื ื”ืคืงื•ื“ื”: apache2ctl -S. ื”ืคืœื˜ ืžื”ืฉืจืช ืฉืœื™ ื ืจืื” ื‘ืขืจืš ื›ืš:
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/sites-enabled/002-tocode.co.il.conf:1
VirtualHost configuration:
*:443                  is a NameVirtualHost
         default server tocode.co.il (/etc/apache2/sites-enabled/002-tocode.co.il.conf:8)
         port 443 namevhost tocode.co.il (/etc/apache2/sites-enabled/002-tocode.co.il.conf:8)
         port 443 namevhost www.tocode.co.il (/etc/apache2/sites-enabled/002-tocode.co.il.conf:27)
*:80                   is a NameVirtualHost
         default server tocode.co.il (/etc/apache2/sites-enabled/002-tocode.co.il.conf:3)
         port 80 namevhost tocode.co.il (/etc/apache2/sites-enabled/002-tocode.co.il.conf:3)
ื•ื–ื” ืžืจืื” ืœื ื• ืื™ื–ื” Host-ื™ื ื™ืฉ ืœื ื• ืขืœ ื”ืฉืจืช, ื‘ืื™ื–ื” ืฉืžื•ืช ืžื˜ืคืœ ื›ืœ Host ื•ื”ื›ื™ ื—ืฉื•ื‘ ื‘ืื™ื–ื” ืงื•ื‘ืฅ ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื›ืœ Host ื”ื•ื’ื“ืจ. ื”ืžืฉืš ื”ืคืœื˜ ืžืจืื” ืขื•ื“ ื ืชื•ื ื™ debug ืฉืœื™ ื”ื™ื• ืคื—ื•ืช ื—ืฉื•ื‘ื™ื. ื ืกื• ืืช ื–ื” ืขืœ ื”ืฉืจืชื™ื ืฉืœื›ื ื•ืกืคืจื• ืื ืœืžื“ืชื ืžืฉื”ื• ื—ื“ืฉ ืื• ืžืฆืืชื ืžืฉื”ื• ืžื™ื•ืชืจ.

ToCode
1 419
ืžื‘ื—ื™ื ืช ืงื•ื“ ื”ืขื‘ื•ื“ื” ืขื ื“ื™ื ื• ื”ื™ืชื” ืžืื•ื“ ืคืฉื•ื˜ื” ื‘ื–ื›ื•ืช ื”ืชืžื™ื›ื” ื‘ืกื˜ื ื“ืจื˜ื™ื ื”ืžืชืงื“ืžื™ื ืฉืœ ืคื™ืชื•ื— ืจืฉืช, ื›ืœื•ืžืจ ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ fetch ื›ื“ื™ ืœืžืฉื•ืš ืžื™ื“ืข ืž URL ืžืจื•ื—ืง, Promise.all ื›ื“ื™ ืœื—ื›ื•ืช ืœื›ืžื” ื‘ืงืฉื•ืช ืจืฉืช ื‘ืžืงื‘ื™ืœ ื•ื™ืฉ ืœื”ื ืคื•ื ืงืฆื™ื” ื‘ืฉื Deno.writeFile ื›ื“ื™ ืœื›ืชื•ื‘ ืœืงื•ื‘ืฅ. ื‘ื’ื“ื•ืœ ืžื‘ื—ื™ื ืช ืงื•ื“ ืื™ืŸ ืฉื ืฉื•ื ื“ื‘ืจ ืฉ Chat GPT ืœื ื™ื›ืœ ื”ื™ื” ืœื›ืชื•ื‘. ื‘ืขื™ื” ืื—ืช ืฉื›ืŸ ื”ื™ืชื” ืœื™ ืขื ื”ืงื•ื“ ื”ื™ื ื”ืœื•ืœืื”:
  for (let i=0; i < names.length; i++) {
    const fixed = await modifyImage(buffers[i], 512, 512);
    await Deno.writeFile(path.join(dir, names[i]), fixed);
  }
ื”ืœื•ืœืื” ืžืคืขื™ืœื” ืืช modifyImage ื‘ืฆื•ืจื” ืกื“ืจืชื™ืช ืชืžื•ื ื” ืื—ืจื™ ืชืžื•ื ื”. ื›ืฉื ื™ืกื™ืชื™ ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” ื‘ืžืงื‘ื™ืœ ืขืœ ื›ืœ ื”ืชืžื•ื ื•ืช ืขื Promise.all ืงื™ื‘ืœืชื™ ืชื•ืฆืื•ืช ืฉื’ื•ื™ื•ืช. ืœื ื”ืฆืœื—ืชื™ ืœื”ื‘ื™ืŸ ืœืžื”. ื‘ืขื™ื” ื ื•ืกืคืช ืขื ื”ืงื•ื“ ื”ื™ืชื” ืฉ Deno ืœื ื”ืฆืœื™ื— ืœืคืขื ื— ืืช ืงื•ื‘ืฅ ื” index.d.ts ืฉืœ ืกืคืจื™ื™ืช wikipedia ืž npm, ื•ืœื›ืŸ ืื™ ืืคืฉืจ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื” ืžืงื•ื‘ืฅ TypeScript ื•ืขื‘ืจืชื™ ืœ JavaScript ื‘ืงื•ื‘ืฅ ื”ืœื•ื’ื™ืงื”. ื“ื•ืงืจ ื”ืงื•ื‘ืฅ ื”ืื—ืจื•ืŸ ื”ื•ื ื” Dockerfile ื•ื’ื ืคื” ื™ืฉ ื›ื‘ืจ ืคื™ืชืจื•ืŸ ื˜ื•ื‘ ืœื“ื™ื ื• ื–ื” ื ืจืื” ื›ื›ื”:
FROM denoland/deno:2.0.3

* The port that your application listens to. *
EXPOSE 8000

WORKDIR /app
RUN bash -c "mkdir -p /app/files && chown -R deno /app/files"

* Prefer not to run as root. *
USER deno

* These steps will be re-run upon each file change in your working directory: *
COPY . .
* Compile the main app so that it doesn't need to be compiled each startup/entry. *
RUN deno cache main.ts

CMD ["run", "-A", "main.ts"]
ื”ืื™ืžื’' deno ืž Denoland ื”ื™ื ืื™ืžื’' ื‘ืกื™ืกื™ ืœื”ืจืฆืช ืชื•ื›ื ื™ืช ื“ื™ื ื• ื•ืฆืจื™ืš ืœื”ื•ืกื™ืฃ ืขืœื™ื” ืจืง ืืช ื”ืงื‘ืฆื™ื ืฉืœื ื• ื•ืœื”ืจื™ืฅ. ื‘ืขื™ื” ืื—ืช ืฉื”ื™ืชื” ืœื™ ืขื ื” Dockerfile ื”ื–ื” ื”ื™ื ืฉื”ืชืงื ืช ื”ืชืœื•ื™ื•ืช ืงื•ืจื™ืช ื‘ืฉื•ืจื”:
RUN deno cache main.ts
ืžื” ืฉืื•ืžืจ ืฉื‘ืฉื‘ื™ืœ ืœื”ืชืงื™ืŸ ืืช ื”ืชืœื•ื™ื•ืช ืื ื™ ืฆืจื™ืš ืœื”ืขืชื™ืง ืœืื™ืžื’' ืืช ื›ืœ ื”ืงื‘ืฆื™ื ืฉืœ ื”ืคืจื•ื™ืงื˜ ื•ืœื›ืŸ ืงื•ืจื” ืจืง ืื—ืจื™ ื”ืขืชืงืชื. ื‘ื“ื•ืงืจ ื–ื” ืื•ืžืจ ืฉืื™ ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืชืœื•ื™ื•ืช ื‘ืชื•ืจ ืฉื›ื‘ื” ื ืคืจื“ืช ื•ืœื›ืŸ ื›ืœ ืฉื™ื ื•ื™ ื‘ืงื•ื“ ื‘ื‘ื ื™ื™ื” ื”ื‘ืื” ื”ื•ื ื™ืฆื˜ืจืš ืœื”ืชืงื™ืŸ ืžื—ื“ืฉ ืืช ื›ืœ ื”ืชืœื•ื™ื•ืช. ื‘ node ืื ื™ ืžื–ื›ื™ืจ ืฉื”ื™ื” ืœื ื• ืืช:
COPY package*.json ./
RUN npm install
ืœืคื ื™ ื”ืขืชืงืช ืฉืืจ ื”ืคืจื•ื™ืงื˜ ื•ื›ืš ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“ ื ื›ื ืกื• ื‘ืฉื›ื‘ื” ืขืœื™ื•ื ื” ื™ื•ืชืจ ืžื”ืชืœื•ื™ื•ืช. ืื ื™ ื—ื•ืฉื‘ ืฉื™ืฉ ื“ืจืš ืœืขืฉื•ืช ืžืฉื”ื• ื“ื•ืžื” ื’ื ื‘ Deno ืื‘ืœ ืขื“ื™ื™ืŸ ืœื ืžืฆืืชื™. ืฉื•ืจื” ืชื—ืชื•ื ื” ื”ืขื‘ื•ื“ื” ืขื ื“ื™ื ื• ืœื ื”ื™ืชื” ืจืขื” ื•ื™ืฉ ื”ืจื‘ื” ื“ื‘ืจื™ื ืฉืขื‘ื“ื• ืœื ืคื—ื•ืช ื˜ื•ื‘ ืžืžื” ืฉื”ื™ื™ืชื™ ืžืงื‘ืœ ืขื node.js, ืื‘ืœ ืขื“ื™ื™ืŸ ืงืฉื” ืœื”ืชื™ื—ืก ืœื–ื” ื›ืงืคื™ืฆืช ืžื“ืจื’ื”. ื”ืืงื•ืกื™ืกื˜ื ืขื“ื™ื™ืŸ ืžื‘ื•ืœื’ืŸ ื•ื”ืชืžื™ื›ื” ื‘ืžื•ื“ื•ืœื™ื ืž npm ื—ืœืงื™ืช, ื›ื•ืœืœ ืชืžื™ื›ื” ื—ืœืงื™ืช ื‘ื”ื’ื“ืจื•ืช ื”ื˜ื™ืคื•ืกื™ื ืฉืฉื ืžื” ืฉื™ื›ื•ืœ ืœื”ื•ื‘ื™ืœ ืœืงื•ืฉื™ ื‘ืคืจื•ื™ืงื˜ื™ื ื’ื“ื•ืœื™ื ื™ื•ืชืจ. ื”ืืชื’ืจ ื”ื‘ื ืžื‘ื—ื™ื ืช ื“ื™ื ื• ื ืฉืืจ ืœื“ืขืชื™ ื”ื—ื™ื‘ื•ืจ ืœ npm - ืื• ืขืœ ื™ื“ื™ ืฉื™ืคื•ืจ ื”ืชืžื™ื›ื” ื‘ืžื•ื“ื•ืœื™ื ืž npm ื•ื”ืคื™ื›ืชื ืœ First Class Citizens ื‘ืืงื•ืกื™ืกื˜ื ืื• ืขืœ ื™ื“ื™ ื™ื‘ื•ื ืžืื•ื“ ืžืืกื™ื‘ื™ ืฉืœ ืžื•ื“ื•ืœื™ื ืž npm ืœ JSR.

ToCode
1 419
ื“ื•ื’ืžืช ื“ื™ื ื•: ืฉืžื™ืจืช ืชืžื•ื ื•ืช ืžื•ื™ืงื™ืคื“ื™ื” ื›ื‘ืจ ื›ืžื” ื™ืžื™ื ืฉืื ื™ ืžืฉื—ืง ืขื ืงื•ื“ ื›ื“ื™ ืœื”ื•ืจื™ื“ ืชืžื•ื ื•ืช ืžื•ื™ืงื™ืคื“ื™ื” ื‘ืฉื‘ื™ืœ ื‘ื•ื˜ ืžื™ืœื•ืŸ ืฉืื ื™ ื›ื•ืชื‘, ื•ื›ืžื• ื”ืจื‘ื” ืคืขืžื™ื ื‘ืคืจื•ื™ืงื˜ื™ ืฆื“ ืื ื™ ืื•ื”ื‘ ืœื‘ื—ื•ืจ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืฉืžืขื ื™ื™ื ื•ืช ืื•ืชื™ ื›ื“ื™ ืœืจืื•ืช ืื™ืš ื–ื” ืขื•ื‘ื“ ื‘ืขื•ืœื ื”ืืžื™ืชื™. ื”ืคืขื ืœืงื—ืชื™ ืืช ื“ื™ื ื• ื•ืจืฆื™ืชื™ ืœืจืื•ืช ืื ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ Deno2 ืœืคืจื•ื™ืงื˜ ื•ื‘ืขื™ืงืจ ืžื” ื™ื”ื™ื• ื”ืงืฉื™ื™ื. ืกื™ื›ื•ื ื”ื ื™ืกื•ื™ ื‘ืคื•ืกื˜ ื›ืืŸ. ืžื” ื‘ื•ื ื™ื ื‘ืฉื‘ื™ืœ ืœืฉืœื•ื— ืชืžื•ื ื” ื“ืจืš ื˜ืœื’ืจื ื”ื™ื ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืœื ื’ื“ื•ืœื” ืžื“ื™ ืื‘ืœ ื”ื‘ืขื™ื” ืฉืชืžื•ื ื•ืช ื‘ื•ื™ืงื™ืคื“ื™ื” ื™ื›ื•ืœื•ืช ืœื”ื’ื™ืข ื‘ื›ืœ ื’ื•ื“ืœ. ืœื›ืŸ ื ื‘ื ื” ืžื™ืงืจื• ืกืจื‘ื™ืก ื‘ Deno ืฉืžืงื‘ืœ ืžืืžืจ ืžื•ื™ืงื™ืคื“ื™ื” (ืฉื ื”ื ื•ืฉื ื•ื”ืฉืคื”), ืžื•ืฉืš ืืช ื›ืœ ื”ืชืžื•ื ื•ืช, ืžืงื˜ื™ืŸ ืื•ืชืŸ ื•ืฉื•ืžืจ ืœืชื™ืงื™ื™ื” ืžืงื•ืžื™ืช. ืื—ืจื™ ื–ื” ืืคืฉืจ ื™ื”ื™ื” ืœืงื—ืช ืืช ื”ืชืžื•ื ื•ืช ืžื”ืกืจื‘ื™ืก ื‘ืžืงื•ื ืžื•ื™ืงื™ืคื“ื™ื” ื›ื“ื™ ืœืงื‘ืœ ืืช ื”ื’ื™ืจืกื” ื”ืงื˜ื ื” ืฉื’ื ืžืชืื™ืžื” ืœื˜ืœื’ืจื. ืืคืฉืจ ืœืจืื•ืช ืืช ื”ืงื•ื“ ื”ืžืœื ื‘ื’ื™ื˜ื”ืื‘: https://github.com/ynonp/wikipedia-image-fetcher ื”ืงื•ื‘ืฅ main.ts ืคืจื™ื™ืžื•ื•ืจืง ื” Web ืฉื‘ื—ืจืชื™ ื ืงืจื Hono. ื›ืชื‘ืชื™ ืขืœื™ื• ื›ืืŸ ื•ื›ื‘ืจ ื”ืจื‘ื” ื–ืžืŸ ืฉืื ื™ ืจื•ืฆื” ืœื‘ื ื•ืช ืขื•ื“ ื“ื‘ืจื™ื ื‘ืขื–ืจืชื•. ื”ื•ื ื• ืžื”ื™ืจ ื•ืงืœ ืœืฉื™ืžื•ืฉ ื•ืื ื™ ืžืจื’ื™ืฉ ืฉื”ื•ื ื’ื™ืจืกืช ืืงืกืคืจืก ืฉืžืชืื™ืžื” ืœ 2024. ื”ื ืชื™ื‘ ื”ืจืืฉื•ืŸ ืฉืื ื™ ืžื›ื ื™ืก ืœืคืจื•ื™ืงื˜ื™ื ืคืฉื•ื˜ ืžื—ื–ื™ืจ ืฉื”ื›ืœ ื‘ืกื“ืจ:
app.get('/up', (c) => {
  return c.json({ok: true})
})
ื•ื–ื” ื™ืขื–ื•ืจ ืื ื™ื•ื ืื—ื“ ื ืจืฆื” ืœืฉืœื‘ ืืช ื”ืคืจื•ื™ืงื˜ ื‘ืื™ื–ื” ืžืขืจื›ืช Zero Downtime Deployment ื›ื“ื™ ืฉื”ื™ื ืชื“ืข ืฉื”ื›ืœ ืขืœื” ื›ืžื• ืฉืฆืจื™ืš, ืื‘ืœ ื’ื ื‘ืื•ืคืŸ ื›ืœืœื™ ื‘ืฉื‘ื™ืœื ื• ืฉื ื“ืข ืฉื“ื‘ืจื™ื ืขื•ื‘ื“ื™ื. ื”ื ืชื™ื‘ ื”ื‘ื ื”ื•ื ื”ื™ื•ืชืจ ืžืขื ื™ื™ืŸ. ื”ื•ื ืžืงื‘ืœ ืฉืคื” ื•ื ื•ืฉื, ื‘ื•ื“ืง ืื ื™ืฉ ืœื™ ื›ื‘ืจ ืชืžื•ื ื•ืช ืขืœ ื”ื ื•ืฉื ื”ื–ื”. ืื ืื™ืŸ ืชืžื•ื ื•ืช ื”ื•ื ื™ื•ืจื™ื“ ืื•ืชืŸ ื•ืื ื™ืฉ ื”ื•ื ืจืง ื™ื—ื–ื™ืจ ืืช ืจืฉื™ืžืช ื”ืชืžื•ื ื•ืช:
app.get('/images', async (c) => {
  const { topic, lang } = c.req.query();
  if (await lib.hasSavedImages(lang, topic)) {
    const images = await lib.getSavedImages(lang, topic);
    return c.json(images);
  } else {
    const images = await lib.downloadWikipediaImages(lang, topic);
    return c.json(images);
  }
})
ื‘ hono ืื™ืŸ ื‘ืขื™ื” ืœื›ืชื•ื‘ ืงื•ื“ ื˜ื™ืคื•ืœ ื‘ื ืชื™ื‘ ืืกื™ื ื›ืจื•ื ื™ ื•ืœื”ื—ื–ื™ืจ json. ื”ื“ื‘ืจ ื”ื™ื—ื™ื“ ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ืชืจื’ืœ ืืœื™ื• ื–ื” ืฉื™ืฉ ืคืจืžื˜ืจ ืื—ื“ ืœืคื•ื ืงืฆื™ื•ืช ื”ื˜ื™ืคื•ืœ ื‘ืžืงื•ื ืฉื ื™ ืคืจืžื˜ืจื™ื ื›ืžื• ื‘ืืงืกืคืจืก. ื”ื•ื ื• ืขื•ื‘ื“ ื‘ Deno ืื‘ืœ ื’ื ื‘ node.js ื• bun. ื™ืฉ ืœื• ื‘ื™ืฆื•ืขื™ื ืžืฆื•ื™ื ื™ื ื•ื‘ื™ื ืชื™ื™ื ืื™ืŸ ืœื™ ืฉื•ื ืชืœื•ื ื•ืช ืœื’ื‘ื™ื•. ืื ื—ื ื• ืžืคืขื™ืœื™ื ืืช ื”ืฉืจืช ืขื:
Deno.serve(app.fetch)
ืฉืžื™ืจืช ืชืžื•ื ื•ืช ื•ืฉื™ื ื•ื™ ื’ื•ื“ืœ ื”ืงื•ื‘ืฅ ื”ืฉื ื™ ื‘ืคืจื•ื™ืงื˜ ื ืงืจื wikipedia_fetcher.js ื•ืฉื ื›ืชื‘ืชื™ ืืช ื›ืœ ื”ืœื•ื’ื™ืงื”, ื•ืฉื ื’ื ื“ื‘ืจื™ื ื”ืชื—ื™ืœื• ืœื”ืกืชื‘ืš. ื‘ืขื™ื” ืจืืฉื•ื ื” ืฉื”ื™ืชื” ืœื™ ืขื ื“ื™ื ื• ื”ื™ื ืฉื“ื™ื ื• ื™ื•ื“ืข ืœืžืฉื•ืš ืกืคืจื™ื•ืช ืž-3 ืžืื’ืจื™ื: ื™ืฉ ืœื• ืืช ื”ืžืื’ืจ ื”ืจืฉืžื™ ืฉื ืงืจื JSR, ืฉื ืื™ืŸ ื›ืžืขื˜ ื—ื‘ื™ืœื•ืช ืื‘ืœ ื ืจืื” ืฉื” Toolchain ืฉืœ ื“ื™ื ื• ืขื•ื‘ื“ ืื™ืชื• ื”ื›ื™ ื˜ื•ื‘. ื™ืฉ ืžืื’ืจ ืจืฉืžื™ ื™ืฉืŸ ื™ื•ืชืจ ืฉื ืงืจื Deno land, ืฉื ื™ืฉ ื™ื•ืชืจ ื—ื‘ื™ืœื•ืช ืื‘ืœ ื–ื” ืœื ื ืชืžืš ืžื›ืœ ื”ื›ืœื™ื ื•ื™ืฉ ืœื• ืชืžื™ื›ื” ื‘ืกืคืจื™ื•ืช ืž npm ืฉื ื”ื›ืœื™ื ืขื•ื‘ื“ื™ื ื“ื™ ื˜ื•ื‘ ืื‘ืœ ื”ืกืคืจื™ื•ืช ืขืฆืžืŸ ืœื ืชืžื™ื“ ื ืชืžื›ื•ืช ื‘ืžืœื•ืืŸ. ื•ื›ืš ื™ื•ืฆื ืฉืžืฆื“ ืื—ื“ ืื™ ืืคืฉืจ ืœื”ื’ื‘ื™ืœ ืืช ืขืฆืžื ื• ืจืง ืœ JSR ื›ื™ ืื™ืŸ ืฉื ืžืกืคื™ืง ื—ื‘ื™ืœื•ืช ืื‘ืœ ืขื‘ื•ื“ื” ืขื ืžืื’ืจื™ื ืื—ืจื™ื ื™ื•ืฆืจืช ื‘ืœืื’ืŸ ื‘ืคืจื•ื™ืงื˜. ื›ื›ื” ืžืชื—ื™ืœ ืงื•ื‘ืฅ ื”ืœื•ื’ื™ืงื” ื‘ืคืจื•ื™ืงื˜ ืฉืœื™, ื•ืฉื•ื‘ ืื ื™ ืžื–ื›ื™ืจ ื–ื” ืคืจื•ื™ืงื˜ ืžืžืฉ ืงื˜ืŸ ืฉื›ืชื‘ืชื™ ื‘ื›ืžื” ืฉืขื•ืช:
import * as fs from "@std/fs";
import * as path from "jsr:@std/path";
import wiki from "wikipedia";
import {basename} from "https://deno.land/std@0.224.0/url/mod.ts";

import {
  ImageMagick,
  initialize,
  MagickGeometry,
} from "https://deno.land/x/imagemagick_deno@0.0.31/mod.ts";
ื”ืงื•ื‘ืฅ ื›ื•ืœืœ ืกืคืจื™ื•ืช ืž JSR, ืกืคืจื™ื•ืช ืž Deno land ื•ืขื•ื“ ืกืคืจื™ื•ืช ืฉื”ื•ืกืคืชื™ ื‘ืขื–ืจืช ืคืงื•ื“ืช deno add ื•ืœื›ืŸ ื ืฉืžืจื• ื‘ืชื•ืš ื”ืงื•ื‘ืฅ deno.json ื‘ืจืฉื™ืžืช ื” import-ื™ื:
  "imports": {
    "@std/fs": "jsr:@std/fs@^1.0.5",
    "hono": "jsr:@hono/hono@^4.6.6",
    "wikipedia": "npm:wikipedia@^2.1.2"
  },
ืขื›ืฉื™ื• ื‘ืจื•ืจ ืฉื”ื‘ืขื™ื” ื”ืžืจื›ื–ื™ืช ืคื” ื”ื™ื ืฉืื ื™ ืœื ืžืกืคื™ืง ืžืกื•ื“ืจ ื•ืคืฉื•ื˜ ื–ื•ืจืง ืกืคืจื™ื•ืช ืคื ื™ืžื” ืœืคื™ ืงื•ื“ ื”ื“ื•ื’ืžื” ื‘ืื•ืชื” ืกืคืจื™ื”. ืื‘ืœ ืื•ืœื™ ืื ื”ืืงื•ืกื™ืกื˜ื ื”ื™ื” ื™ื•ืชืจ ืžืื•ืจื’ืŸ ื’ื ืื ื™ ื”ื™ื™ืชื™ ืžืฉืงื™ืข ื™ื•ืชืจ.