uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 420
Obunachilar
Ma'lumot yo'q24 soatlar
+27 kunlar
-230 kunlar
Postlar arxiv
ToCode
1 420
ื‘ื•ืื• ื ื™ืงื— ืืช ื–ื” ืขื•ื“ ืฆืขื“ ืงื“ื™ืžื” ื•ื ืจืื” ืกื›ื™ืžื” ืฉืžื•ืจื›ื‘ืช ืžื›ืžื” ืกื•ื’ื™ื ืฉืœ ื™ืฉื•ื™ื•ืช, ื•ื›ืš ื’ื ื ื•ื›ืœ ืœืจืื•ืช ืฉืื™ืœืชื•ืช ื™ื•ืชืจ ืžืชื•ื—ื›ืžื•ืช. ื‘ื“ื•ื’ืžื” ื”ื‘ืื” ืื ื™ ืจื•ืฆื” ืœื‘ื ื•ืช ืกื›ื™ืžื” ืฉืชืืคืฉืจ ืœืื ืฉื™ื ืœื”ื™ืจืฉื ื›ืžื ื•ื™ื™ื ืœืคื•ืกื˜ื™ื ื‘ื‘ืœื•ื’. ืœื›ืœ ืคื•ืกื˜ ื™ืฉ ืืช ื”ืคืจื˜ื™ื ืฉืœื• ื•ื’ื ืจืฉื™ืžื” ืฉืœ ืงื˜ื’ื•ืจื™ื•ืช ืฉื”ื•ื ืงืฉื•ืจ ืืœื™ื”ืŸ, ืœื›ืœ ืžื ื•ื™ ื™ืฉ ืื™ืžื™ื™ืœ ื•ืจืฉื™ืžื” ืฉืœ ืงื˜ื’ื•ืจื™ื•ืช ื‘ื”ืŸ ื”ื•ื ืžืชืขื ื™ื™ืŸ ื•ื’ื ืจืฉื™ืžื” ืฉืœ ืคื•ืกื˜ื™ื ืฉื”ื•ื ื›ื‘ืจ ืงื™ื‘ืœ. ื›ืœ ืคืขื ืฉืžื ื•ื™ ื ืจืฉื ืื ื™ ืžื›ื ื™ืก ืื•ืชื• ืœืžืขืจื›ืช ื•ืฉื•ืžืจ ืืช ื”ืงื˜ื’ื•ืจื™ื•ืช ืขืœื™ื”ืŸ ื”ื•ื ืจื•ืฆื” ืœืงื‘ืœ ืขื“ื›ื•ื ื™ื. ื™ื”ื™ื” ืžืขื ื™ื™ืŸ ืื•ืชื™ ืœื”ืจื™ืฅ ืฉืื™ืœืชื•ืช ื›ืžื• "ืžื™ ื”ืžื ื•ื™ื™ื ื‘ืžืขืจื›ืช", "ืื™ื–ื” ืคื•ืกื˜ื™ื ืžื ื•ื™ ืžืกื•ื™ื ืงื™ื‘ืœ ื›ื‘ืจ ื•ืื™ื–ื” ืคื•ืกื˜ื™ื ืžื ื•ื™ ืžืกื•ื™ื ืœื ืงื™ื‘ืœ ืขื“ื™ื™ืŸ ื›ื“ื™ ืฉืื•ื›ืœ ืœืฉืœื•ื— ืœื• ืื•ืชื. ืœื›ืŸ ื”ืกื›ื™ืžื”, ืฉื–ื” ืื•ืกืฃ ื›ืœ ืกื•ื’ื™ ื”ืขื•ื‘ื“ื•ืช ืฉืื ื™ ื”ื•ืœืš ืœื”ื›ื ื™ืก ืœืžืขืจื›ืช, ื™ื›ื•ืœื” ืœื”ื™ืจืื•ืช ื›ืš (ื”ืคืขื ืื ื™ ื›ื‘ืจ ืžื“ื‘ื™ืง ืคื” ืงื•ื“ Clojure):
(def schema
  [
   {:db/ident :post/published-at
    :db/cardinality :db.cardinality/one
    :db/valueType :db.type/instant}
   {:db/ident :post/slug
    :db/cardinality :db.cardinality/one
    :db/valueType :db.type/string
    :db/unique :db.unique/identity}
   {:db/ident :post/title
    :db/cardinality :db.cardinality/one
    :db/valueType :db.type/string}
   {:db/ident :post/content
    :db/cardinality :db.cardinality/one
    :db/valueType :db.type/string}
   {:db/ident :post/categories
    :db/cardinality :db.cardinality/many
    :db/valueType :db.type/ref}

   {:db/ident :category/javascript}
   {:db/ident :category/clojure}
   {:db/ident :category/rust}

   {:db/ident :subscriber/email
    :db/cardinality :db.cardinality/one
    :db/valueType :db.type/string
    :db/unique :db.unique/identity}
   {:db/ident :subscriber/categories
    :db/cardinality :db.cardinality/many
    :db/valueType :db.type/ref}
   {:db/ident :subscriber/received
    :db/cardinality :db.cardinality/many
    :db/valueType :db.type/ref}
   ])

ื‘ืžืขืจื›ืช ื™ื”ื™ื• ืฉื ื™ ืกื•ื’ื™ื ืฉืœ ื™ืฉื•ื™ื•ืช - ืคื•ืกื˜ื™ื ื•ืžื ื•ื™ื™ื. ื” Attributes ื”ืฉื•ื ื™ื ืžืชืื™ืžื™ื ืœืกื•ื’ื™ ื”ื™ืฉื•ื™ื•ืช, ื•ืœืžืจื•ืช ืฉื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืœื ืื•ื›ืฃ ืืช ื–ื”, ื‘ืงื•ื“ ื™ื”ื™ื” ืœื™ ื™ื•ืชืจ ืงืœ ืœืขื‘ื•ื“ ืขื ื”ืžื™ื“ืข ื›ืฉืื ื™ ืžืงืคื™ื“ ืœื›ืชื•ื‘ ืขื•ื‘ื“ื•ืช ืžื”ืกื•ื’ ื”ื ื›ื•ืŸ. ืฉื™ืžื• ืœื‘ ืœ cardinality, ืžื ื•ื™ ื‘ื‘ืœื•ื’ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืจืฉื•ื ืœื›ืžื” ืงื˜ื’ื•ืจื™ื•ืช, ื•ืคื•ืกื˜ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืฉื•ื™ืš ืœื›ืžื” ืงื˜ื’ื•ืจื™ื•ืช, ืœื›ืŸ ื‘ืฉื ื™ ื”ืžืงืจื™ื ืฆื™ื™ื ืชื™ ืืช ื”ืขืจืš :db.cardinality/many. ืืช ืจืฉื™ืžืช ื”ืคื•ืกื˜ื™ื ืื ื™ ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ ื›ืš:
(defn date [ddMMyyyy]
  (.parse (java.text.SimpleDateFormat. "ddMMyyyy") ddMMyyyy))

(def posts [
                 {:post/title "first post"
                  :post/slug "first"
                  :post/published-at (date "01012023")
                  :post/categories [:category/clojure]}
                 {:post/title "second post"
                  :post/slug "second"
                  :post/published-at (date "02012023")
                  :post/categories [:category/clojure]}
                 {:post/title "rust"
                  :post/slug "rust"
                  :post/published-at (date "01012023")
                  :post/categories [:category/rust]}])

ื•ืจืฉื™ืžืช ืžื ื•ื™ื™ื ืจืืฉื•ื ื™ืช ื™ื›ื•ืœื” ืœื”ื™ืจืื•ืช ื›ืš:
(def subscribers [
                  {:subscriber/email "clojure@demomail.com"
                   :subscriber/categories [:category/clojure]}
                  {:subscriber/email "rust@demomail.com"
                   :subscriber/categories [:category/rust]}
                  {:subscriber/email "all@demomail.com"
                   :subscriber/categories [:category/rust :category/clojure]}])
ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช ืฉื•ืœื—ื•ืช ืืช ืฉืœื•ืฉืช ื”ืจืฉื™ืžื•ืช ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื:
@(d/transact conn schema)
@(d/transact conn posts)
@(d/transact conn subscribers)
ืื’ื‘ ื”ืชื—ื™ืœื™ืช d ื ืžืฆืืช ืฉื ื‘ื’ืœืœ ื”ื“ืจืš ื‘ื” ื™ื™ื‘ืืชื™ ืืช datomic ืœืชื•ื›ื ื™ืช ืฉื”ื™ื ื”ืฉื•ืจื•ืช:
(ns ynonp.blogmail
  (:require [datomic.api :as d]))
ื•ื‘ืฉื‘ื™ืœ ืœื”ืชื—ื‘ืจ ืœื‘ืกื™ืก ื ืชื•ื ื™ื ื•ืœื”ืจื™ืฅ ืืช ื”ืงื•ื“ ืื ื™ ื™ื›ื•ืœ ืœื™ืฆื•ืจ ื‘ืกื™ืก ื ืชื•ื ื™ื ื‘ื–ื™ื›ืจื•ืŸ ืขื ื”ืคืงื•ื“ื•ืช:
(def db-uri "datomic:mem://blog")
(d/create-database db-uri)
(def conn (d/connect db-uri))
ื›ื•ืœืŸ ื™ืฆื˜ืจื›ื• ืœื”ื•ืคื™ืข ื‘ืชื•ื›ื ื™ืช ืœืคื ื™ ืคืงื•ื“ืช ื” d/transact.

ToCode
1 420
# ืงื˜ื ื” ืขืœ ืฉืื™ืœืชื•ืช ื‘ Datomic ื‘ืฉื ืช 2012 ืจื™ืง ื”ื™ืงื™, ื”ื™ื•ืฆืจ ืฉืœ Clojure, ืฉื™ื—ืจืจ ื‘ืกื™ืก ื ืชื•ื ื™ื ื—ื“ืฉ ื‘ืฉื Datomic ื‘ืžื˜ืจื” ืœืคืชื•ืจ ืฉืชื™ ื‘ืขื™ื•ืช ืžืจื›ื–ื™ื•ืช ืฉืœ ื‘ืกื™ืกื™ ื ืชื•ื ื™ื ืจืœืฆื™ื•ื ื™ื™ื "ืจื’ื™ืœื™ื": ื”ืจืืฉื•ื ื” ื”ื™ื ื“ืจื™ืกืช ืžื™ื“ืข ื™ืฉืŸ ื‘ืคืขื•ืœื•ืช Update ื• Delete ื•ื”ืฉื ื™ื” ื”ื™ื ื”ืกื›ื™ืžื” ื”ืงืฉื™ื—ื” ืฉืžื›ืจื™ื—ื” ืœืฉื™ื ื›ืœ ื“ื‘ืจ ื‘ืชื•ืš ื˜ื‘ืœื”. ื”ืคื™ืชืจื•ืŸ ืฉืœื• ื”ื™ื” ื—ื“ืฉื ื™ ื‘ 2012 ื•ื ืฉืืจ ืžืขื ื™ื™ืŸ ื’ื ื”ื™ื•ื - ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“. ## ืฉืžื™ืจืช ืขื•ื‘ื“ื•ืช ื‘ืžืงื•ื ืฉื•ืจื•ืช ืจืขื™ื•ืŸ ืจืืฉื•ืŸ ืฉืœ ื“ื˜ื•ืžื™ืง ืฉืฆืจื™ืš ืœื”ื‘ื™ืŸ ื”ื•ื ืฉื‘ืกื™ืก ื ืชื•ื ื™ื ืฉื•ืžืจ "ืขื•ื‘ื“ื•ืช" ืขืœ ื”ืขื•ืœื ื‘ืจื’ืข ืžืกื•ื™ื ื•ืœื ืฉื•ืจื•ืช ื‘ื˜ื‘ืœื”. ืขื•ื‘ื“ื” ื ืฉืžืจืช ืœื ืฆื— ื•ืชื™ืฉืืจ ืชืžื™ื“ ื ื›ื•ื ื”, ื‘ื’ืœืœ ืฉื”ื™ื ืจืœื•ื•ื ื˜ื™ืช ืœืจื’ืข ื‘ื• ื”ื™ื ื ืืžืจื”. ื‘ืจื•ืจ ืฉื‘ืขืชื™ื“ ื™ื›ื•ืœื” ืœื”ืชื’ืœื•ืช ืขื•ื‘ื“ื” ื—ื“ืฉื” ืฉืชืฉื ื” ืžืฉื”ื• ืฉื™ื“ืขื ื•, ืื‘ืœ ื–ื” ืœื ืื•ืžืจ ืฉืขื•ื‘ื“ื•ืช ื™ืฉื ื•ืช ื ืžื—ืงื•ืช. ืชืžื™ื“ ืืคืฉืจ ืœื”ื™ื›ื ืก ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื‘ืจื’ืข ื™ืฉืŸ ื™ื•ืชืจ ื‘ื–ืžืŸ ื•ืœืจืื•ืช ืืช ื”ืขื•ื‘ื“ื•ืช ืขื“ ืœืื•ืชื• ืจื’ืข. ืื ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืฉื•ืžืจ ืขื•ื‘ื“ื•ืช ื”ืฉืืœื” ื”ื‘ืื” ืฉืฆืจื™ืš ืœื‘ืจืจ ื”ื™ื ืžื” ื–ื” ืขื•ื‘ื“ื”. ื•ื’ื ืคื” ื”ืชืฉื•ื‘ื” ืœื ืžืกื•ื‘ื›ืช, ื•ืžื•ืจื›ื‘ืช ืžืฉื ื™ ืžื•ืฉื’ื™ื ื‘ืกื™ืกื™ื™ื ื™ื•ืชืจ. ืžื•ืฉื’ ืจืืฉื•ืŸ ื”ื•ื "ื™ืฉื•ืช", ืฉื–ื” ืžืฉื”ื• ืฉืืคืฉืจ ืœื”ื’ื™ื“ ืขืœื™ื• ื“ื‘ืจื™ื, ื•ืžื•ืฉื’ ืฉื ื™ ื ืงืจื Attribute (ืœื ื‘ื˜ื•ื— ืื™ืš ืœืชืจื’ื ืืช ื–ื” ืœืขื‘ืจื™ืช), ืฉื–ื” ืžืฉื”ื• ืฉืืชื” ื™ื›ื•ืœ ืœื”ื’ื™ื“ ืขืœ ื™ืฉื•ื™ื•ืช. ื‘ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ืื ืื ื™ ืจื•ืฆื” ืœืฉืžื•ืจ ืžื™ื“ืข ืœื’ื‘ื™ ืžื—ื™ืจื™ื ืฉืœ ืžื•ืฆืจื™ื ืื– ืื ื™ ื™ื›ื•ืœ ืœื—ืฉื•ื‘ ืขืœ ืžื•ืฆืจ ื‘ืชื•ืจ ื™ืฉื•ืช, ื•ืขืœ ื”ืžื—ื™ืจ ื‘ืชื•ืจ ืขื•ื‘ื“ื”. ื•ืื– ื™ื”ื™ื• ืœื™ ืขื•ื‘ื“ื•ืช ื›ืžื•: 1. ืงื™ืœื• ืขื’ื‘ื ื™ื•ืช ืขื•ืœื” 12 ืฉ"ื—. 2. ืœื—ืžื ื™ื” ืขื•ืœื” 3 ืฉ"ื—. 3. ืงื™ืœื• ืชืคื•ื—ื™ื ื™ืจื•ืงื™ื ืขื•ืœื” 14 ืฉ"ื— ื‘ืฉื‘ื™ืœ ืœืชืืจ ืืช ื–ื” ื‘ Datomic ืื ื™ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืกื›ื™ืžื”, ืื‘ืœ ื”ืกื›ื™ืžื” ืฉืœ ื“ื˜ื•ืžื™ืง ื”ื™ื ืœื ืžื‘ื ื” ื˜ื‘ืœืื™ ืงืฉื™ื— ืฉืื•ืžืจ ืฉื™ืฉ ื˜ื‘ืœืช ืžื•ืฆืจื™ื ื•ื‘ื” ื™ืฉ ืขืžื•ื“ืช "ืฉื ื”ืžื•ืฆืจ" ื•ืขืžื•ื“ืช "ืžื—ื™ืจ ื”ืžื•ืฆืจ", ืืœื ื”ืกื›ื™ืžื” ื”ื™ื ืื•ืกืฃ ื”ืขื•ื‘ื“ื•ืช ื”ืืคืฉืจื™ื•ืช ืฉืืคืฉืจ ืœื”ื’ื™ื“ ืขืœ ื“ื‘ืจื™ื ื‘ืขื•ืœื, ืื• ืื•ืกืฃ ื” Attributes. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื”ืกื›ื™ืžื” ืชื”ื™ื”:
[
  {:db/ident :product/name
   :db/cardinality :db.cardinality/one
   :db/unique :db.unique/identity
   :db/valueType :db.type/string}
  {:db/ident :product/price
   :db/cardinality :db.cardinality/one
   :db/valueType :db.type/long}
]
ื•ื–ื” ืื•ืžืจ ืฉื™ืฉ ืฉื ื™ ื“ื‘ืจื™ื ื‘ืขื•ืœื ืฉืืคืฉืจ ืœื”ื’ื™ื“ ืขืœ "ื™ืฉื•ื™ื•ืช", ื”ืื—ื“ ื”ื•ื ืฉื™ืฉ ื™ืฉื•ื™ื•ืช ืฉื™ืฉ ืœื”ืŸ "ืฉื ืžื•ืฆืจ", ื•ืื ืืชื” ื™ืฉื•ืช ื›ื–ืืช ืื– ืืคืฉืจ ืœื–ื”ื•ืช ืื•ืชืš ืœืคื™ ืฉื ื”ืžื•ืฆืจ, ื›ืœื•ืžืจ ืœืขื•ืœื ืœื ื™ื”ื™ื• ืฉืชื™ ื™ืฉื•ื™ื•ืช ืฉื•ื ื•ืช ื‘ืžืขืจื›ืช ืฉื™ืฉ ืœื”ืŸ ืื•ืชื• ืฉื ืžื•ืฆืจ. ื”ื“ื‘ืจ ื”ืฉื ื™ ื–ื” ืฉื™ืฉ ื™ืฉื•ื™ื•ืช ืฉื™ืฉ ืœื”ืŸ ืžื—ื™ืจ. ื”ืžื™ืœื” cardinality ืื•ืžืจืช ืฉื’ื "ืžื—ื™ืจ" ื•ื’ื "ืฉื" ื–ื” ืžืฉื”ื• ืฉื™ืฉ ืจืง ืื—ื“ ืžืžื ื• ืœื™ืฉื•ืช. ื‘ื”ืžืฉืš ื ืจืื” ื“ื‘ืจื™ื ืฉื™ืฉ "ื”ืจื‘ื”" ืžื”ื ืœื›ืœ ื™ืฉื•ืช. ืคืงื•ื“ืช ื”ื›ื ืกื” ืœื‘ืกื™ืก ื ืชื•ื ื™ื ืฉืœ ื”ืขื•ื‘ื“ื•ืช ืฉื›ืชื‘ืชื™ ืžืงื•ื“ื ื™ื›ื•ืœื” ืœื”ื™ืจืื•ืช ื‘ืงืœื•ื–'ืจ ื‘ืขืจืš ื›ืš:
[[:db/add "e1", :product/name "1kg tomatoes"]
 [:db/add "e1", :product/price 12]
 [:db/add "e2", :product/name "bun"]
 [:db/add "e2", :product/price 3]
 [:db/add "e3", :product/name "1kg green apples"]
 [:db/add "e3", :product/price 14]]
ื•ืฉื™ืžื• ืœื‘ ืื™ืš ื›ืœ ืžื” ืฉื™ืฉ ืœื™ ืคื” ื–ื• ืจืฉื™ืžื” ืฉืœ "ืขื•ื‘ื“ื•ืช", ื•ืžื” ืฉืžื—ื‘ืจ ื‘ื™ืŸ ื”ืขื•ื‘ื“ื•ืช ื–ื” ืžื–ื”ื” ื—ืกืจ ื—ืฉื™ื‘ื•ืช ืฉืื ื™ ื‘ื—ืจืชื™ - e1 ืขื‘ื•ืจ ื”ืขื’ื‘ื ื™ื•ืช, e2 ืœืœื—ืžื ื™ื” ื• e3 ืœืชืคื•ื—ื™ื. ื”ืžื–ื”ื” ื”ื–ื” ื™ื™ืžื—ืง ื‘ืจื’ืข ืฉื”ืžื™ื“ืข ื™ื™ืฉืœื— ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื•ื”ื•ื ืจืง ืฉื ื–ืžื ื™ ืฉืขื•ื–ืจ ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืœื—ื‘ืจ ื‘ื™ืŸ ืฉืชื™ ื”ืขื•ื‘ื“ื•ืช ืฉืงืฉื•ืจื•ืช ืœื›ืœ ื™ืฉื•ืช, ื”ืฉื ืฉืœื” ื•ื”ืžื—ื™ืจ ืฉืœื”. ืœืžืจื•ืช ืฉ Attribute ื‘ื“ืจืš ื›ืœืœ ื›ืชื•ื‘ ื‘ืฉืชื™ ืžื™ืœื™ื ื”ืžื•ืคืจื“ื•ืช ื‘ื™ื ื™ื”ืŸ ืขื ืœื•ื›ืกืŸ, ืืœ ืชืชื‘ืœื‘ืœื• ืœื—ืฉื•ื‘ ืฉื”ืžื™ืœื” ื”ืจืืฉื•ื ื” "ืžืชืื™ืžื”" ืœื˜ื‘ืœื” ืื• ืœืกื•ื’ ืžืกื•ื™ื ืฉืœ ื™ืฉื•ื™ื•ืช. ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืœื ืื›ืคืช ืื™ื–ื” Attributes ืชืฉื™ืžื• ืขืœ ืื™ื–ื” ื™ืฉื•ืช. ื”ื—ืœื•ืงื” ืœืฉืชื™ ืžื™ืœื™ื ื”ื™ื ืจืง ื‘ืฉื‘ื™ืœื ื• ื•ืขื•ื–ืจืช ืœื ื• ืœื—ืฉื•ื‘ ื‘ืฆื•ืจื” ืžื“ื•ื™ืงืช ืขืœ ื”ืžืขืจื›ืช ืฉืœื ื•. ## ืฉืื™ืœืชื•ืช ื—ืœืง ื’ื“ื•ืœ ืžื”ื›ื— ืฉืœ ื“ื˜ื•ืžื™ืง ื”ื•ื ื‘ืฉืคืช ืฉืื™ืœืชื•ืช ื—ื“ืฉื”, ืœื ืžื‘ื•ืกืกืช SQL, ืฉืื™ืชื” ืื ื—ื ื• ืžื—ืคืฉื™ื ืžื™ื“ืข ืœื’ื‘ื™ ื”ืขื•ื‘ื“ื•ืช ื”ืฉืžื•ืจื•ืช ื‘ืžืขืจื›ืช. ืฉืคืช ื”ืฉืื™ืœืชื•ืช ืžื‘ื•ืกืกืช ืขืœ ืฉืคื” ืฉื ืงืจืืช Datalog. ืื ื™ ืœื ืจื•ืฆื” ืœื”ื™ื›ื ืก ืœื”ืกื‘ืจ ืžืœื ืขืœ ื”ืฉืคื” ื›ื™ ื–ื” ื™ื”ืคื•ืš ืืช ื”ืคื•ืกื˜ ืœื”ืจื‘ื” ื™ื•ืชืจ ืžื“ื™ ืืจื•ืš, ืื‘ืœ ื‘ืžืงื•ื ื‘ื•ืื• ื ืจืื” ื›ืžื” ื“ื•ื’ืžืื•ืช ืจืง ื‘ืฉื‘ื™ืœ ืœื”ืจื’ื™ืฉ ืืช ื”ืžื‘ื ื”. ื‘ื“ื•ื’ืžืช ื”ืžื™ื“ืข ืฉื”ืฆื’ืชื™ ืงื•ื“ื ื”ืงื•ื“ ื”ื‘ื ื”ื•ื ืฉืื™ืœืชืช datalog ืฉืžื—ื–ื™ืจื” ืืช ืฉืžื•ืช ื›ืœ ื”ืžื•ืฆืจื™ื ื‘ืžืขืจื›ืช:
[:find ?name
 :where [_ :product/name ?name]]
ื‘ืชืจื’ื•ื ืœืขื‘ืจื™ืช: ื›ืœ ืžื” ืฉืžืชื—ื™ืœ ื‘ืกื™ืžืŸ ืฉืืœื” ื”ื•ื ืžืฉืชื ื”, ื•ื›ืœ ื‘ืœื•ืง where ืžืงื‘ืœ ืฉืœืฉื” ืฉืžื•ืจื›ื‘ืช ืž"ื™ืฉื•ืช", Attribute ื•ืขืจืš. ื”ืฉืœืฉื” ืฉื‘ื“ื•ื’ืžื” ืื•ืžืจืช ืฉืœื ืžืฉื ื” ืœื™ ืžื” ื”ื™ืฉื•ืช, ืื‘ืœ ืื ื™ ืจื•ืฆื” ืฉื™ื”ื™ื” ืœ Attribute ื‘ืฉื :product/name ื•ืืช ื”ืขืจืš ืฉืœื• ืื ื™ ืฉื•ืžืจ ื‘ืžืฉืชื ื” name, ืฉื’ื ื—ื•ื–ืจ ืžื”ืฉืื™ืœืชื”. ## ื“ื•ื’ืžื” ืœืกื›ื™ืžื” ืืžื™ืชื™ืช

ToCode
1 420
# ืœืžื” ืื™ ืืคืฉืจ ืœื™ื™ื‘ื ES Module ืžืžื•ื“ื•ืœ CommonJS ? ืื ืชื ืกื• ืœืฉืœื‘ ืงื•ื“ Node.JS ืฉืžืฉืชืžืฉ ื‘ ESM ืขื ืงื•ื“ ืฉืžืฉืชืžืฉ ื‘ require (ืžื” ืฉื ืงืจื CommonJS), ืชื’ืœื• ืฉื”ืฉื™ืœื•ื‘ ืขื•ื‘ื“ ื‘ 3 ืžืชื•ืš 4 ืืคืฉืจื•ื™ื•ืช: ## ืžื” ืขื•ื‘ื“ ื•ืžื” ืœื 1. ืžื•ื“ื•ืœ ES ื™ื›ื•ืœ ืœืขืฉื•ืช import ื›ื“ื™ ืœื™ื™ื‘ื ืงื•ื“ ืžืžื•ื“ื•ืœ CommonJS 2. ืžื•ื“ื•ืœ ES ืœืขืฉื•ืช import ื›ื“ื™ ืœื™ื™ื‘ื ืงื•ื“ ืžืžื•ื“ื•ืœ ES ืื—ืจ 3. ืžื•ื“ื•ืœ CommonJS ื™ื›ื•ืœ ืœืขืฉื•ืช import ื›ื“ื™ ืœื™ื™ื‘ื ืงื•ื“ ืžืžื•ื“ื•ืœ CommonJS ืื—ืจ 4. ืžื•ื“ื•ืœ CommonJS ืฉื™ื ืกื” ืœืขืฉื•ืช require ืœืžืฉื”ื• ืฉืžื™ื•ืฆื ืžืžื•ื“ื•ืœ ES ื™ืงื‘ืœ ืฉื’ื™ืื”. ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืืช ื–ื” ื ื™ืฆื•ืจ ืคืจื•ื™ืงื˜ ื—ื“ืฉ, ื ื™ืฆื•ืจ ืงื•ื‘ืฅ ื‘ืฉื utils.mjs ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
export function twice(x) {
  return x * 2;
}
ื•ืงื•ื‘ืฅ ื‘ืฉื main.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
const { twice } = require('./utils.mjs');

console.log(twice(10));
ื ืคืขื™ืœ ืขื:
$ node main.js
ื•ื ืงื‘ืœ ืืช ื”ืฉื’ื™ืื”:
node:internal/modules/cjs/loader:1087
    throw new ERR_REQUIRE_ESM(filename, true);
    ^

Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/ynonp/tmp/node/modules/utils.mjs not supported.
Instead change the require of /Users/ynonp/tmp/node/modules/utils.mjs to a dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (/Users/ynonp/tmp/node/modules/main.js:1:19) {
  code: 'ERR_REQUIRE_ESM'
}

Node.js v18.14.0
## ืœืžื” ื˜ืขื™ื ื” ื›ื–ื• ืœื ื ืชืžื›ืช? ืื– ื”ืกื™ืคื•ืจ ื”ื•ื ื›ื ืจืื” ืœื ืฉืžื™ืฉื”ื• ื‘ node.js ื”ืชืขืฆืœ, ืืœื ืฉืกื˜ ื”ืคื™ืฆ'ืจื™ื ืฉืœ ES Modules ืงืฆืช ืฉื•ื ื” ืžื–ื” ืฉืœ CommonJS. ื”ื”ื‘ื“ืœื™ื ื”ืžืจื›ื–ื™ื™ื ื”ื: 1. ื‘ ES Module ืื ื—ื ื• ื™ื•ื“ืขื™ื ืจืง ืžืœื”ืกืชื›ืœ ืขืœ ื”ืงื•ื“ ืื™ื–ื” ืฉืžื•ืช ืžื™ื•ืฆืื™ื ืžืžื ื•. ื‘ CommonJS ื—ื™ื™ื‘ื™ื ืœื”ืจื™ืฅ ื›ื“ื™ ืœืจืื•ืช ืžื” ื™ื”ื™ื• ื”ืขืจื›ื™ื ืขืœ ืื•ื‘ื™ืงื˜ ื” exports. 2. ื‘ ES Module ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ await ืžื—ื•ืฅ ืœื›ืœ ืคื•ื ืงืฆื™ื”, ืžื” ืฉื™ื’ืจื•ื ืœื˜ืขื™ื ื” ืืกื™ื ื›ืจื•ื ื™ืช ืฉืœ ื”ืžื•ื“ื•ืœ. ื‘ CommonJS ื”ื˜ืขื™ื ื” ืชืžื™ื“ ืกื™ื ื›ืจื•ื ื™ืช. ื‘ืงื™ืฉื•ืจ ื”ื–ื” ื™ืฉ ื“ื™ื•ืŸ ืžืื•ื“ ืžืขื ื™ื™ืŸ ืขืœ ื”ืืคืฉืจื•ืช ืœื”ื•ืกื™ืฃ await ืœืžื•ื“ื•ืœื™ CommonJS ื•ืœืžื” ื”ื™ื ื›ื ืจืื” ืชืฉื‘ื•ืจ ื”ื›ืœ: https://github.com/nodejs/node/issues/21267 ## ืžื” ื‘ื›ืœ ื–ืืช ืืคืฉืจ ืœืขืฉื•ืช ืื ื”ื‘ืขื™ื” ื”ื™ื ื”ืชืžื™ื›ื” ื”ืžื•ื‘ืœืขืช ื‘ืงื•ื“ ืืกื™ื ื›ืจื•ื ื™, ืื– ื”ืคื™ืชืจื•ืŸ ื”ืคืฉื•ื˜ ื”ื•ื ืœื”ืคื•ืš ืืช ื”ืžื•ื‘ืœืข ืœืžืคื•ืจืฉ. ื•ื–ื” ืžื” ืฉื’ื ืขื•ื‘ื“ ื‘ Node.JS. ื”ืคื•ื ืงืฆื™ื” import ืฉืžื—ื–ื™ืจื” Promise ืœืžื•ื“ื•ืœ (ื ืงืจืืช ื’ื Dynamic Import) ืžืืคืฉืจืช ืœื ื• ืœื™ื™ื‘ื ืงื•ื‘ืฅ ES module ืžืชื•ืš ืงื•ื‘ืฅ CommonJS. ืื ื™ ืžืขื“ื›ืŸ ืืช ื”ืงื•ื“ ื‘ main.js ืœืงื•ื“ ื”ื‘ื:
async function main() {
  const { twice } = await import('./utils.mjs');
  console.log(twice(10));
}

main();
ื•ื” import ืžืฆืœื™ื— ืœื˜ืขื•ืŸ ืืช ื”ืžื•ื“ื•ืœ ื‘ืœื™ ืฉื•ื ืฉื™ื ื•ื™ ื‘ืงื•ื“ ื”ืžื•ื“ื•ืœ utils.mjs.

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

ToCode
1 420
# ืชื™ืงื•ืŸ ืฉืœ ืฉื•ืจื” (ืขื ื•ื‘ืœื™ ื‘ื“ื™ืงื•ืช) ## ืื ื™ ื‘ืคืจื•ื™ืงื˜ ืฉืื™ืŸ ื‘ื• ื‘ื“ื™ืงื•ืช ืดื ื• ื‘ืจื•ืจ ืฉื–ื” ืœื ืขื‘ื“ ืื‘ืœ ื”ืชื™ืงื•ืŸ ืžืžืฉ ืคืฉื•ื˜. ืฉื ื™ื” ืžืชืงืŸ ื•ืžืขืœื” ื’ื™ืจืกื”ืด ืขืฉืจ ื“ืงื•ืช ืžืื•ื—ืจ ื™ื•ืชืจ- ืดืืฃ ืื—ื“ ืœื ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืืชืจ?? ืื™ืš ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช? ืฉื ื™ื” ื‘ื•ื“ืง ื‘ืœื•ื’ื™ืืด, ืดืื” ื›ืŸ ื‘ืจื•ืจ ืื™ืš ืœื ืจืื™ืชื™ ืืช ื–ื”... ืจื’ืข ืžืชืงืŸืด ืฉืœื•ืฉื” ื—ื•ื“ืฉื™ื ืžืื•ื—ืจ ื™ื•ืชืจ- ืดืžื” ื–ืืช ืื•ืžืจืช ื”ืชืงืœื” ื—ื–ืจื”? ื›ื‘ืจ ืชื™ืงื ื• ืืช ื–ื” ืฉืœื•ืฉ ืคืขืžื™ื. ื˜ื•ื‘ ืœืคื—ื•ืช ื–ื” ืชื™ืงื•ืŸ ืฉืื ื—ื ื• ืžื›ื™ืจื™ืืด ## ืื ื™ ื‘ืคืจื•ื™ืงื˜ ืฉื™ืฉ ื‘ื• ื‘ื“ื™ืงื•ืช ืดื ื• ื‘ืจื•ืจ ืฉื–ื” ืœื ืขื‘ื“ ืื‘ืœ ื”ืชื™ืงื•ืŸ ืžืžืฉ ืคืฉื•ื˜. ื™ื™ืงื— ืœื™ ื›ืžื” ืฉืขื•ืช ืœื›ืชื•ื‘ ื‘ื“ื™ืงื” ืื•ื˜ื•ืžื˜ื™ืช ืœืชืจื—ื™ืฉ ืฉืžืฆืืช ืื‘ืœ ืขื“ ื”ืขืจื‘ ืชื”ื™ื” ื’ื™ืจืกื” ื—ื“ืฉื”. 5 ืฉืขื•ืช ืžืื•ื—ืจ ื™ื•ืชืจ- ืดืฉื•ืžืข ื”ื’ื™ืจืกื” ื”ื—ื“ืฉื” ื‘ืื•ื•ื™ืจ. ืชื‘ื“ืงื• ืจืง ืฉื”ื›ืœ ืขืœื” ื›ืžื• ืฉืฆืจื™ืš ื•ื”ื‘ืื’ ื ืขืœืืด ืฉืœื•ืฉื” ื—ื•ื“ืฉื™ื ืžืื•ื—ืจ ื™ื•ืชืจ, ื‘ืขืงื‘ื•ืช ื›ื™ืฉืœื•ืŸ ื‘ื“ื™ืงื” ืื•ื˜ื•ืžื˜ื™ืช- ืดืื™ื–ื” ืงื˜ืข ืฉื›ื—ืชื™ ืœื’ืžืจื™ ืžื”ืชืจื—ื™ืฉ ื”ื–ื” ื‘ื–ืžืŸ ื”ืจื™ืคืงื˜ื•ืจื™ื ื’. ื˜ื•ื‘ ืฉื“ืื’ืชื™ ืœื›ืชื•ื‘ ื‘ื“ื™ืงื” ื›ื“ื™ ืœื ืœื”ืขืœื•ืช ื’ื™ืจืกื” ืฉื‘ื•ืจื”ืด.

ToCode
1 420
# ืžื” ืืคืฉืจ ืœืขืฉื•ืช ืขื ES Modules ื‘ Node.JS ื’ื™ืจืกืื•ืช ืขื“ื›ื ื™ื•ืช ืฉืœ Node.JS ื›ื‘ืจ ืชื•ืžื›ื•ืช ื‘ืฆื•ืจื” ืžื•ื‘ื ื™ืช ื‘ ES Modules, ื•ืืคื™ืœื• ืžืฆื™ืขื•ืช ื›ืžื” ืฉื™ืคื•ืจื™ื ืขืœ ืคื ื™ ืขื‘ื•ื“ื” ื‘ื“ืคื“ืคืŸ. ื‘ื•ืื• ื ืจืื” ื›ืžื” ื˜ื›ื ื™ืงื•ืช ืžืจื›ื–ื™ื•ืช ืฉืœ ืขื‘ื•ื“ื” ืขื ES Modules ื‘ Node.JS. ## ื”ื’ื“ืจืช ืคืจื•ื™ืงื˜ ืฉืžืฉืชืžืฉ ื‘ืžื•ื“ื•ืœื™ื ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ ื—ื“ืฉ ืืชื ื™ื›ื•ืœื™ื ืœื”ื’ื“ื™ืจ ื‘ package.json ืืช ื”ืคืจื•ื™ืงื˜ ื‘ืชื•ืจ "ืžื•ื“ื•ืœ", ื•ืื– ืชืงื‘ืœื• ืชืžื™ื›ื” ื‘ื›ืชื™ื‘ ื” import/export ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช ื‘ื›ืœ ื”ืงื‘ืฆื™ื ื‘ืคืจื•ื™ืงื˜. ื”ืžืคืชื— ื”ืจืœื•ื•ื ื˜ื™ ื ืงืจื type ื•ื”ืขืจืš ืฉืœื• ืฆืจื™ืš ืœื”ื™ื•ืช module. ื–ื” ืงื•ื‘ืฅ package.json ืœื“ื•ื’ืžื”:
{
  "name": "demo1",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
ืฉื™ืžื• ืœื‘ ืœืžืคืชื— type. ืขื›ืฉื™ื• ืื ืื ื™ ืฉื ืืช ื”ืงื•ื‘ืฅ ื”ื–ื” ื‘ืชื™ืงื™ื™ืช ืคืจื•ื™ืงื˜ Node.JS ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ ื‘ืคืจื•ื™ืงื˜ ืงื‘ืฆื™ื ืฉื™ืฉืชืžืฉื• ื‘ื›ืชื™ื‘ ื” import/export ืฉืื ื™ ืžื›ื™ืจ ืžื“ืคื“ืคืŸ. ืœื“ื•ื’ืžื” ื”ืงื•ื‘ืฅ utils.js:
export function twice(x) {
  return x * 2;
}
ื•ืœื™ื“ื• ื”ืงื•ื‘ืฅ index.js:
import { twice } from './utils.js';

console.log(twice(10));
## ื”ื’ื“ืจืช ืงื•ื‘ืฅ ืกืคืฆื™ืคื™ ื›ืžื•ื“ื•ืœ ื‘ืคืจื•ื™ืงื˜ ืจื’ื™ืœ ื•ืžื” ืื ื™ืฉ ืœื›ื ืคืจื•ื™ืงื˜ ืงื™ื™ื ืฉื›ื‘ืจ ื›ืชื•ื‘ ื‘ืชื—ื‘ื™ืจ CommonJS (ื–ื” ืขื ื” require ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ื•ืื•ื”ื‘ื™ื)? ืื™ืŸ ื‘ืขื™ื” - ื‘ื›ืœ ืคืจื•ื™ืงื˜ Node.JS ืืคืฉืจ ืœื”ื•ืกื™ืฃ ืงื‘ืฆื™ื ืขื ืกื™ื•ืžืช mjs ื•ืืœื™ื”ื node ื™ืชื™ื™ื—ืก ื‘ืชื•ืจ ืงื‘ืฆื™ ืžื•ื“ื•ืœื™ื. ืœื“ื•ื’ืžื” ืื ื™ืฉ ืœื›ื ืคืจื•ื™ืงื˜ Node ืจื’ื™ืœ ืขื package.json ืฉืœื ืžื’ื“ื™ืจ ืœืคืจื•ื™ืงื˜ type, ื•ื‘ืคืจื•ื™ืงื˜ ื™ืฉ ืงื•ื‘ืฅ utils.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
exports.twice = x => x * 2;
ืชื•ื›ืœื• ืœื”ื’ื“ื™ืจ ืงื•ื‘ืฅ index.mjs ืฉื™ืฉืชืžืฉ ื‘ import ื›ื“ื™ ืœื”ื’ื™ืข ืœืคื•ื ืงืฆื™ื” ื•ืœื”ืคืขื™ืœ ืื•ืชื”:
import { twice } from './utils.js';

console.log(twice(10));
ื‘ื ื•ืกืฃ ืื ืงื•ื‘ืฅ ื” CommonJS ื”ืจื’ื™ืœ ืžืขื“ื›ืŸ ืืช module.exports ื™ืฉื™ืจื•ืช, ืืคืฉืจ ืœื™ื™ื‘ื ืืช ื” module.exports ื”ืžืœื ื‘ืืžืฆืขื•ืช default import. ืœื“ื•ื’ืžื” ื”ืงื•ื‘ืฅ user.js ืžื’ื“ื™ืจ ืžื—ืœืงื” ืขื‘ื•ืจ ืžืฉืชืžืฉ:
module.exports = class User {
  constructor(id, name) {
    this.id = id;
    this.name = name;
  }

  sayHi() {
    console.log(`Hi! my name is ${this.name}`);
  }
}
ืื– ืงื•ื‘ืฅ index.mjs ื™ื•ื›ืœ ืœื˜ืขื•ืŸ ืื•ืชื• ื•ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื•ืช:
import User from './user.js';

const user = new User(1, 'ynon');
user.sayHi();
ืกืš ื”ื›ืœ ื”ืฉื™ืžื•ืฉ ื‘ ES Modules ื‘ Node ื”ื•ื ืคื™ืฆ'ืจ ื—ืฉื•ื‘ ื‘ืขื•ืœื ืฉืขื•ื‘ืจ ื™ื•ืชืจ ื•ื™ื•ืชืจ ืœื”ืกืชืžืš ืขืœื™ื”ื, ื•ืขื•ื–ืจ ืœื™ืฆื•ืจ ืื—ื™ื“ื•ืช ื‘ื™ืŸ ืงื•ื“ ืฆื“ ืฉืจืช ืœืงื•ื“ ืฆื“ ืœืงื•ื—. ื”ืฉื™ืœื•ื‘ ื”ืžื•ื‘ื ื” ืขื ืงื•ื“ ืงื™ื™ื ืžืืคืฉืจ ืœืขื‘ื•ืจ ื‘ื”ื“ืจื’ื” ืœื›ืชื™ื‘ ื” import, ื‘ื–ืžืŸ ืฉืžืชืื™ื ืœืคืจื•ื™ืงื˜ ืฉืœื›ื.

ToCode
1 420
# ืื™ืš ืœื”ืคื•ืš ืœืžืชื›ื ืชื™ ืคื™ื™ืชื•ืŸ ื˜ื•ื‘ื™ื ื™ื•ืชืจ ื ืชื—ื™ืœ ื‘ืžื” ืฉืœื ืขื•ื‘ื“ (ื•ื–ื” ืงืฆืช ืžืคืชื™ืข). ืืคืฉืจ ืœื“ืžื™ื™ืŸ ืฉื‘ืฉื‘ื™ืœ ืœื”ื™ื•ืช ืžืชื›ื ืชื™ ืคื™ื™ืชื•ืŸ ื˜ื•ื‘ื™ื ื™ื•ืชืจ ืขืœื™ื ื• ืœืœืžื•ื“ ื›ืžื” ืฉื™ื•ืชืจ APIs ืฉืœ ืคื™ื™ืชื•ืŸ. ืœืžืฉืœ ืื ื ืœืžื“ ื’ื ืœื›ืชื•ื‘ ืžืžืฉืงื™ื ื’ืจืคื™ื™ื, ื’ื ืœืงื‘ืœ ืžื™ื“ืข ืžื”ืจืฉืช, ื’ื ืœื ืชื— ืžื™ื“ืข ื•ื’ื ืœื‘ื ื•ืช ื‘ื™ื ื” ืžืœืื›ื•ืชื™ืช ืื– ื›ืœ API ื—ื“ืฉ ื™ื”ืคื•ืš ืื•ืชื ื• ืœืžืชื›ื ืชื™ ืคื™ื™ืชื•ืŸ ื˜ื•ื‘ื™ื ื™ื•ืชืจ. ืื‘ืœ ื–ื” ืœื ืžืžืฉ ืขื•ื‘ื“. ื”ื“ื‘ืจ ื”ื™ื—ื™ื“ ืฉืื ื—ื ื• ืžืงื‘ืœื™ื ืžืœืœืžื•ื“ ื›ืœ ื—ื•ื“ืฉ API ื—ื“ืฉ ืœื’ืžืจื™ ื”ื•ื ืกื—ืจื—ื•ืจืช. ืื ื—ื ื• ืžืงื‘ืœื™ื ืืช ื”ืชื—ื•ืฉื” ืฉื”ื˜ื›ื ื•ืœื•ื’ื™ื” ืจืฆื” ืžื”ืจ ืžื“ื™, ืฉืื™ ืืคืฉืจ ืืฃ ืคืขื ืœื“ืขืช ื”ื›ืœ, ืฉืœื ืžืฉื ื” ื›ืžื” ืื ื™ ืืœืžื“ ืชืžื™ื“ ืืฆื˜ืจืš "ืœื”ืชื—ื™ืœ ืžื—ื“ืฉ" ื•ืฉื”ืขื•ืœื ื”ื–ื” ืœื ื‘ืฉื‘ื™ืœื™. ืื ื—ื ื• ื›ืœ ืคืขื ืžืฉืงื™ืขื™ื ื‘ื“ื‘ืจื™ื ืฉืœื ื ืฉืืจื™ื, ื•ืื—ืจื™ ื—ื•ื“ืฉ ืื• ืฉื ื” ืžื’ืœื™ื ืฉื—ื–ืจื ื• ืœื ืงื•ื“ืช ื”ื”ืชื—ืœื”. ื“ืจืš ื˜ื•ื‘ื” ื™ื•ืชืจ ืœื”ืฉืชืคืจ ื‘ืชื•ืจ ืžืคืชื—ื™ ืคื™ื™ืชื•ืŸ, ืื• ื›ืœ ื˜ื›ื ื•ืœื•ื’ื™ื” ืื—ืจืช, ื”ื™ื ืœื”ืฉืงื™ืข ื‘ื“ื‘ืจื™ื ืฉื ืฉืืจื™ื. ื‘ืคื™ื™ืชื•ืŸ ื–ื” ื™ื”ื™ื”: 1. ืœื”ื‘ื™ืŸ ืื™ืš ืคื™ื™ืชื•ืŸ ืžื‘ื™ื ื” ื•ืžืจื™ืฆื” ืืช ื”ืชื•ื›ื ื™ืช ืฉืœื™. 2. ืœื”ื‘ื™ืŸ ืื™ืš ืœื”ืฉืชืžืฉ ื‘ Type Hints ื‘ืฆื•ืจื” ืฉืชื™ื™ืฆืจ ืขืจืš ื•ืชื”ืคื•ืš ืืช ื”ืงื•ื“ ืœืงืœ ื™ื•ืชืจ ืœืงืจื™ืื”. 3. ืœื”ื‘ื™ืŸ ืื™ืš ืœืขืฉื•ืช ื“ื‘ืจื™ื ื‘ืžืงื‘ื™ืœ, ื‘ืืžืฆืขื•ืช Threads, Processes ืื• async. 4. ืœื”ื‘ื™ืŸ ืžื” ื–ื” ืชื›ื ื•ืช ืžื•ื ื—ื” ืขืฆืžื™ื ื•ืื™ืš ืœืžื“ืœ ื‘ืืžืฆืขื•ืชื• ื‘ืขื™ื•ืช. 5. ืœื”ื‘ื™ืŸ ืื™ืš ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช ื‘ืฆื•ืจื” ื™ืขื™ืœื” ื•ืžื”ื™ืจื”. 6. ืœื”ื‘ื™ืŸ ืžื” ืžืฉืคื™ืข ืขืœ ื–ืžืŸ ื”ืจื™ืฆื” ืฉืœ ืชื•ื›ื ื™ืช ื•ืื™ืš ืœืžื“ื•ื“ ื•ืœืฉืคืจ ื–ืžื ื™ ืจื™ืฆื”. 7. ืœื”ื›ื™ืจ ืืช ื”ืžื‘ื ื™ื ื”ื™ื•ืชืจ ื‘ืกื™ืกื™ื™ื ืฉืœ ืคื™ื™ืชื•ืŸ ื›ืžื• Decorator ื• Metaclass ื•ืื™ื–ื” ืชืคืงื™ื“ ื”ื ืžืฉื—ืงื™ื ื‘ืกืคืจื™ื•ืช ืงื•ื“ ืžืจื›ื–ื™ื•ืช. 8. ืœื”ื‘ื™ืŸ ืืช ื”ืงืฉืจ ื‘ื™ืŸ Python ืœ C. ืื—ืจื™ ื–ื” ืื™ืš ืœื›ืชื•ื‘ ื”ืจื—ื‘ื•ืช ื‘ C ืœืคื™ื™ืชื•ืŸ, ื•ืื™ื–ื” ื—ื‘ื™ืœื•ืช ืคื™ื™ืชื•ืŸ ืžืจื›ื–ื™ื•ืช ืžืฉืชืžืฉื•ืช ื‘ื”ืจื—ื‘ื•ืช C ื›ื“ื™ ืœืฉืคืจ ื‘ื™ืฆื•ืขื™ื. ื›ืฉื™ืฉ ืกืคืง, ื”ืฉืงื™ืขื• ื‘ื“ื‘ืจื™ื ืฉื ืฉืืจื™ื.

ToCode
1 420
# ืจื™ืืงื˜ ื–ื”ื™ืจื•ืช! ืžื™ื“ืข ื’ืœื•ื‘ืืœื™ ื‘ื™ืŸ ื‘ื“ื™ืงื•ืช ื ืชื‘ื•ื ืŸ ื‘ืงื•ืžืคื•ื ื ื˜ื” ื”ื‘ืื” ืžืชื•ืš ื“ืฃ ื”ืคืชื™ื—ื” ืฉืœ swr:
import useSWR from 'swr'

function Profile () {
  const { data, error, isLoading } = useSWR('/api/user/123', fetcher)

  if (error) return <div>failed to load</div>
  if (isLoading) return <div>loading...</div>

  // render data
  return <div>hello {data.name}!</div>
}
ื•ื ื›ืชื•ื‘ ืชื•ื›ื ื™ืช ื‘ื“ื™ืงื” ืฉืžืฉื ื” ืืช fetch ื›ื“ื™ ืœื”ื—ื–ื™ืจ ืื•ื‘ื™ืงื˜ ืฉืœื ื•, ื‘ืฉื‘ื™ืœ ืฉืืคืฉืจ ื™ื”ื™ื” ืœื‘ื“ื•ืง ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื’ื ื‘ืœื™ ืœืฆืืช ืœืจืฉืช:

import { render, screen } from '@testing-library/react';
import Profile from './Profile;

test('test one', async () => {
  jest.spyOn(global, 'fetch').mockImplementation(url => Promise.resolve({
    json: () => Promise.resolve({ name: 'bug'})
  }));

  render(<Profile />);
  expect(await screen.findByText(/hello bug/));
});

ืงื•ื“ื ื›ืœ ืชืฉืžื—ื• ืœืฉืžื•ืข ืฉื”ืชื•ื›ื ื™ืช ืขื•ื‘ื“ืช. ืขื›ืฉื™ื• ืงืจืื• ืืช ื”ืงื•ื“ ืฉื•ื‘. ืจื•ืื™ื ืืช ื”ื‘ืขื™ื”? ## ืžื” ื ืฉื‘ืจ ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืืช ื”ืงื•ื“ ื ืฉื‘ืจ ืฆืจื™ืš ืจืง ืœื”ื•ืกื™ืฃ ืขื•ื“ ื‘ื“ื™ืงื”:
test('test two', async () => {
  jest.spyOn(global, 'fetch').mockImplementation(url => Promise.resolve({
    json: () => Promise.resolve({ name: 'oh no'})
  }));

  render(<Profile />);
  expect(await screen.findByText(/hello oh no/));
});
ื”ืคืขื ื”ื‘ื“ื™ืงื” ื”ืฉื ื™ื” ื›ื‘ืจ ื ื›ืฉืœืช. ืงืจื™ืื” ื‘ืœื•ื’ ืชืกืคืจ ืœื›ื ืฉื”ื›ื™ืฉืœื•ืŸ ืงืจื” ื‘ื’ืœืœ ืฉืขืœ ื”ืžืกืš ืžื•ืคื™ืขื” ื”ื”ื•ื“ืขื” hello bug, ืฉื”ืชืงื‘ืœื” ื‘ืชืฉื•ื‘ื” ื”ืงื•ื“ืžืช ืฉืœ ื” API. ื•ืžื” ืฉื™ื•ืชืจ ื’ืจื•ืข, ื›ืฉืชื ืกื• ืœื“ืœื’ ืขืœ ื”ื‘ื“ื™ืงื” ื”ืจืืฉื•ื ื” ื”ื‘ื“ื™ืงื” ื”ืฉื ื™ื” ืชืชื—ื™ืœ ืœืขื‘ื•ื“. ืžื”? ื›ืฉื™ืฉ ืœื ื• ื‘ื“ื™ืงื•ืช ืฉื›ืœ ืื—ืช ืœื‘ื“ ืžืฆืœื™ื—ื” ืื‘ืœ ื™ื—ื“ ื ื›ืฉืœื•ืช ื–ื” ืจืžื– ืžืื•ื“ ืขื‘ื” ืœืžื™ื“ืข ื’ืœื•ื‘ืืœื™ ืฉืžืฉื•ืชืฃ ืœืฉืชื™ ื”ื‘ื“ื™ืงื•ืช. ื‘ื“ื•ื’ืžื” ื›ืืŸ ื”ืžื™ื“ืข ื”ื’ืœื•ื‘ืืœื™ ื”ื•ื ื” Cache ืฉืœ swr. ื‘ืจื’ืข ืฉ swr ืžื•ืฉืš ืคืขื ืื—ืช ืืช ื”ืชืฉื•ื‘ื” ืžื”ืฉืจืช ืขื‘ื•ืจ URL ืžืกื•ื™ื, ื”ื•ื ื–ื•ื›ืจ ืืช ื”ืชืฉื•ื‘ื” ื•ืžืฉืชืžืฉ ื‘ื” ื’ื ืœื‘ื“ื™ืงื•ืช ื”ื‘ืื•ืช. ื‘ืื•ืคืŸ ืจื’ื™ืœ ื” Cache ื ืฉืžืจ ื‘ืชื•ืจ ืžืคื” ื’ืœื•ื‘ืืœื™ืช ืฉืžืฉื•ืชืคืช ืœื›ืœ ื”ื‘ื“ื™ืงื•ืช ื‘ืชื•ื›ื ื™ืช. ื”ืคื™ืชืจื•ืŸ ื”ืงืœ ื‘ืžืงืจื” ื”ื–ื” ื”ื•ื ืœื”ืฉืชืžืฉ ื‘ Cache ื ืคืจื“ ืœื›ืœ ื‘ื“ื™ืงื” ื‘ืืžืฆืขื•ืช ื”ืฆื’ืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื‘ืชื•ืš SWRConfig ืฉื•ื ื” ืขื Cache ืžืฉืœื• ื›ืžื• ืฉืžื•ืฆืข ื‘ื“ื™ื•ืŸ ื”ื–ื”. ื‘ืžืงืจื” ื”ื›ืœืœื™ ื™ื•ืชืจ ื—ืฉื•ื‘ ืœืฉื™ื ืœื‘ ื›ืฉืื ื—ื ื• ื›ื•ืชื‘ื™ื ื‘ื“ื™ืงื•ืช ืœืžื™ื“ืข ื”ื’ืœื•ื‘ืืœื™ ืฉืžืฉืคื™ืข ืขืœ ื”ื‘ื“ื™ืงื•ืช ืฉืœื ื• ื•ืœื ืงื•ืช ืื•ืชื• ื›ืš ืฉื›ืœ ื‘ื“ื™ืงื” ืชื•ื›ืœ ื‘ืืžืช ืœืจื•ืฅ ื‘ืฆื•ืจื” ืขืฆืžืื™ืช.

ToCode
1 420
# ืจื™ื™ืœืก ื”ื™ื•ื ืœืžื“ืชื™: ืœื ืžืขื‘ื™ืจื™ื ืžื–ื”ื™ื ืœืžื•ื“ืœ ื‘ื™ืฆื™ืจื” ืื• ืขื“ื›ื•ืŸ ืืช ื”ื˜ื™ืค ื”ื‘ื ืžืฆืืชื™ ื‘ืžืืžืจ ื”ื–ื” ืฉืœ ื—ื‘ืจืช Betterment ื•ืžื™ื“ ื”ืชื—ื‘ืจืชื™ ืื– ืื ื™ ืžืฉืชืฃ ื’ื ืคื”. ื ืชื—ื™ืœ ืขื ืงื•ื“ ืจื™ื™ืœืก ื”ื‘ื ืขื‘ื•ืจ controller:
class Documents::AttachmentsController < ApplicationController
    def create
        AttachmentLink.new(create_params.merge(document: document)).save!
    end
    
    private
    
    def create_params
        params.permit(:attachment_id, :caption)
    end
    
    def document
        current_user.documents.find(params[:document_id])
    end
end
ื”ืงื•ื“ ืžืืคืฉืจ ืœื”ืฆืžื™ื“ Attachments ืœืžืกืžืš ื“ืจืš ื”ืคื•ื ืงืฆื™ื” create. ื”ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช ืžื”ื“ืคื“ืคืŸ ืžื–ื”ื” ืฉืœ "ืงื•ื‘ืฅ ืžืฆื•ืจืฃ" ื•ืžื–ื”ื” ืฉืœ "ืžืกืžืš" ื•ื™ื•ืฆืจืช AttachmentLink ืฉื–ื” ืื•ื‘ื™ืงื˜ ื—ื™ื‘ื•ืจ ื‘ื™ืŸ ื”ืฉื ื™ื™ื. ืงื—ื• ืจื’ืข ืœืงืจื•ื ืืช ื”ืงื•ื“ ื•ื ืกื• ืœื—ืฉื•ื‘ ืžื” ืฉื‘ื•ืจ ื‘ื•. ## ื”ื‘ืขื™ื” ื‘ืงื•ื“: ืžืื™ืคื” ืžื’ื™ืข Attachment ืจืื™ืชื ืืช ื–ื”? ื”ืคื•ื ืงืฆื™ื” ื”ืคืจื˜ื™ืช document ื˜ื•ืขื ืช ืืช ื” Document ืžืชื•ืš ื›ืœ ื”ืžืกืžื›ื™ื ืฉืœ ื”ืžืฉืชืžืฉ, ื•ื›ืš ืžื•ื•ื“ืืช ืฉืื ื—ื ื• ืžื ืกื™ื ืœื”ืฆืžื™ื“ ืงื•ื‘ืฅ ืžืฆื•ืจืฃ ืœืžืกืžืš ืฉืœื ื•. ืœืขื•ืžืชื” ืžื–ื”ื” ื”ืงื•ื‘ืฅ ื”ืžืฆื•ืจืฃ ืžื•ืขื‘ืจ ื‘ืชื•ืจ id ืคื ื™ืžื” ืœืžื•ื“ืœ. ื˜ืขื™ื ืช ืื•ื‘ื™ืงื˜ ื” Attachment ืžืชื‘ืฆืขืช ืื•ื˜ื•ืžื˜ื™ืช ื‘ืชื•ืš ื”ืคื•ื ืงืฆื™ื” new ื•ืœื›ืŸ ืชื•ืงืฃ ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ื›ืœ ืžื–ื”ื” ืฉื™ืจืฆื” ื•ื›ืš ืœืฆืจืฃ ื›ืœ Attachment ืœืžืกืžืš ืฉืœื•. ื‘ืขืฆื ื”ืื—ืจื™ื•ืช ื”ืžืจื›ื–ื™ืช ืฉืœ ื” Controller ื‘ืจื™ื™ืœืก ื”ื™ื ืœื•ื•ื“ื ืฉื›ืœ ื”ืžื•ื“ืœื™ื ืฉื™ื™ื˜ืขื ื• ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื”ื ืžื•ื“ืœื™ื ืฉืœืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™ ื™ืฉ ื’ื™ืฉื” ืืœื™ื”ื, ื•ืœื›ืŸ ื–ื” ื”ืงื•ื ื˜ืจื•ืœืจ ืฉื—ื™ื™ื‘ ืœื˜ืขื•ืŸ ืืช ื›ืœ ื”ืžื•ื“ืœื™ื ื•ืœื•ื•ื“ื ื”ืจืฉืื•ืช. ืื ื ืขื‘ื™ืจ ืžื–ื”ื™ื ืคื ื™ืžื” ืœืคื•ื ืงืฆื™ื” new ืื– ื”ื™ื ืขืœื•ืœื” ืœื’ืฉืช ืœืžื•ื“ืœื™ื ืฉืœื ืงืฉื•ืจื™ื ืœืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™. ื‘ืจื’ืข ืฉืžื‘ื™ื ื™ื ืืช ื–ื” ื”ืชื™ืงื•ืŸ ื•ื’ื ื”ืžื ื™ืขื” ืคืฉื•ื˜ื™ื ืžืื•ื“. ื›ื›ื” ื–ื” ื ืจืื” ื‘ืงื•ื“:
class Documents::AttachmentsController < ApplicationController
    def create
        AttachmentLink.new(attach_params).save!
    end
    
    private
    
    def create_params
        params.permit(:attachment_id, :caption)
    end
    
    def attach_params
      {
        document: document,
        attachment: attachment,
        caption: create_params[:caption]
      }
    end
    
    def attachment
        current_user.attachments.find(create_params[:attachment_id])
    end
    
    def document
        current_user.documents.find(params[:document_id])
    end
end
ื”ื—ื‘ืจื™ื ื‘ Betterment ื’ื ื™ืฆืจื• ื›ืœืœื™ Rubocop ืฉื™ืขื–ืจื• ืœื›ื ืœื•ื•ื“ื ืฉืืชื ืœื ืžืขื‘ื™ืจื™ื ืžื–ื”ื™ื ืฉืœ ืžื•ื“ืœื™ื ืœืชื•ืš ืคื•ื ืงืฆื™ื•ืช ื”ืขื“ื›ื•ืŸ ื•ื”ื™ืฆื™ืจื” ืฉืœ ืจื™ื™ืœืก. ืืคืฉืจ ืœืžืฆื•ื ืืช ื”ื›ืœืœื™ื ื‘ืงื™ืฉื•ืจ ื”ื–ื” ื•ืื ืืชื ื›ื•ืชื‘ื™ื ื‘ืจื™ื™ืœืก ืฉื•ื•ื” ืœืฉืœื‘ ืื•ืชื ื’ื ื‘ื™ื™ืฉื•ืžื™ื ืฉืœื›ื: https://github.com/betterment/betterlint/

ToCode
1 420
# ื—ื“ืฉ ื‘ืืชืจ: ืžื™ื ื™ ืงื•ืจืก ื‘ื“ื™ืงื•ืช ื‘ืจื™ืืงื˜ ื–ื” ืœื ืคืฉื•ื˜ ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช, ื‘ืžื™ื•ื—ื“ ื‘ื“ื™ืงื•ืช ืœืงื•ื“ ืฆื“ ืœืงื•ื—. ื”ืจื‘ื” ืื ืฉื™ื ื—ื•ืฉื‘ื™ื ืฉื‘ื“ื™ืงื•ืช ืœื•ืงื—ื•ืช ืœื”ื ื–ืžืŸ ื•ื”ื ืžืขื“ื™ืคื™ื ืœื”ืฉืงื™ืข ืืช ื”ื–ืžืŸ ื”ื–ื” ื‘ื‘ื ื™ื™ืช ืคื™ืฆืณืจื™ื ื—ื“ืฉื™ื. ื”ื ืฉื•ื›ื—ื™ื ืฉื”ื“ื‘ืจ ื”ื›ื™ ืžืจื’ื™ื– ื‘ืžืขืจื›ื•ืช ื–ื” ื›ืฉืžืขืœื™ื ื’ื™ืจืกื” ื—ื“ืฉื” ื•ื›ืœ ื”ื“ื‘ืจื™ื ื”ื™ืฉื ื™ื ืžืคืกื™ืงื™ื ืœืขื‘ื•ื“. ืื ืฉื™ื ืื—ืจื™ื ื—ื•ืฉื‘ื™ื ืฉื‘ื“ื™ืงื•ืช End To End ื”ืŸ ื—ืฉื•ื‘ื•ืช, ืื‘ืœ ืขืœ ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ืืคืฉืจ ืœื•ื•ืชืจ. ื”ื ื ื›ื•ื• ืžืกืคื™ืง ืคืขืžื™ื ืžื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ืœื ื™ืขื™ืœื•ืช ืฉืœื ืžืฆืื• ืืช ื”ื‘ืื’ื™ื ื”ืืžื™ืชื™ื™ื ื‘ืžืขืจื›ืช. ื•ื™ืฉ ื’ื ืืช ืžื™ ืฉื‘ื˜ื•ื—ื™ื ืฉื‘ื“ื™ืงื•ืช ื–ื” ืจืขื™ื•ืŸ ืžืžืฉ ืžืฆื•ื™ืŸ ืื‘ืœ ืกืคืฆื™ืคื™ืช ื”ืžืขืจื›ืช ืฉืœื”ื ืžืกื•ื‘ื›ืช ืžื“ื™ ื•ื›ืจื’ืข ื™ืฉ ื™ื•ืชืจ ืžื“ื™ ื‘ืื’ื™ื. ื™ื•ื ืื—ื“ ื›ืฉื“ื‘ืจื™ื ืงืฆืช ื™ืชื™ื™ืฆื‘ื• ื”ื ื™ืฉืžื—ื• ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช. ืื ื’ื ืืชื ื—ืœืง ืžืื—ืช ื”ืงื‘ื•ืฆื•ืช ื‘ืจืฉื™ืžื” ืฉืœืžืขืœื” ืชืจื’ื™ืฉื• ื—ื•ืคืฉื™ ืœื”ืžืฉื™ืš ื”ืœืื”, ื”ืคื•ืกื˜ ื”ื–ื” ืœื ื‘ืฉื‘ื™ืœื›ื. ืžืฆื“ ืฉื ื™ ืื ืืชื ื”ื™ื•ื ืžืจื’ื™ืฉื™ื ืœื ื‘ื˜ื•ื—ื™ื ืœื’ื‘ื™ ื”ืงื•ื“ ืฉืœื›ื. ืื ืืชื ืžื‘ื™ื ื™ื ืฉืื™ ืืคืฉืจ ืœื”ืžืฉื™ืš ื›ืš ื›ืฉื›ืœ ืจื™ืคืงื˜ื•ืจ ืงื˜ืŸ ืฉื•ื‘ืจ ืื™ื ืกื•ืฃ ื“ื‘ืจื™ื. ืื ื’ื ืœื›ื ื ืžืืก ืœืขื‘ื•ืจ ื‘ื™ืŸ ื”ื“ืคื“ืคืŸ ืœ VS Code ื›ืœ ื”ื–ืžืŸ ื‘ืฉื‘ื™ืœ ืœื‘ื“ื•ืง ืฉื”ืงื•ื“ ืฉืืชื ื›ื•ืชื‘ื™ื ืขื•ื‘ื“ ื›ืžื• ืฉืฆืจื™ืš, ืื– ืชืฉืžื—ื• ืœืฉืžื•ืข ืฉื”ืขืœื™ืชื™ ื”ื™ื•ื ืžื™ื ื™ ืงื•ืจืก ื—ื“ืฉ ื‘ืžื˜ืจื” ืœืขื–ื•ืจ ืœื›ื ืœื”ืชื—ื™ืœ ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ืื• ืœืฉืคืจ ืืช ืจืžืช ื”ื‘ื“ื™ืงื•ืช ืฉืืชื ื›ื•ืชื‘ื™ื. ื”ืงื•ืจืก ื›ื•ืœืœ 6 ืกืจื˜ื™ ื•ื™ื“ืื• ื‘ืื•ืจืš ื›ื•ืœืœ ืฉืœ ืงืฆืช ืคื—ื•ืช ืžืฉืขื”, ื•ืขื•ืกืง ื‘ื ื•ืฉืื™ื: 1. ื”ื™ื›ืจื•ืช ืขื react-testing-library, ืื™ืš ื ืจืื™ืช ืชื•ื›ื ื™ืช ื‘ื“ื™ืงื” ื•ืื™ืš ืœื ืœื‘ื–ื‘ื– ื–ืžืŸ ื‘ื›ืชื™ื‘ืช ืชื•ื›ื ื™ื•ืช ื”ื‘ื“ื™ืงื”. 2. ื‘ื“ื™ืงืช ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืขื™ื ืขื user-event. 3. ื‘ื“ื™ืงืช ืงื•ืžืคื•ื ื ื˜ื•ืช ื”ืžื•ืฉืคืขื•ืช ืžื–ืžืŸ, ื’ื ื‘ืฆื•ืจื” ืืกื™ื ื›ืจื•ื ื™ืช ื•ื’ื ื‘ืืžืฆืขื•ืช ืฉืขื•ื ื™ื ืžื–ื•ื™ืคื™ื. 4. ื‘ื“ื™ืงืช ืชืงืฉื•ืจืช ื‘ืืžืฆืขื•ืช mock ืœืคื•ื ืงืฆื™ื™ืช fetch ื• Best Practices ืกื‘ื™ื‘ ื‘ื“ื™ืงื•ืช ื›ืืœื”. 5. ื‘ื“ื™ืงืช ืงื•ืžืคื•ื ื ื˜ื•ืช-ื‘ืชื•ืš-ืงื•ืžืคื•ื ื ื˜ื•ืช ื‘ืืžืฆืขื•ืช Jest Spies. 6. ื‘ื“ื™ืงืช ื™ื™ืฉื•ืžื™ื ื”ืžืฉืชืžืฉื™ื ื‘ Redux. ื”ืฉื™ืขื•ืจื™ื ืžืขืฉื™ื™ื, ื›ืœ ืฉื™ืขื•ืจ ืžื•ื“ื’ื ืขืœ ืงื•ืžืคื•ื ื ื˜ื•ืช ืืžื™ืชื™ื•ืช ืฉื›ืชื•ื‘ื•ืช ื‘ React ื• TypeScript ื•ื™ื™ืชืŸ ืœื›ื ื‘ืกื™ืก ื˜ื•ื‘ ืœื‘ื ื™ื™ืช ื‘ื“ื™ืงื•ืช ืœืžืขืจื›ื•ืช ืฉืœื›ื. ืื ื™ืฉ ืœื›ื ืžื ื•ื™ ืœืืชืจ ื™ื›ื•ืœื™ื ื›ื‘ืจ ืœื”ื™ื›ื ืก ื•ืœืฆืคื•ืช ื‘ืงื™ืฉื•ืจ: https://www.tocode.co.il/boosters/7 ื•ืื ืขื“ื™ื™ืŸ ืื™ืŸ ืœื›ื ืžื ื•ื™ ื”ื™ื•ื ื”ื•ื ื”ื–ื“ืžื ื•ืช ืžืฆื•ื™ื ืช ืœื”ื™ืจืฉื. ืคืฉื•ื˜ ืœื—ืฆื• ืขืœ ื”ืงื™ืฉื•ืจ ืœืงื•ืจืก ื›ื“ื™ ืœื”ื’ื™ืข ืœื“ืฃ ื”ื”ืจืฉืžื”.

ToCode
1 420
promise.status = 'rejected';
        promise.reason = reason;
      },
    );
    throw promise;
  }
}
ื”ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช Promise ื•ืžืฉืชืžืฉืช ื‘ throw ื›ื“ื™ ืœื‘ืจื•ื— ืžื”ืคื•ื ืงืฆื™ื” ืฉืงืจืื” ืœื” ืื ื” Promise ืขื“ื™ื™ืŸ ืœื ืžื•ื›ื ื”. ืงื•ืžืคื•ื ื ื˜ืช Suspense ืชืชืคื•ืก ืืช ื” Promise ื•ืชืฆื™ื’ ืืช ื” Fallback Content, ื•ืื•ื˜ื•ืžื˜ื™ืช ื›ืฉื” Promise ื™ืกืชื™ื™ื ืชืจื ื“ืจ ืžื—ื“ืฉ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืคื ื™ืžื™ืช. ื”ื—ืœืง ื”ืื—ืจื•ืŸ ื‘ื“ื•ื’ืžื” ื”ื•ื ื”ืคื•ื ืงืฆื™ื” fetchData. ืื—ืกื•ืš ืœื›ื ืืช ื”ืžื™ืžื•ืฉ ื›ื™ ื”ื•ื ืœื ื—ืฉื•ื‘, ื–ืืช ืคืฉื•ื˜ ืคื•ื ืงืฆื™ื” ืืกื™ื ื›ืจื•ื ื™ืช ืฉืžืงื‘ืœืช ืžื™ื“ืข ืžื”ืฉืจืช. ## ืžืคืœ ื‘ืงืฉื•ืช ืืกืคืงื˜ ื ื•ืกืฃ ืฉืœ Suspense ืฉืงืฆืช ืขื•ื‘ืจ ืžืชื—ืช ืœืจื“ืืจ ื”ื•ื ื”ื™ื—ืก ืœื‘ืขื™ื” ืฉื ืงืจืืช ืžืคืœ ื‘ืงืฉื•ืช. ื”ื‘ืขื™ื” ื‘ื’ื“ื•ืœ ืขืฉื•ื™ื” ืœื”ื™ื’ืจื ื›ืฉื™ืฉ ืœื ื• ืงื•ืžืคื•ื ื ื˜ื•ืช ืžืงื•ื ื ื•ืช ืฉื›ืœ ืื—ืช ืžื”ืŸ ืฆืจื™ื›ื” ืœืงื‘ืœ ืžื™ื“ืข ืื—ืจ ืžื”ืฉืจืช. ื ื“ืžื™ื™ืŸ ืžืฉื”ื• ื‘ืกื’ื ื•ืŸ: 1. ืงื•ืžืคื•ื ื ื˜ื” ืฉืœ ื˜ื•ืคืก ื”ื—ืœืคืช ืกื™ืกืžื” ื‘ืžืกืš "ื”ื—ืฉื‘ื•ืŸ ืฉืœื™", ืฉื‘ืฉื‘ื™ืœ ืœื”ื™ื˜ืขืŸ ืฆืจื™ื›ื” ืœืงื‘ืœ ืžื”ืฉืจืช ืืช ืคืจื˜ื™ ื”ืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™. 2. ื‘ืชื•ื›ื” ืงื•ืžืคื•ื ื ื˜ื” ืฉืœ Captcha ืฉืฆืจื™ื›ื” ืœืงื‘ืœ ืžืฉืจืช ืื—ืจ ืืช ื”ืฆื™ื•ืจ ืฉืœ ื”ืื•ืชื™ื•ืช ื”ืžื•ื–ืจื•ืช ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืžืฉืชืžืฉ ืื›ืŸ ื‘ืŸ ืื“ื. ื‘ืžืฆื‘ ืจื’ื™ืœ ืฉืœ ืงื•ืžืคื•ื ื ื˜ื” ื‘ืชื•ืš ืงื•ืžืคื•ื ื ื˜ื”, ืจืง ืื—ืจื™ ืฉืงื•ื ืคื•ื ื ื˜ืช ื”ื˜ื•ืคืก ืชืกื™ื™ื ืœื˜ืขื•ืŸ ื•ืœื”ืชืจื ื“ืจ ืขืœ ื”ืžืกืš ืืคืฉืจ ื™ื”ื™ื” ืœื”ืžืฉื™ืš ืœืžืฉื•ืš ืืช ื”ืžื™ื“ืข ืžืงื•ืžืคื•ื ื ื˜ืช ื” Captcha. ื‘ื—ืœืง ืžื“ืคื™ ื”ืชื™ืขื•ื“ ืขืœ Suspense ื”ื ืžื“ื‘ืจื™ื ืขืœ ื”ื‘ืขื™ื” ื”ื–ื•, ื‘ืื—ืจื™ื ืœื. ื ืฉื™ื ืœื‘ ืฉืฉื™ืžื•ืฉ ื ืื™ื‘ื™ ื‘ Suspense ืœื ื™ืคืชื•ืจ ืืช ื‘ืขื™ื™ืช ื”ืžืคืœ ื›ื™ ื” throw ืฉื™ืขืฆื•ืจ ืืช ื”ืจื™ื ื“ื•ืจ ืฉืœ ืงื•ืžืคื•ื ื ื˜ืช ื”ื˜ื•ืคืก ื™ืžื ืข ืจื™ื ื“ื•ืจ ืฉืœ ืงื•ืžืคื•ื ื ื˜ืช ื” Captcha ื”ืคื ื™ืžื™ืช ื™ื•ืชืจ. ื›ืŸ ืืคืฉืจ ืœืืจื’ืŸ ืื—ืจืช ืืช ืขืฅ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื•ืœืžืฉื•ืš ืืช ื”ืžื™ื“ืข ื‘ืงื•ืžืคื•ื ื ื˜ื” ื‘ืจืžื” ื’ื‘ื•ื”ื” ื™ื•ืชืจ ืื• ืžืชื•ืš ืกืคืจื™ื™ืช ื ื™ื”ื•ืœ ื”ืกื˜ื™ื™ื˜ ื›ื“ื™ ืœืฆืืช ืžื–ื”, ืื‘ืœ ื‘ื›ืœ ืžืงืจื” Suspense ื™ื”ื™ื” ืจืง ื—ืœืง ืงื˜ืŸ ืžื”ืคื™ืชืจื•ืŸ ื›ืืŸ. ## ืžื” ืืคืฉืจ ืœืขืฉื•ืช ื‘ืžืงื•ื Suspense? ืื ื ืกื›ื ื”ื™ืชืจื•ืŸ ื”ื’ื“ื•ืœ ืฉืœ Suspense ื”ื•ื ื‘ื™ื›ื•ืœืช ืœื˜ืคืœ ื‘ืžืกืคืจ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฉื˜ื•ืขื ื•ืช ืžื™ื“ืข ื•ืœื”ืฆื™ื’ ืงื•ืžืคื•ื ื ื˜ืช Loading ืžืกื•ื“ืจืช ืื—ืช ืฉืžืจื›ื–ืช ืืช ื›ืœ ื”ื˜ืขื™ื ื•ืช. ืœืคื ื™ Suspense ื”ืคื™ืชืจื•ืŸ ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ ืœืžืฆื‘ ื”ื–ื” ื”ื•ื ืœื‘ืฆืข ืืช ื›ืœ ื”ื˜ืขื™ื ื•ืช ืžื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืจืืฉื™ืช ื•ืœื”ืขื‘ื™ืจ ืืช ื”ืžื™ื“ืข ืฉื ื˜ืขืŸ ืœื™ืœื“ื™ื ื›ืฉื”ื•ื ืžื•ื›ืŸ, ืžืฉื”ื• ื‘ืกื’ื ื•ืŸ ื”ื–ื”:
export default function ArtistPage({ artist }) {
  const { data, isLoading } = useSWR(`/${artist.id}/albums`);
  return (
    <>
      <h1>{artist.name}</h1>
      {isLoading ? <Loading /> : <Albums data={albums} />}
    </>
  );
}
ื”ื™ืชืจื•ืŸ ื‘ื’ื™ืฉื” ื›ื–ืืช ื”ื•ื ืฉืื ื—ื ื• ืžืงื‘ืœื™ื ืื•ื˜ื•ืžื˜ื™ืช ื”ืคืจื“ื” ื‘ื™ืŸ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืฉืœ ื”ืœื•ื’ื™ืงื” (ืืœื” ืฉืฉื•ืœื—ื•ืช ื‘ืงืฉื•ืช ืจืฉืช) ืœืงื•ืžืคื•ื ื ื˜ื•ืช ืคืฉื•ื˜ื•ืช ื™ื•ืชืจ ืฉืœ ืชืฆื•ื’ื” ืฉื ืžืฆืื•ืช ื‘ืชื•ื›ืŸ. ื”ื—ื™ืกืจื•ืŸ ื”ื•ื ืฉื”ื›ืชื™ื‘ื” ืžืื•ื“ ืจื™ื›ื•ื–ื™ืช ื•ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื‘ืœื‘ืœ ื›ืฉืฆืจื™ืš ืœืฉื ื•ืช ื ืชื™ื‘ื™ื ืื• ื›ืฉื™ืฉ ืœื•ื’ื™ืงื” ื™ื•ืชืจ ืžืฉืžืขื•ืชื™ืช ืกื‘ื™ื‘ ื”ื‘ืงืฉื”, ืœื“ื•ื’ืžื” ืื Albums ืฆืจื™ืš ืœืงื—ืช ืืช ื”ืžื™ื“ืข ืฉืžื’ื™ืข ืžื”ืฉืจืช ื•ืœืขืฉื•ืช ืขืœื™ื• ืื™ื–ื•ืฉื”ื™ ืžื ื™ืคื•ืœืฆื™ื” ืœืคื ื™ ืฉื™ื›ื•ืœ ืœื”ืฆื™ื’ ืื•ืชื•. ## ืื– ืœืฉื›ืชื‘? ืžืฆื“ ืื—ื“ ืœ Suspense ื™ืฉ ืงืœืฃ ืžื ืฆื— ื‘ืฉืจื•ื•ืœ - ื”ื•ื ื‘ืืžืช ืžืืคืฉืจ ื”ืจื‘ื” ื™ื•ืชืจ ื‘ืงืœื•ืช ืœื‘ื ื•ืช ื“ืฃ ืฉืžื•ืจื›ื‘ ืžื”ืจื‘ื” ืงื•ืžืคื•ื ื ื˜ื•ืช, ืฉื›ืœ ืื—ืช ืžื”ืŸ ืžื•ืฉื›ืช ืžื™ื“ืข ืžื”ืฉืจืช ื•ื›ื•ืœืŸ ื™ื—ื“ ืžืฆื™ื’ื•ืช ืžืกืš ื˜ืขื™ื ื” ืื—ื“. ืžืฆื“ ืฉื ื™ ื” Use Case ื”ื–ื” ื”ืจื‘ื” ืคื—ื•ืช ื ืคื•ืฅ ืžืžื” ืฉืžื“ืžื™ื™ื ื™ื. ื‘ื”ืจื‘ื” ืžืขืจื›ื•ืช ื™ืฉ ืœื™ ื ืชื™ื‘ ืื—ื“ ื‘ืฉืจืช ืฉืžื—ื–ื™ืจ ืืช ื›ืœ ื”ืžื™ื“ืข ืฉืœ "ื“ืฃ" ืžืกื•ื™ื, ื•ืื– ืื ื™ ืžืฉืชืžืฉ ื‘ useSWR (ืื• ืžืงื‘ื™ืœื•ืช ืฉืœื•) ืจืง ื‘ืงื•ืžืคื•ื ื ื˜ื” ื”ืจืืฉื™ืช ืฉืœ ื”ื“ืฃ ื•ืžืคื–ืจ ืืช ื”ืžื™ื“ืข ืฉืงื™ื‘ืœืชื™ ื‘ื™ืŸ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช. ื‘ืขื•ื“ ื”ืจื‘ื” ืžืขืจื›ื•ืช ื›ืŸ ื™ื”ื™ื• ืœื™ ืงื•ืžืคื•ื ื ื˜ื•ืช ืงื˜ื ื•ืช ืฉื˜ื•ืขื ื•ืช ืืช ืขืฆืžืŸ, ืื‘ืœ ื›ืฉื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ื™ื•ื“ืขืช ืœื”ืฆื™ื’ ืืช ืขืฆืžื” ื’ื ื‘ืžืฆื‘ "ื˜ืขื™ื ื”", ืœืžืฉืœ ื‘ืžืขืจื›ืช ืฉืžืฆื™ื’ื” ืขืœ ื”ืžืกืš ื›ืžื” ื’ืจืคื™ื, ืื– ื”ื’ื™ื•ื ื™ ืœืจืื•ืช ืืช ื”ื’ืจืคื™ื ื ื˜ืขื ื™ื ื‘ืฆื•ืจื” ืขืฆืžืื™ืช ืื—ื“ ืื—ืจื™ ื”ืฉื ื™. ืื– ื›ืŸ ื›ื“ืื™ ืœื”ื›ื™ืจ ืืช Suspense, ื›ื“ืื™ ืœื”ืฉืชืžืฉ ื‘ื• ื›ืฉืฆืจื™ืš, ืื‘ืœ ืืœ ืชืขืฆืจื• ืขื›ืฉื™ื• ื”ื›ืœ ื‘ืฉื‘ื™ืœ ืœืฉื›ืชื‘ ืืช ื›ืœ ืงื•ื“ ื”ืชืงืฉื•ืจืช ืฉืœื›ื ืขื Suspense. ื‘ืจื•ื‘ ื”ืžืขืจื›ื•ืช ืืคืฉืจ ืœื”ืกืชื“ืจ ื˜ื•ื‘ ืžืื•ื“ ื’ื ื‘ืœืขื“ื™ื•.