ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 420
Obunachilar
Ma'lumot yo'q24 soatlar
+27 kunlar
-230 kunlar
Postlar arxiv
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.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, ืฉืื ืืืืจ ืืืฉืืืืชื.
## ืืืืื ืืกืืืื ืืืืชืืช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.1 420
# ืื, ืืฉืืคื
ืืืขืื ืืืืืื ืืฉืืคืื ืงืื ืืื ืฉืืฉืฆืจืื ืืชืงื ืืฉืื ืื ืื ื ืฆืจืืืื ืืชืงื ืืืืื ืืงืืืืช ืืืงืืื. ืื ืขื ืขืืฉืื ืืื ืื ืืืชืจ 3 ื ืื ื ืืืืื, ืืขืืฉืื ืื ื ืืืกืืฃ ื ืื ืจืืืขื ืื ื ืฆืจืื ืืขืืื ืืช ืื ืืืคืื ืฉืืฆืืืื ื ืื ืืืืื. ืื ืื ื ืฉืืืจ ืืช "ืงืื ืื ืื" ืืืงืื ืืื ืืจืง ืืืขื ืืืชื ืืื ืฉืืจ ืืืคืื, ืื ืืกืืชื ืื ืขืืืื ืืฉืฆืจืื ืืฉื ืืช ืืช ืืืืืืงื.
ืืื ืืืขืื ืืืืืื ืืงืื ืื ืจื ืืื ืฉืงืฉื ืืืชืืืื ืขื ืฉืื ืืืื ืฉืื ืฆืจืืืื ืืืฉืคืืข ืขื ืื ืืืคืื. ืืืืืื ืฉื ื ืื ืืืืื ืงื ืืจืืืช ืฉืื ืืฉื ื ืื ืื ื ืฉื ืืช ืื ืื ืืืฃ "ืฉืืขืืจ ืืงืืจืก" ืื ืืืฃ "ืืงืืื ืืืืืื ืจ" ืื ื ืจืืฆื ืืจืืืช ืืช ืืืืืื ืืืืชื ืืืคื. ืืืืช ืืคืฉืืื ืืืืช ืืกืชืืืช ืืื ืฉืืืืืฉืื ืืืชืจ ืืืืืงื ืขื ืืงืื ืืื ืจื.
ืื ื ืืฉืืจ ืืืืืื ืฉื ื ืื ืืืืืื ืฉืื, ืื ืืืื ืื ื ืืจืฆื ืืืืกืืฃ ืื ืื ืื ืฉืฉืืืจ ืืืคื ืืืืชื ืืืืืื ืืื ืฉืคืขื ืืืื ืฉืชืืืขื ืืืชืจ ืชืืืื ืืืืฉืื ืืฆืคืืช ืืืืชื ื ืงืืื, ืืื ืืขืื ืฉืคืืฆ'ืจ ืืื ื ืฉืืข ืืืืืง ืขืืืจ ืฉืืขืืจืื ืืงืืจืก, ืืื ืืจืื ืคืืืช ืืฉืื ืืฉืฆืืคืื ืืืงืืื ืืืืืื ืจ.
ืชืขืฉื Zoom Out ืืืืืืื ืื ืืื ืืจืืืช ืืช ืืืขืื - ืืฉืฉื ื ืืืจืื ืชืืื ืืชืืืืื ืืืืืืงื ืื ืืืืช ืขืืืจ ืืืฆืืจ ืืืกืืจืงืฆืื ืืืืชืื ืืช ืืงืื ืจืง ืคืขื ืืืช. ืืฉืฉื ื ืืืจืื ืืฉืชื ืื ืืฆืืจืืช ืฉืื ืืช ืืืืื ืื ืืืงืจื ืืชื ืืืื ืืืื ืืื ืืืจ ืืืจ ืืชื ืืื ืืืจืช, ืืืืืืจ ืืื ืืื ืจืง ืืกืื.
ืืื ืืื ืืืงืจืื ืืืืื ืื ื ืืขืืืฃ ืืฉืืคื ืงืื ืืื ืืืชืืืฅ ืืืืชืื ืคืื ืงืฆืื ืืืช ืฉืขืืฉื ืืื:
1. ืืฉืื ื ืจืง ืืื ื ืคืืฆ'ืจ ืืืฉ, ืืขืืืื ืื ืืืื ืื ืืื ืฆืจืื ืืืืื.
2. ืืงืื ืืืืงืืช - ืฉืืคืื ืงืื ืืืืงื ื ืืชื ืืช ืืืืืฉืืช ืืฉื ืืช ืชืืื ืจืง ืืช ืืืืืงืืช ืฉืืืฉืคืขืืช ืืฉืื ืื ืืคืืฆ'ืจ ืืกืืื, ืืื ืืืืื ืฉืฉืืจืชื ืืืจืื ืื ืงืฉืืจืื.
3. ืกืงืจืืคืืื ืฉืื ื ืืืชื ืืืฉืืื ืืกืืืืช (ืืื ืคืจืกืื ืืืืื ืืื ืืืืืจื). ืืชืืื ืฉื ืืกืงืจืืคื ืืืคืก ืืคืืื ืื ืืืง ืืื ื ืื ืฉืืคืื ืฉื ืงืื ืงืืื ืขืืืื ืฉืืื ืืช ืืืืืฅ, ืื ืืื ืื ื ืืืืข ืฉืื ืชืืงืื ืฉืื ืืืื ืื ืื ืืฉืืืจ ืฉืื ืืืจ ืืืจ ืืืขืจืืช.
4. ืืฉืื ืืืกืืจืงืฆืื ืฉืื ื ืื ืกื ืืื ืืช ืื ืืืฉ "ืืกืชืืจืช" ืืืฉืืืจื ืืืื ืคืื ืืช ืืืงืจื ืงืฆื.
ืืื ืืฆืืข ืืื ืืื ืืืชืื ืงืื ืืืฉ ืืืืฉืช ืืฉืืคืื, ืืืืื ืงืืขื ืงืื ืืฉืื ื Refactoring, ืืฉืื ืื ื ืืืืืื ืืชืืืืืช ืืคืืฆ'ืจืื ืืื ืฉื ื ืืื ืื ืื ืื.
1 420
# ืชืืงืื ืฉื ืฉืืจื (ืขื ืืืื ืืืืงืืช)
## ืื ื ืืคืจืืืงื ืฉืืื ืื ืืืืงืืช
ืดื ื ืืจืืจ ืฉืื ืื ืขืื ืืื ืืชืืงืื ืืืฉ ืคืฉืื. ืฉื ืื ืืชืงื ืืืขืื ืืืจืกืืด
ืขืฉืจ ืืงืืช ืืืืืจ ืืืชืจ-
ืดืืฃ ืืื ืื ืืืื ืืืฉืชืืฉ ืืืชืจ?? ืืื ืื ืืืื ืืืืืช? ืฉื ืื ืืืืง ืืืืืืืด,
ืดืื ืื ืืจืืจ ืืื ืื ืจืืืชื ืืช ืื... ืจืืข ืืชืงืืด
ืฉืืืฉื ืืืืฉืื ืืืืืจ ืืืชืจ-
ืดืื ืืืช ืืืืจืช ืืชืงืื ืืืจื? ืืืจ ืชืืงื ื ืืช ืื ืฉืืืฉ ืคืขืืื. ืืื ืืคืืืช ืื ืชืืงืื ืฉืื ืื ื ืืืืจืืืด
## ืื ื ืืคืจืืืงื ืฉืืฉ ืื ืืืืงืืช
ืดื ื ืืจืืจ ืฉืื ืื ืขืื ืืื ืืชืืงืื ืืืฉ ืคืฉืื. ืืืงื ืื ืืื ืฉืขืืช ืืืชืื ืืืืงื ืืืืืืืืช ืืชืจืืืฉ ืฉืืฆืืช ืืื ืขื ืืขืจื ืชืืื ืืืจืกื ืืืฉื.
5 ืฉืขืืช ืืืืืจ ืืืชืจ-
ืดืฉืืืข ืืืืจืกื ืืืืฉื ืืืืืืจ. ืชืืืงื ืจืง ืฉืืื ืขืื ืืื ืฉืฆืจืื ืืืืื ื ืขืืืด
ืฉืืืฉื ืืืืฉืื ืืืืืจ ืืืชืจ, ืืขืงืืืช ืืืฉืืื ืืืืงื ืืืืืืืืช-
ืดืืืื ืงืืข ืฉืืืชื ืืืืจื ืืืชืจืืืฉ ืืื ืืืื ืืจืืคืงืืืจืื ื. ืืื ืฉืืืืชื ืืืชืื ืืืืงื ืืื ืื ืืืขืืืช ืืืจืกื ืฉืืืจืืด.
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, ืืืื ืฉืืชืืื ืืคืจืืืงื ืฉืืื.1 420
# ืืื ืืืคืื ืืืชืื ืชื ืคืืืชืื ืืืืื ืืืชืจ
ื ืชืืื ืืื ืฉืื ืขืืื (ืืื ืงืฆืช ืืคืชืืข). ืืคืฉืจ ืืืืืื ืฉืืฉืืื ืืืืืช ืืชืื ืชื ืคืืืชืื ืืืืื ืืืชืจ ืขืืื ื ืืืืื ืืื ืฉืืืชืจ APIs ืฉื ืคืืืชืื. ืืืฉื ืื ื ืืื ืื ืืืชืื ืืืฉืงืื ืืจืคืืื, ืื ืืงืื ืืืืข ืืืจืฉืช, ืื ืื ืชื ืืืืข ืืื ืืื ืืช ืืื ื ืืืืืืชืืช ืื ืื API ืืืฉ ืืืคืื ืืืชื ื ืืืชืื ืชื ืคืืืชืื ืืืืื ืืืชืจ.
ืืื ืื ืื ืืืฉ ืขืืื.
ืืืืจ ืืืืื ืฉืื ืื ื ืืงืืืื ืืืืืื ืื ืืืืฉ API ืืืฉ ืืืืจื ืืื ืกืืจืืืจืช. ืื ืื ื ืืงืืืื ืืช ืืชืืืฉื ืฉืืืื ืืืืืื ืจืฆื ืืืจ ืืื, ืฉืื ืืคืฉืจ ืืฃ ืคืขื ืืืขืช ืืื, ืฉืื ืืฉื ื ืืื ืื ื ืืืื ืชืืื ืืฆืืจื "ืืืชืืื ืืืืฉ" ืืฉืืขืืื ืืื ืื ืืฉืืืื. ืื ืื ื ืื ืคืขื ืืฉืงืืขืื ืืืืจืื ืฉืื ื ืฉืืจืื, ืืืืจื ืืืืฉ ืื ืฉื ื ืืืืื ืฉืืืจื ื ืื ืงืืืช ืืืชืืื.
ืืจื ืืืื ืืืชืจ ืืืฉืชืคืจ ืืชืืจ ืืคืชืื ืคืืืชืื, ืื ืื ืืื ืืืืืื ืืืจืช, ืืื ืืืฉืงืืข ืืืืจืื ืฉื ืฉืืจืื. ืืคืืืชืื ืื ืืืื:
1. ืืืืื ืืื ืคืืืชืื ืืืื ื ืืืจืืฆื ืืช ืืชืืื ืืช ืฉืื.
2. ืืืืื ืืื ืืืฉืชืืฉ ื Type Hints ืืฆืืจื ืฉืชืืืฆืจ ืขืจื ืืชืืคืื ืืช ืืงืื ืืงื ืืืชืจ ืืงืจืืื.
3. ืืืืื ืืื ืืขืฉืืช ืืืจืื ืืืงืืื, ืืืืฆืขืืช Threads, Processes ืื async.
4. ืืืืื ืื ืื ืชืื ืืช ืืื ืื ืขืฆืืื ืืืื ืืืื ืืืืฆืขืืชื ืืขืืืช.
5. ืืืืื ืืื ืืืชืื ืืืืงืืช ืืฆืืจื ืืขืืื ืืืืืจื.
6. ืืืืื ืื ืืฉืคืืข ืขื ืืื ืืจืืฆื ืฉื ืชืืื ืืช ืืืื ืืืืื ืืืฉืคืจ ืืื ื ืจืืฆื.
7. ืืืืืจ ืืช ืืืื ืื ืืืืชืจ ืืกืืกืืื ืฉื ืคืืืชืื ืืื Decorator ื Metaclass ืืืืื ืชืคืงืื ืื ืืฉืืงืื ืืกืคืจืืืช ืงืื ืืจืืืืืช.
8. ืืืืื ืืช ืืงืฉืจ ืืื Python ื C. ืืืจื ืื ืืื ืืืชืื ืืจืืืืช ื C ืืคืืืชืื, ืืืืื ืืืืืืช ืคืืืชืื ืืจืืืืืช ืืฉืชืืฉืืช ืืืจืืืืช C ืืื ืืฉืคืจ ืืืฆืืขืื.
ืืฉืืฉ ืกืคืง, ืืฉืงืืขื ืืืืจืื ืฉื ืฉืืจืื.
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 ืืฉืื ืืื ืฉืืืฆืข ืืืืื ืืื. ืืืงืจื ืืืืื ืืืชืจ ืืฉืื ืืฉืื ืื ืืฉืื ืื ื ืืืชืืื ืืืืงืืช ืืืืืข ืืืืืืืื ืฉืืฉืคืืข ืขื ืืืืืงืืช ืฉืื ื ืืื ืงืืช ืืืชื ืื ืฉืื ืืืืงื ืชืืื ืืืืช ืืจืืฅ ืืฆืืจื ืขืฆืืืืช.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/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
ืืื ืขืืืื ืืื ืืื ืื ืื ืืืื ืืื ืืืืื ืืช ืืฆืืื ืช ืืืืจืฉื. ืคืฉืื ืืืฆื ืขื ืืงืืฉืืจ ืืงืืจืก ืืื ืืืืืข ืืืฃ ืืืจืฉืื.
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. ืืจืื ืืืขืจืืืช ืืคืฉืจ ืืืกืชืืจ ืืื ืืืื ืื ืืืขืืื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
