uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
ToCode
1 419
# ืžื“ืจื™ืš ืงื•ื“: ืฉืœื™ืคื” ืžื‘ืกื™ืก ื ืชื•ื ื™ื ื‘ Node.JS ื•ื”ืฆื’ืช ื”ืžื™ื“ืข ื›ื˜ื‘ืœื ื‘ HTML ื‘ืคื•ืกื˜ ื–ื” ืื“ื’ื™ื ืื™ืš ืœื›ืชื•ื‘ ืืคืœื™ืงืฆื™ื™ืช Node.JS ื• Express ืคืฉื•ื˜ื”, ืฉืฉื•ืœืคืช ืžื™ื“ืข ืžื‘ืกื™ืก ื ืชื•ื ื™ื ื‘ืืžืฆืขื•ืช ืกืคืจื™ื™ืช Knex.JS ื•ืžืฆื™ื’ื” ืื•ืชื• ื‘ืชื•ืจ ื˜ื‘ืœื” ื‘ HTML. ื—ืกืจื™ ื”ืกื‘ืœื ื•ืช ื‘ื™ื ื™ื›ื ืžื•ื–ืžื ื™ื ืœื“ืœื’ ืขืœ ื”ื”ืกื‘ืจ ื•ืœืงืคื•ืฅ ื™ืฉืจ ืœืงื•ื“ ื‘ืžืื’ืจ: https://github.com/ynonp/node-knex-ejs-demo ืœื›ืœ ื”ืฉืืจ - ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ื”ืžืฉื™ืžื” ื‘ืžื“ืจื™ืš ื”ื–ื” ืžืื•ื“ ืคืฉื•ื˜ื” - ื™ืฉ ืœื ื• ืืคืœื™ืงืฆื™ื™ืช Node.JS ืฉืžืฉืชืžืฉืช ื‘ Express ื•ื‘ EJS. ืื ื™ ื™ื•ื“ืข ื›ื•ืœื ืจื’ื™ืœื™ื ืœืจืื•ืช ืจื™ืืงื˜ ื• Ajax ื•ืคืจื™ื™ืžื•ื•ืจืงืก ืžืชื•ื—ื›ืžื™ื ืฉืœ ืคืจื•ื ื˜ ืื ื“, ืื‘ืœ ื”ืืžืช ืฉื™ืฉ ื”ืจื‘ื” ืืคืœื™ืงืฆื™ื•ืช ื‘ืขื•ืœื ืฉืขื“ื™ื™ืŸ ื›ืชื•ื‘ื•ืช ื‘ื’ื™ืฉื” ื”ืงืœืืกื™ืช ืฉืœ ื™ืฆื™ืจืช HTML ื‘ืฆื“ ืฉืจืช, ื›ื•ืœืœ ืืคืœื™ืงืฆื™ื•ืช ื—ื“ืฉื•ืช. ื‘ื›ืœ ืžืงืจื” ื”ืžืขืจื›ืช ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื”ื™ื ื›ื–ืืช - ื™ืฉ ืœื” EJS View ืฉื ืจืื” ื‘ืขืจืš ื›ืš:
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
  </body>
</html>
ื•ืขื›ืฉื™ื• ืื ื—ื ื• ืจื•ืฆื™ื ืœื—ื‘ืจ ืื•ืชื” ืœื‘ืกื™ืก ื ืชื•ื ื™ื. ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ื™ืฆืจืชื™ ื‘ืกื™ืก ื ืชื•ื ื™ื ืžืกื•ื’ SQLite3 ืขื ื˜ื‘ืœื” ืื—ืช ื‘ืฉื users ื•ื‘ืชื•ื›ื” ื”ื ืชื•ื ื™ื ื”ื‘ืื™ื:
sqlite> select * from users;
user|user@mysite.com
admin|admin@mysite.com
info|info@mysite.com
sales|sales@mysite.com
ืœืขืžื•ื“ื” ื”ืจืืฉื•ื ื” ืงื•ืจืื™ื name ื•ื™ืฉ ื‘ื” ืืช ืฉื ื”ืžืฉืชืžืฉ ื•ืœืขืžื•ื“ื” ื”ืฉื ื™ื” ืงื•ืจืื™ื email ื•ื”ื™ื ืžื›ื™ืœื” ืืช ื›ืชื•ื‘ืช ื”ืžื™ื™ืœ ืฉืœ ื”ืžืฉืชืžืฉ. ## ื”ืงื•ื‘ืฅ lib/db.js ืื ื™ ืื•ื”ื‘ ืœื”ืชื—ื™ืœ ื‘ืงื•ื‘ืฅ ื—ื™ื‘ื•ืจ ืœื‘ืกื™ืก ื ืชื•ื ื™ื. ืื ื”ืฉืœื™ืคื•ืช ืžืชื•ื—ื›ืžื•ืช ืื• ื”ืžืขืจื›ืช ื’ื“ื•ืœื” ื™ื”ื™ื” ืœื™ ื ื•ื— ืœื›ืชื•ื‘ ื‘ืงื•ื‘ืฅ ื”ื–ื” ื’ื ืคื•ื ืงืฆื™ื•ืช ืขื–ืจ ืœืฉืœื™ืคื•ืช, ืื‘ืœ ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื”ื›ืœ ืขื“ื™ื™ืŸ ืคืฉื•ื˜ ื•ืœื›ืŸ ืžืกืคื™ืง ืœื›ืชื•ื‘ ื‘ื• ืืช ืงื•ื“ ื”ื—ื™ื‘ื•ืจ ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื•ืœื™ื™ืฆื ืžืžื ื• ืืช ื”ืื•ื‘ื™ืงื˜ knex, ืื™ืชื• ืงื•ื“ ื—ื™ืฆื•ื ื™ ื™ื•ื›ืœ ืœื›ืชื•ื‘ ืืช ื”ืฉืœื™ืคื•ืช:
const knex = require('knex')({
  client: 'sqlite3', // or 'better-sqlite3'
  connection: {
    filename: "./mydb.sqlite"
  },
  useNullAsDefault: true,
});

module.exports = knex;
## ื”ืงื•ื‘ืฅ routes/index.js ื”ืชื—ื ื” ื”ืฉื ื™ื” ื”ื™ื ืงื•ื“ ื”ื˜ื™ืคื•ืœ ื‘ื‘ืงืฉื” ื‘ืงื•ื‘ืฅ routes/index.js. ืงื•ื“ ื–ื” ืฆืจื™ืš ืœืฉืœื•ืฃ ืืช ื”ืžื™ื“ืข ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื. ื›ืœ ืขื•ื“ ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉืื™ืŸ ื”ืจื‘ื” ืžื™ื“ืข ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘:
router.get('/', async function(req, res, next) {
  const users = await knex('users').select('*');
  res.render('index', { title: 'Express', users: users });
});
ื›ื›ืœ ืฉื™ื”ื™ื” ื™ื•ืชืจ ืžื“ื™ ื ืฆื˜ืจืš ืœืฉืœื•ืฃ ืจืง "ื“ืฃ" ืื—ื“ ืžืžื ื• ื‘ืืžืฆืขื•ืช ื”ื•ืกืคืช limit. ื ืจืฆื” ื’ื ืœืชืช ืœืžืฉืชืžืฉื™ื ืืคืฉืจื•ืช ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจื™ื ื›ื“ื™ ืœืงื‘ื•ืข ื›ืžื” ืจืฉื•ืžื•ืช ื™ื”ื™ื• ื‘ื“ืฃ ื•ื‘ืื™ื–ื” ื“ืฃ ืœืฆืคื•ืช, ื•ื‘ืžืขืจื›ื•ืช ืขื•ื“ ื™ื•ืชืจ ืžื•ืจื›ื‘ื•ืช ื ืจืฆื” ืœืงื‘ืœ ื’ื ืคืจืžื˜ืจื™ื ืขื‘ื•ืจ ืกื™ื ื•ื ื™ื - ืœื“ื•ื’ืžื” ืคืจืžื˜ืจ ืฉืžื’ื™ืข ืžื”ืžืฉืชืžืฉ ืฉืื•ืžืจ ืฉืฆืจื™ืš ืœื”ืฆื™ื’ ืจืง ืืช ื”ืžืฉืชืžืฉื™ื ืฉื›ืจื’ืข ืžื—ื•ื‘ืจื™ื ืœืžืขืจื›ืช. ืฉื™ื ื•ื™ื™ื ืืœื” ืžืฉืคื™ืขื™ื ืขืœ ืฉื•ืจืช ื”ืฉืœื™ืคื”, ื•ื ืฉื™ื ืœื‘ ืœืฉื ื™ ื”ื“ื‘ืจื™ื ื”ื—ืฉื•ื‘ื™ื ื‘ืคื•ื ืงืฆื™ื” ื”ืงื˜ื ื” ื”ื–ื•: 1. ืื ื™ ืžืฉืชืžืฉ ื‘ await ื›ื“ื™ ืœืงื‘ืœ ืืช ื”ืชื•ืฆืื•ืช ืžืžืฉ ืฉืœ ื”ืฉืœื™ืคื”, ื•ืœื ืืช ื”ืฉืœื™ืคื” ืขืฆืžื”. 2. ืื ื™ ืžืขื‘ื™ืจ ืืช ื”ืชื•ืฆืื•ืช ืœ View. ## ื”ืฆื’ืช ื”ืžื™ื“ืข ื›ื˜ื‘ืœื” ื‘ืงื•ื‘ืฅ views/index.ejs ื”ืงื•ื‘ืฅ ื”ืื—ืจื•ืŸ ื”ื•ื ื” View. ืงื•ื‘ืฅ ื–ื” ืจืฅ ื‘ืœื•ืœืื” ืขืœ ื”ืจืฉื•ืžื•ืช ื‘ืžืฉืชื ื” users ื•ื‘ื•ื ื” ืžื”ืŸ ื˜ื‘ืœืช HTML:
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <p>All users = <%= JSON.stringify(users) %></p>
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Email</th>
        </tr>
      </thead>
      <tbody>
        <% for (user of users) { %>
        <tr>
          <td><%= user.name %></td>
          <td><%= user.email %></td>
        </tr>
        <% } %>
      </tbody>
    </table>
  </body>
</html>
ืื ื™ ื”ื•ืกืคืชื™ ื’ื ื”ื“ืคืกื” ืฉืœ ื›ืœ ื”ื ืชื•ื ื™ื ื‘ืคื•ืจืžื˜ JSON ื‘ืฉื‘ื™ืœ ืฉื ื•ื›ืœ ืœื”ื™ื•ืช ื‘ื˜ื•ื—ื™ื ืฉื”ื˜ื‘ืœื” ืžืฆื™ื’ื” ืืช ื›ืœ ื”ืžื™ื“ืข. ื›ืžื•ื‘ืŸ ืฉื‘ืžืขืจื›ืช ืืžื™ืชื™ืช ื–ื” ืžืฉื”ื• ืฉื ืจืฆื” ืœื”ื•ืจื™ื“. ## ืžื” ื”ืœืื” ืจืื™ื ื• ื‘ืคื•ืกื˜ ืืช ื”ืžืกืœื•ืœ ืฉืขื•ื‘ืจ ืžื™ื“ืข ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื, ื“ืจืš ืงื•ื“ ืฆื“ ืฉืจืช ื•ืขื“ ืฉื”ื•ืคืš ืœ HTML. ื”ื”ืจื—ื‘ื” ื”ืžืจื›ื–ื™ืช ืœื“ื•ื’ืžื” ื”ื–ืืช ืชื”ื™ื” ืงื‘ืœืช ืคืจืžื˜ืจื™ื ืžื”ืžืฉืชืžืฉ ื›ื“ื™ ืœื”ืฆื™ื’ ืจืง ื—ืœืง ืžื”ืžื™ื“ืข ื›ืืฉืจ ื™ืฉ ื‘ื˜ื‘ืœื” ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื™ื•ืชืจ ืžื“ื™ ืžื™ื“ืข. ืกืคืจื™ื” ืžืขื ื™ื™ื ืช ื‘ื”ืงืฉืจ ื”ื–ื” ื”ื™ื knex-paginate, ืฉืชืชืŸ ืœื›ื ืœื›ืชื•ื‘ ืงื•ื“ ื›ื–ื”:
const result = await knex('persons')

ToCode
1 419
# ื”ื™ื•ื ืœืžื“ืชื™: ื”ืกื™ืžืŸ ื ืงื•ื“ื•ืชื™ื™ื ืกืœืืฉ ื‘ื’ื™ื˜ ืœื›ื‘ื•ื“ ืคืกื—, ืงื‘ืœื• ื˜ื™ืค ื’ื™ื˜ ืงืฆืจ ืฉืื ื™ ื’ื™ืœื™ืชื™ ืœืื—ืจื•ื ื” ื•ืื•ืœื™ ื™ืขื–ื•ืจ ื’ื ืœื›ื - ื•ื”ื•ื ื”ืกื™ืžืŸ ื ืงื•ื“ื•ืชื™ื™ื ื•ืื—ืจื™ื• ืœื•ื›ืกืŸ. ืžืฉืžืขื•ืช ื”ืกื™ืžืŸ ื”ื™ื ื”ืชื™ืงื™ื” ื”ืจืืฉื™ืช ื‘ืคืจื•ื™ืงื˜, ื•ื”ื•ื ืžืืคืฉืจ ืœื ื• ืœื”ืจื™ืฅ ืคืงื•ื“ืช ื’ื™ื˜ ืขืœ ื”ืชื™ืงื™ื” ื”ืจืืฉื™ืช ื’ื ืื ื›ืจื’ืข ืื ื—ื ื• ื‘ืชื•ืš ืื™ื–ื•ืฉื”ื™ ืชืช ืชื™ืงื™ื”. ื“ื•ื’ืžืื•ืช? ื‘ื˜ื—- ื ื ื™ื— ืฉืืชื ืจื•ืฆื™ื ืœืจืื•ืช ืืช ื›ืœ ื”ืงื‘ืฆื™ื ืฉื’ื™ื˜ ืขื•ืงื‘ ืื—ืจื™ื”ื ื‘ืžืื’ืจ, ืื‘ืœ ืืชื ื›ืจื’ืข ื‘ืชื•ืš ืชื™ืงื™ื” ืคื ื™ืžื™ืช. ืืชื ื›ื•ืชื‘ื™ื:
$ git ls-files
ื•ืœื ืžืงื‘ืœื™ื ื›ืœื•ื ืื• ืžืงื‘ืœื™ื ืจืง ืืช ื”ืงื‘ืฆื™ื ืฉื ืžืฆืื™ื ืืฆืœื›ื ื‘ืชื™ืงื™ื” ื”ืคื ื™ืžื™ืช. ื‘ืžืงื•ื ื–ื”, ืชื•ื›ืœื• ืœื›ืชื•ื‘:
$ git ls-files :/
ื•ืชืงื‘ืœื• ืืช ืจืฉื™ืžืช ื›ืœ ื”ืงื‘ืฆื™ื ืฉื‘ืžืขืงื‘. ืื•, ื ื ื™ื— ืฉืืชื ื‘ืื•ืชื” ืชื™ืงื™ื” ืคื ื™ืžื™ืช ื•ื‘ื”ืคืขืœืช ืกื˜ื˜ื•ืก ืืชื ืžืงื‘ืœื™ื:
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   ../agenda.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        ./
        ../react-list/

no changes added to commit (use "git add" and/or "git commit -a")
ืžื” ืฉืื•ืžืจ ืฉื’ื ื”ืชื™ืงื™ื” ืฉืื ื™ ื ืžืฆื ื‘ื” ืื™ื ื” ืฉืžื•ืจื” ื‘ื’ื™ื˜, ื’ื ื”ืงื•ื‘ืฅ agenda.md ืฉื ืžืฆื ื‘ืชื™ืงื™ื” ืžืขืœื™ื™ ื”ืฉืชื ื” ื•ื’ื ื”ืชื™ืงื™ื” react-list ืฉื ืžืฆืืช ื‘ืชื™ืงื™ื” ืžืขืœื™ื™ ืื™ื ื” ืฉืžื•ืจื” ื‘ื’ื™ื˜. ื‘ืžืฆื‘ ื›ื–ื” ืื ื™ ื™ื•ื“ืข ืฉืื ื™ ื™ื›ื•ืœ ืœื”ืคืขื™ืœ add ืขืœ ื”ืชื™ืงื™ื” ืฉื‘ื“ื™ื•ืง ืžืขืœื™ื™ ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืืช ืฉืœื•ืฉืช ื”ืงื‘ืฆื™ื, ืื‘ืœ ื›ื›ืœ ืฉื”ืฉื™ื ื•ื™ื™ื ื™ื”ื™ื• ืžืคื•ื–ืจื™ื ื‘ื™ื•ืชืจ ืชื™ืงื™ื•ืช ื–ื” ืื•ืœื™ ื™ื”ื™ื” ืžืกื•ื‘ืš. ื‘ืžืงื•ื ื–ื” ืื ื™ ืžืคืขื™ืœ:
$ git add :/
ื•ืžื•ืกื™ืฃ ืœืื™ื ื“ืงืก ืืช ื›ืœ ื”ืงื‘ืฆื™ื ืฉื”ืฉืชื ื• ื‘ื›ืœ ื”ืคืจื•ื™ืงื˜.

ToCode
1 419
ื™ื™ืชืจื•ืŸ ืจืืฉื•ืŸ ืฉืื ื—ื ื• ืจื•ืื™ื ื‘ื”ืชืงื ืช git-lfs ื”ื•ื ืฉืคืขื•ืœื•ืช add ื• commit ื”ื•ืคื›ื•ืช ืœื”ืจื‘ื” ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ื™ืจื•ืช. ื”ืกื™ื‘ื” ื”ื™ื ืฉื’ื™ื˜ ืžื ืกื” ืœื›ื•ื•ืฅ ืงื‘ืฆื™ื ืฉื”ื•ื ืžื›ื ื™ืก ืœืžืื’ืจ, ื•ื›ื™ื•ื•ืฅ ืงื•ื‘ืฅ ื‘ื™ื ืืจื™ ืขื ืง ื”ื•ื ืคืฉื•ื˜ ื‘ื–ื‘ื•ื– ื–ืžืŸ. ืขื git lfs ืื ื—ื ื• ื—ื•ืกื›ื™ื ืืช ื”ื‘ื–ื‘ื•ื– ื”ื–ื”. ื™ื™ืชืจื•ืŸ ืฉื ื™ ื•ืื•ืœื™ ื™ื•ืชืจ ืžืœื”ื™ื‘ ื”ื•ื ื”ืืคืฉืจื•ืช ืœืขืฉื•ืช clone ืœืžืื’ืจ ื‘ืœื™ ื”ืงื‘ืฆื™ื ื”ื’ื“ื•ืœื™ื. ื”ืคืงื•ื“ื”:
$ GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/ynonp/large-files-with-lfs.git skip-smudg
e
ืžืฉื›ืคืœืช ืืช ื”ืžืื’ืจ ืชื•ืš ื“ื™ืœื•ื’ ืขืœ ืžืฉื™ื›ืช ื”ืงื‘ืฆื™ื ื”ื’ื“ื•ืœื™ื ื•ื”ืฉืืจืช ืจืง ื”ืžื™ื“ืข ื”ืžื ื”ืœืชื™ ืขืœื™ื”ื. ืื—ืจื™ ื”ืคืขืœื” ืื ื™ ื™ื›ื•ืœ ืœืจืื•ืช ืฉืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ืฉืœื™ ื ืฉืืจื” ืงื˜ื ื˜ื•ื ืช (ื•ื›ืžื•ื‘ืŸ ืคืขื•ืœืช ื” clone ื”ื™ืชื” ืžืื•ื“ ืžื”ื™ืจื”):
$ cd skip-smudge
$ du -sh .
140K    .
ืื ื ื ืกื” ืœื”ืกืชื›ืœ ืขืœ ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ ื ืงื‘ืœ ืืช ืื•ืชื” ื’ื™ืจืกื” ืฉื”ื™ืชื” ืฉืžื•ืจื” ื‘ืžืื’ืจ:
$ cat myfile.bin
version https://git-lfs.github.com/spec/v1
oid sha256:fc4d5fa4f28329049cb1c1bdda562a7e6aa3472efbf94cc280f1f2aa9c6790a5
size 104857600
ื•ืžืชื™ ืฉืืฆื˜ืจืš ืื ื™ ื™ื›ื•ืœ ืœื”ื•ืจื™ื“ ืืช ื”ืงื‘ืฆื™ื ื”ื’ื“ื•ืœื™ื ื‘ื’ื™ืจืกื” ืฉื›ืจื’ืข ื ืžืฆืืช ืืฆืœื™ ืขื ื”ืคืงื•ื“ื”:
$ git lfs pull
ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื”ืคืงื•ื“ื” ืžื•ืจื™ื“ื” ืจืง ืขื•ืชืง ืื—ื“ ืฉืœ ื”ืงื•ื‘ืฅ myfile.bin ื•ืœื ืืช ืฉื ื™ ื”ืขื•ืชืงื™ื ืฉื™ืฉ ื‘ืžืื’ืจ.

ToCode
1 419
# ืžื“ืจื™ืš: ืื™ื—ืกื•ืŸ ืงื‘ืฆื™ื ื’ื“ื•ืœื™ื ื‘ื’ื™ื˜ ืขื git lfs ื›ื•ืœื ืื•ืžืจื™ื ืฉื’ื™ื˜ ืœื ื˜ื•ื‘ ื‘ืื™ื—ืกื•ืŸ ืงื‘ืฆื™ื ื‘ื™ื ืืจื™ื™ื. ื‘ืคื•ืกื˜ ื–ื” ืื ื™ ืจื•ืฆื” ืœื”ืกื‘ื™ืจ ืงืฆืช ืžื” ื”ื‘ืขื™ื” ืฉืœ ื’ื™ื˜ ืขื ืงื‘ืฆื™ื ื‘ื™ื ืืจื™ื™ื ื’ื“ื•ืœื™ื, ื•ืœื”ืจืื•ืช ืืช ื”ืชื•ืกืฃ git lfs ืฉืคื•ืชืจ ื—ืœืง ื’ื“ื•ืœ ืžืื•ืชื” ื‘ืขื™ื”. ## ื”ื—ื™ื™ื ืขื ืงื‘ืฆื™ื ื’ื“ื•ืœื™ื ื”ื“ืจืš ื”ื›ื™ ืงืœื” (ื•ื‘ืจื•ื‘ื” ื ื›ื•ื ื”) ืœื—ืฉื•ื‘ ืขืœ ื ื™ื”ื•ืœ ื”ืžื™ื“ืข ืฉืœ ื’ื™ื˜ ื”ื™ื ืฉื›ืœ ืงื•ืžื™ื˜ ื‘ื’ื™ื˜ ื”ื•ื ืขื•ืชืง ืฉืœ ื›ืœ ืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ื‘ืจื’ืข ืžืกื•ื™ื. ื‘ืชื•ืš ื”ื”ืงืฉืจ ื”ื–ื” ื‘ืจื•ืจื” ื”ื‘ืขื™ื” ืขื ืงื‘ืฆื™ื ื’ื“ื•ืœื™ื - ื”ื ื ืฉืžืจื™ื ืฉื•ื‘ ื•ืฉื•ื‘ ื•ืžื ืคื—ื™ื ืืช ื”ืžืื’ืจ. ื ื™ืฆื•ืจ ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ืžืื’ืจ ืขื ืงื•ื‘ืฅ ื’ื“ื•ืœ. ืื ื™ ืžืคืขื™ืœ ืืช ื”ืคืงื•ื“ื”:
$ dd if=/dev/random of=myfile.bin bs=1m count=100
ื•ืžืงื‘ืœ ืงื•ื‘ืฅ ื‘ืฉื myfile.bin ื‘ื’ื•ื“ืœ 100 ืžื’ื”. ืื—ืจื™ ื–ื” ืื ื™ ื™ื•ืฆืจ ืžืื’ืจ ื’ื™ื˜ ื•ืžื•ืกื™ืฃ ืืช ื”ืงื•ื‘ืฅ ืœืžืื’ืจ ื•-ื”ื•ืค, ื”ืคืจื•ื™ืงื˜ ืฉืœื™ ืชื•ืคืก ื›ื‘ืจ 200 ืžื’ื” - ื›ื™ ื™ืฉ ืœื™ ืขื•ืชืง ืื—ื“ ืฉืœ ื”ืงื•ื‘ืฅ ื”ื’ื“ื•ืœ ื‘ืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ื•ืขื•ืชืง ื ื•ืกืฃ ื‘ืžืื’ืจ ื‘ืชื™ืงื™ื™ืช .git. ืื ืื ื™ ื™ื•ืฆืจ ื’ื™ืจืกื” ื ื•ืกืคืช ืฉืœ ื”ืงื•ื‘ืฅ ื•ืžื•ืกื™ืฃ ื’ื ืื•ืชื” ืœืžืื’ืจ ื”ืชื™ืงื™ื” ืชืขื‘ื•ืจ ื›ื‘ืจ ืืช ื” 300 ืžื’ื”. ื–ื” ืื•ืžืจ ืฉื›ืฉืื ื™ ื“ื•ื—ืฃ ืืช ื”ืžืื’ืจ ืœื’ื™ื˜ื”ืื‘ ืื ื™ ืฆืจื™ืš ืœื”ืขืœื•ืช 300 ืžื’ื”. ื›ืฉืžื™ืฉื”ื• ืื—ืจ ืžื•ืจื™ื“ ืขื•ืชืง ืฉืœ ื”ืžืื’ืจ ื”ื•ื ืฆืจื™ืš ืœื”ื•ืจื™ื“ 300 ืžื’ื”. ื•ื›ื›ืœ ืฉื™ื”ื™ื• ื™ื•ืชืจ ื’ื™ืจืกืื•ืช ืœืงื•ื‘ืฅ ื”ื’ื“ื•ืœ, ื›ืš ื”ื’ื•ื“ืœ ืฉืœ ื”ืžืื’ืจ ื™ื’ื“ืœ ื•ื›ืœ ื”ืคืขื•ืœื•ืช ื™ื”ื™ื• ืื™ื˜ื™ื•ืช ื‘ืฆื•ืจื” ืžื•ืจื’ืฉืช. ## ืื– ืžื” ื–ื” git lfs ื”ืชื•ืกืฃ git lfs ืขื•ืฉื” ื“ื‘ืจ ื—ืžื•ื“ - ื‘ืžืงื•ื ืœืฉืžื•ืจ ืืช ื”ืงื‘ืฆื™ื ื”ื’ื“ื•ืœื™ื ื‘ืžืื’ืจ, ื”ื•ื ืžื–ื”ื” ืื•ืชื ื‘ื“ื™ื•ืง ืœืคื ื™ ืฉื”ื ื ื›ื ืกื™ื ืœืžืื’ืจ ื•ืžืขื‘ื™ืจ ืื•ืชื ืœืชื™ืงื™ื” ืื—ืจืช, ืฉืื™ื ื” ื—ืœืง ืžื”ืžืื’ืจ. ื‘ืชื•ืš ื”ืจื™ืคื• ื™ื™ืฉืžืจื• ืจืง ืžืฆื‘ื™ืขื™ื ืœืื•ืชื ืงื‘ืฆื™ื, ื•ืžื™ ืฉื™ืจืฆื” ืืช ื”ืงื‘ืฆื™ื ื”ื’ื“ื•ืœื™ื ื™ืฆื˜ืจืš ืœื”ื•ืจื™ื“ ืื•ืชื ื‘ื ืคืจื“. ื”ืชื™ืงื™ื” ื”ืื—ืจืช ื‘ื“ืจืš ื›ืœืœ ืชืฉื‘ ื‘ืชื•ืš ืชื™ืงื™ื™ืช .git ื•ื‘ืฉื‘ื™ืœ ืœื”ื–ื™ื– ืืช ื”ืงื‘ืฆื™ื ื”ื’ื“ื•ืœื™ื ืœืชื™ืงื™ื” ื”ืžื™ื•ื—ื“ืช git lfs ืžืฉืชืžืฉ ื‘ filter, ืฉื–ื” ืžื ื’ื ื•ืŸ ืฉืœ ื’ื™ื˜ ืฉืžืืคืฉืจ ืœื”ืจื™ืฅ ืคืงื•ื“ื” ืœืคื ื™ ืฉืงื•ื‘ืฅ ื ื›ื ืก ืœืจื™ืคื• ื•ืคืงื•ื“ื” ืื—ืจืช ื›ืฉื”ืงื•ื‘ืฅ ืฆืจื™ืš ืœืฆืืช ืžื”ืจื™ืคื• ืœืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื”. ื‘ืฉื‘ื™ืœ ืœืขื‘ื•ื“ ืขื git lfs ืืชื ืฆืจื™ื›ื™ื ืœื”ืชืงื™ืŸ ืืช ื”ืชื•ืกืฃ ืœื›ืœ ื”ืžืขืจื›ืช ืฉืœื›ื ืžื”ืืชืจ ืฉืœื”ื: https://git-lfs.github.com/ ื•ืื—ืจื™ ื–ื” ื‘ื›ืœ ืจื™ืคื• ืฉืจื•ืฆื™ื ืœืขื‘ื•ื“ ืื™ืชื• ืฆืจื™ืš ืœื”ืคืขื™ืœ ื‘ืชื•ืš ืชื™ืงื™ื™ืช ื”ืจื™ืคื•:
$ git lfs install
## ืื™ืš ื–ื” ืขื•ื‘ื“ ื“ื•ื’ืžื”? ื‘ืจื•ืจ. ื™ืฆืจืชื™ ืจื™ืคื• ืฉื™ืฉ ื‘ื• ืงื•ื‘ืฅ ื’ื“ื•ืœ ื•ื”ืคืขืœืชื™ ื‘ืชื•ื›ื• ืืช:
$ git lfs install
ื‘ืฉื‘ื™ืœ ืฉ git lfs ื™ื•ื›ืœ ืœืขืฉื•ืช ืืช ื”ืงืกื ืฉืœื•. ื”ืคืงื•ื“ื” ื”ืจืืฉื•ื ื” ืฉืฆืจื™ืš ืœื”ื›ื™ืจ ื”ื™ื git lfs track. ืœืงื•ื‘ืฅ ืฉืœื™ ืงื•ืจืื™ื myfile.bin ื•ืœื›ืŸ ืื ื™ ืžืคืขื™ืœ:
$ git lfs track -f myfile.bin
ื›ื“ื™ ืœืกืžืŸ ืœ git lfs ืฉื”ืงื•ื‘ืฅ myfile.bin ื”ื•ื ืงื•ื‘ืฅ ื’ื“ื•ืœ ื•ืฆืจื™ืš ืœื˜ืคืœ ื‘ื• ื‘ื”ืชืื. ืืคืฉืจ ื’ื ืœื”ืขื‘ื™ืจ ืœ track ืชื‘ื ื™ื•ืช ืœืงื‘ืฆื™ื (ื•ืื– ืžื•ื•ืชืจื™ื ืขืœ ื” -f) ืœืžืฉืœ:
$ git lfs track "*.bin"
ื”ื“ื‘ืจ ื”ื–ื” ื™ื•ืฆืจ ืงื•ื‘ืฅ .gitattributes ืื ืœื ืงื™ื™ื ืืฆืœื›ื ื‘ืชื™ืงื™ื” (ืื• ืžื•ืกื™ืฃ ืฉื•ืจื” ืœืงื•ื‘ืฅ ืื ื›ื‘ืจ ืงื™ื™ื), ื•ืฉื ื”ื•ื ืžืกืžืŸ ืฉื”ืงื•ื‘ืฅ ืื• ื”ืชื‘ื ื™ืช ื ื›ื ืกื™ื ืœืžืขืงื‘:
$ cat .gitattributes
myfile.bin filter=lfs diff=lfs merge=lfs -text
ืขื›ืฉื™ื• ืืคืฉืจ ืœื”ื•ืกื™ืฃ ืืช ื”ืงื•ื‘ืฅ ืœืžืื’ืจ:
$ git add myfile.bin
$ git commit -m 'initial commit'
ื•ืืคื™ืœื• ืœื”ื›ื ื™ืก ื’ื™ืจืกื” ื ื•ืกืคืช ืฉืœื•:
$ dd if=/dev/random of=myfile.bin bs=1m count=100
$ git commit -a -m 'commit 2'
ื•ืœื–ื” ื”ื™ื• ื›ืžื” ืชื•ืฆืื•ืช ืžืขื ื™ื™ื ื•ืช. ื”ืจืืฉื•ื ื” ื”ื™ื ืฉืชื™ืงื™ื™ืช .git/objects ืฉืœื™ ืžืžืฉ ืงื˜ื ื”:
$ du -sh .git/objects
 32K    .git/objects
ื•ื–ื” ื‘ื’ืœืœ ืฉื”ืงื‘ืฆื™ื ืขืฆืžื ื ืฉืžืจื™ื ื‘ืชื™ืงื™ื” ืื—ืจืช:
$ du -sh .git/lfs/objects
200M    .git/lfs/objects
ื•ื›ืฉืื ื™ ืžืกืชื›ืœ ื‘ืชื•ืš ื”ืจื™ืคื•ื–ื™ื˜ื•ืจื™ ืขืœ ื”ืงื•ื‘ืฅ:
$ git ls-files --stage -- myfile.bin
100644 e0ffbeb5780cceeeef67522f4bc092751c4e7409 0       myfile.bin

$ git cat-file blob e0ffbeb5780cceeeef67522f4bc092751c4e7409

version https://git-lfs.github.com/spec/v1
oid sha256:fc4d5fa4f28329049cb1c1bdda562a7e6aa3472efbf94cc280f1f2aa9c6790a5
size 104857600
ืื ื™ ืจื•ืื” ืฉืื ื™ ืœื ืžืงื‘ืœ ืืช ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ ืืœื ืจืง ืฉืœื•ืฉ ืฉื•ืจื•ืช ืฉืžืกืคืจื•ืช ืžืฉื”ื• ืขืœ ื”ืงื•ื‘ืฅ ื”ืžืงื•ืจื™. ื–ื” ื›ืœ ืžื” ืฉ git lfs ืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœื”ื‘ื™ื ืืช ื”ืงื•ื‘ืฅ ื”ื’ื“ื•ืœ ื”ืžืงื•ืจื™ ืื ื ื‘ืงืฉ ืžืžื ื•. ื›ืจื’ืข ื”ืงื‘ืฆื™ื ื”ื’ื“ื•ืœื™ื ื ืžืฆืื™ื ืืฆืœื™ ื‘ืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ื•ื’ื ื›ืฉืื ื™ ื“ื•ื—ืฃ ืืช ื”ืคืจื•ื™ืงื˜ ืฉืœื™ ืœื’ื™ื˜ื”ืื‘ ื”ื ื™ื™ืฉืœื—ื• ืœืฉื. ื”ืคืจื•ื™ืงื˜ ืœื“ื•ื’ืžื” ื ืžืฆื ื›ืืŸ: https://github.com/ynonp/large-files-with-lfs ## ืžื” ื”ืจื•ื•ื—ื ื•

ToCode
1 419
# ืคื•ื—ื“ืช ืžื”ืคืื“ื™ื—ื” ืœื™ืคื•ืœ ืœืžืชื›ื ืชื™ื ืฆืขื™ืจื™ื ืจื‘ื™ื ืื™ืŸ ื‘ืขื™ื” ืœื‘ื•ื ื‘ื”ืฆืขื•ืช ืžืจื—ื™ืงื•ืช ืœื›ืช, ืœื”ื›ื ื™ืก ื›ืœื™ื ื—ื“ืฉื™ื ื•ืคืจื™ื™ืžื•ื•ืจืงื™ื ื—ื“ืฉื™ื ืœืžืขืจื›ืช ื•ืืคื™ืœื• ืœื™ื–ื•ื ื•ืœื”ืขื‘ื™ืจ ื”ืจืฆืื•ืช ืขืœ ื ื•ืฉืื™ื ืฉื”ื ื›ืžืขื˜ ืœื ืžื›ื™ืจื™ื. ืื•ืชื ืžืชื›ื ืชื™ื ืžื‘ื™ื ื™ื ืืช ื”ืคื•ื˜ื ืฆื™ืืœ ื‘ืžื•ื ื™ื˜ื™ืŸ ืฉื™ื•ื›ืœื• ืœืฆื‘ื•ืจ, ื•ื™ื•ื“ืขื™ื ืฉืžืžื™ืœื ืื™ืŸ ืœื”ื ื”ืจื‘ื” ืžื•ื ื™ื˜ื™ืŸ ืœืื‘ื“. ื›ื›ืœ ืฉืื ื—ื ื• ื’ื“ืœื™ื ื”ืžื•ื›ื ื•ืช "ืœืงื—ืช ืกื™ื›ื•ื ื™ื" ื ื—ืœืฉืช. ื”ืจื•ื•ื— ืฉื™ืฆื ืœื™ ืžืœื”ื›ื ื™ืก ื›ืœื™ ื—ื“ืฉ ืœืžืขืจื›ืช ื”ื•ื ื›ื ืจืื” ืœื ื’ื‘ื•ื”, ื•ื”ืกื™ื›ื•ืŸ ืžืฉืžืขื•ืชื™. ืžืชื›ื ืชืช ื•ื•ืชื™ืงื” ืขืฉื•ื™ื” ืœื”ืจื’ื™ืฉ ืฉืžืฆืคื™ื ืžืžื ื” ืœื”ื›ื™ืจ ืœืขื•ืžืง ื›ืœื™ ืžืกื•ื™ื ืœืคื ื™ ืฉื”ื™ื ืžืžืœื™ืฆื” ืขืœื™ื• ืœืฆื•ื•ืช; ื”ื™ื ื™ื•ื“ืขืช ื‘ื“ื™ื•ืง ืžื” ื–ื” ืื•ืžืจ "ืœื”ื›ื™ืจ ืœืขื•ืžืง" ื›ื™ ื”ื™ื ืžื›ื™ืจื” ืœืขื•ืžืง ืืช ื”ื›ืœื™ื ืฉืขื›ืฉื™ื• ืขื•ื‘ื“ื™ื ืื™ืชื, ื•ื™ื•ื“ืขืช ืฉื›ืจื’ืข (ืื• ื‘ืขืชื™ื“ ื”ื ืจืื” ืœืขื™ืŸ) ืื™ืŸ ืœื” ื–ืžืŸ ืœืœืžื•ื“ ืœืขื•ืžืง ืืช ืื•ืชื• ื›ืœื™ ื—ื“ืฉ. ื”ืคื—ื“ ืžื”ืคืื“ื™ื—ื” ืœื™ืคื•ืœ ื”ื™ื” ืžื” ืฉืขืฆืจ ืื•ืชื™ ื›ืฉื›ื•ืœื ืขื‘ืจื• ืž perl ืœ python: ื™ื“ืขืชื™ ืฉื›ืฉืื ื™ ืžื’ื™ืข ืœืœืงื•ื— ืœืขื–ื•ืจ ื‘ื‘ืขื™ื™ืช ืคืจืœ ืœื ืžืฉื ื” ืžื” ื™ื”ื™ื” ืื ื™ ืื•ื›ืœ ืœืžืฆื•ื ืœื• ืคื™ืชืจื•ืŸ ื˜ื•ื‘, ื›ื™ ื›ื‘ืจ ืจืื™ืชื™ ืื™ื ืกื•ืฃ ื‘ืขื™ื•ืช ืคืจืœ ื•ืคื™ืชืจื•ื ื•ืช ืฉืœื”ืŸ ื‘ืื•ืชื” ืชืงื•ืคื”. ื‘ python ื”ืกื™ืคื•ืจ ื”ื™ื” ืฉื•ื ื” ืœื’ืžืจื™ - ื”ื”ื™ื›ืจื•ืช ืฉืœื™ ืขื ืคื™ื™ืชื•ืŸ ื”ื™ืชื” ืžื•ื’ื‘ืœืช, ื•ืœืคื ื™ ืฉืจื•ืื™ื ืคืจื•ื™ืงื˜ื™ื ื•ืคื•ืชืจื™ื ื‘ืขื™ื•ืช ืื™ ืืคืฉืจ ื‘ืืžืช ืœืงื‘ืœ ื‘ื™ื˜ื—ื•ืŸ. ืคืจื™ืœืื ืกืจื™ื ืฆืขื™ืจื™ื ืžืžื ื™ ื ื›ื ืกื• ื‘ืœื™ ืœื”ืชื‘ืœื‘ืœ ืœืคืจื•ื™ืงื˜ื™ื ื‘ืคื™ื™ืชื•ืŸ, ื•ืื ื™ ื”ืกืชื›ืœืชื™ ืžื”ืฆื“ ื•ื—ื™ื›ื™ืชื™, ื•ื›ื›ืœ ืฉื—ื™ื›ื™ืชื™ ื”ืงืคื™ืฆื” ืจืง ื ืจืืชื” ื™ื•ืชืจ ืงืฉื”. ื”ื‘ืขื™ื” ืขื ื”ืคื—ื“ ืžื”ืคืื“ื™ื—ื” ื”ื™ื ืฉื‘ื›ืœ ืžืงืจื” ืกืคืฆื™ืคื™ ื”ื”ื—ืœื˜ื” ืœืงื—ืช ืกื™ื›ื•ืŸ ื”ื™ื ื‘ืืžืช ื”ื—ืœื˜ื” ื™ื•ืชืจ ืงืฉื”. ืžื” ื˜ื•ื‘ ื›ื‘ืจ ื™ืฆื ืœื™ ืžืœืงื—ืช ืคืจื•ื™ืงื˜ ื™ื™ืขื•ืฅ ื‘ืคื™ื™ืชื•ืŸ ื›ืฉืื ื™ ืœื ื™ื•ื“ืข ืžืกืคื™ืง ื˜ื•ื‘ ืคื™ื™ืชื•ืŸ? ืื ื™ ืจืง ืืฉื‘ ื”ืžื•ืŸ ืฉืขื•ืช ืขืœ ื›ืœ ื‘ืขื™ื” ืงื˜ื ื”, ื•ื‘ืกื•ืฃ ืืชืŸ ืœืœืงื•ื— ืงื•ื“ ื‘ื™ื ื•ื ื™. ืื‘ืœ, ื›ืฉืžืกืชื›ืœื™ื ืขืœ ื”ืชืžื•ื ื” ื”ื’ื“ื•ืœื”, ื‘ืจื•ืจ ืฉืื—ืจื™ 3-4 ืคืจื•ื™ืงื˜ื™ื ืื ื™ ื›ื‘ืจ ืื›ื™ืจ ืืช ื”ืฉืคื” ืžืžืฉ ื˜ื•ื‘ ื•ืื•ื›ืœ ืœื”ื™ื•ืช ืžื•ืขื™ืœ ืœืขืฆืžื™ ื•ืœืกื‘ื™ื‘ื”. ื•ื›ืฉื—ื•ื–ืจื™ื ืœืขื‘ื•ื“ื” ื”ื™ื•ื ื™ื•ืžื™ืช ื›ืžืชื›ื ืชืช ื‘ืฆื•ื•ืช - ืœื”ืžืœื™ืฅ ืขืœ ื›ืœื™ ื‘ื•ื“ื“ ืฉืื•ืœื™ ืœื ื™ืขื‘ื•ื“ ื˜ื•ื‘ ื–ื” ืžืกื•ื›ืŸ, ืื‘ืœ ืœื”ื™ื•ืช ื–ืืช ืฉืžืžืœื™ืฆื” ืขืœ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื—ื“ืฉื•ืช ื–ื” ื›ื‘ืจ ืžืฉื”ื• ืฉืฉื•ื•ื” ืœืฉืื•ืฃ ืืœื™ื•. ื”ืขื ื™ื™ืŸ ืฉื”ื“ืจืš ืชืžื™ื“ ืขื•ื‘ืจืช ื“ืจืš ื”ืคืื“ื™ื—ื”, ื“ืจืš ื”ืคืขื ื”ืจืืฉื•ื ื”, ื“ืจืš ื”ื ืคื™ืœื”. ื‘ืžืงื•ื ืœืคื—ื“ ืžื”ืคืื“ื™ื—ื” ืœื™ืคื•ืœ - ื›ื“ืื™ ืœื”ืชืจื’ืœ ืคืฉื•ื˜ ืœื™ืคื•ืœ. ืœื”ืคื•ืš ืืช ื”ื ืคื™ืœื” ืœื—ืœืง ืžื”ื—ื™ื™ื ื•ืœื”ื‘ื™ืŸ ืฉื‘ื˜ื•ื•ื— ื”ืจื—ื•ืง, ื›ืฉืื ื—ื ื• ื‘ื•ื ื™ื ืกื’ื ื•ืŸ ื—ื™ื™ื ืฉื‘ื• ื”ื ืคื™ืœื” ื”ื™ื ืœื ืคืื“ื™ื—ื” ืืœื ื—ืœืง ืžื”ื™ื•ื ื™ื•ื ืฉืœื ื•, ืื ื—ื ื• ืจืง ืžืจื•ื•ื™ื—ื™ื.

ToCode
1 419
# ืžื” ื›ืœ ื›ืš ืžืœื”ื™ื‘ ื‘ Tailwind CSS ืœืคื ื™ ื›ืžื” ืฉื ื™ื ืœืงื—ืชื™ ืคืจื™ืœืื ืกืจ ืœืขื–ื•ืจ ื‘ื‘ื ื™ื™ืช HTML ื• CSS ืœืืชืจ ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ืœืœืงื•ื—. ื”ืคืจื™ืœืื ืกืจ ืขื‘ื“ ืžืขื•ืœื” ื•ื™ืฆืจ ืงื•ื“ ืฉื”ืชืื™ื ื‘ืžื“ื•ื™ืง ืœืขื™ืฆื•ื‘ ืฉื”ื™ื” ืœื ื•, ื•ืื ื™ ื”ื™ื™ืชื™ ื‘ื˜ื•ื— ืฉืžืฆืืชื™ ืืช ื”ื“ืจืš ืืœ ื”ืื•ืฉืจ. ืขื“ ืฉื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœืฉื ื•ืช ืžืฉื”ื•. ื›ื™ ื”ื‘ืขื™ื” ืขื CSS ื”ื™ื ืฉื”ื›ืœ ืชืœื•ื™ ืฉื ื‘ื”ื›ืœ: ืžืืคื™ื™ืŸ ืฉืœ ื’ื•ื“ืœ ื’ื•ืคืŸ ืขืœ ืืœืžื ื˜ ืžืกื•ื™ื ืžืฉืคื™ืข ืขืœ ื”ื’ื•ืคืŸ ืืฆืœ ื”ื™ืœื“ื™ื ืฉืœื•, ืžืืคื™ื™ืŸ position ื‘ืืœืžื ื˜ ืžืกื•ื™ื ืžืฉืคื™ืข ืขืœ ื”ื”ืชื ื”ื’ื•ืช ืฉืœ ืžืืคื™ื™ื ื™ top ื• left ืืฆืœ ื”ื™ืœื“ื™ื ืฉืœื•. ื‘ืงื™ืฆื•ืจ CSS ืžืจื’ื™ืฉ ื›ืžื• ืžื’ื“ืœ ืงืœืคื™ื - ื–ื” ืขื•ื‘ื“, ืื‘ืœ ืฉื™ื ื•ื™ ื”ื›ื™ ืงื˜ืŸ ื•ื“ื‘ืจื™ื ื™ื•ืฆืื™ื ืžื”ืžืงื•ื. ื ืฉื•ื•ื” ืืช ื–ื” ืœ Tailwind CSS, ืฉื”ื•ื, ืœื˜ื•ื‘ืช ืžื™ ืžื”ืงื•ืจืื™ื ืฉืœื ืžื›ื™ืจื™ื, ืคืจื™ื™ืžื•ื•ืจืง ืฉืžืขื‘ื™ืจ ืืช ื” CSS ืœืชื•ืš ื” HTML, ืื• ืื•ืœื™ ื™ื•ืชืจ ื ื›ื•ืŸ ืœื ืกื— ืืช ื–ื” ื‘ืชื•ืจ ืคืจื™ื™ืžื•ื•ืจืง ืฉื™ื•ืฆืจ ื“ื™ื ืžื™ืช ื”ื’ื“ืจื•ืช CSS ืฉืžืชืื™ืžื•ืช ืœืงืœืืกื™ื ืขื ืฉืžื•ืช ืžืื•ื“ ืžืกื•ื™ืžื™ื ื‘ HTML. ืื– ื‘ Tailwind CSS ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืฉื•ืจืช HTML ื›ื–ืืช:
<img
    src="http://placekitten.com/100/100" 
    alt="cat"
    class="py-4 pl-4 aspect-square"
/>
ื•ืื ื™ ืืงื‘ืœ ืชืžื•ื ื” ืฉืœ ื—ืชืœืชื•ืœ ืขื ืจื™ืคื•ื“ ืขืœื™ื•ืŸ ื•ืจื™ืคื•ื“ ืžืฉืžืืœ ืฉืœ 16 ืคื™ืงืกืœื™ื ื›ืœ ืื—ื“ ื•ืžืืคื™ื™ืŸ aspect-ratio ืขื ืขืจืš ืฉืœ 1/1. ื•ืžื” ื›ืœ ื›ืš ืžืœื”ื™ื‘ ื‘ืœื”ืขื‘ื™ืจ ืืช ื›ืœ ื›ืœืœื™ ื”ืขื™ืฆื•ื‘ ืœ HTML? ืื ื ื—ื–ื•ืจ ืœืกื™ืคื•ืจ ืฉืœ ื”ืคืจื™ืœืื ืกืจ, ืœืชื—ื–ืง ืงื•ื“ Tailwind CSS ืฉืœ ืžื™ืฉื”ื• ืื—ืจ (ื‘ื”ื ื—ื” ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ื˜ื™ื™ืœื•ื•ื™ื ื“) ื–ื” ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืžืœืชื—ื–ืง ืงื•ื“ CSS ืฉืœ ืžื™ืฉื”ื• ืื—ืจ. ืื ื™ ืœื ืฆืจื™ืš ืœื”ื™ื›ื ืก ื•ืœื”ื‘ื™ืŸ ืื™ื–ื” ืงืœืืกื™ื ื”ื•ื ื‘ื—ืจ ื•ืžื” ื”ืžื‘ื ื” ื‘ HTML ืฉืžืชืื™ื ืœืงื•ื“ ื” CSS ื”ืงื™ื™ื; ื”ื›ืœ ืคืฉื•ื˜ ืžื•ืคื™ืข ืžื•ืœ ื”ืขื™ื ื™ื™ื. ืจื•ืฆื™ื ืœื“ืขืช ืขื•ื“ ืขืœ ื˜ื™ื™ืœื•ื•ื™ื ื“ ื•ื”ืงืœืืกื™ื ืฉืœื•? ื”ืคื•ืกื˜ ื”ื–ื” ื”ื•ื ืžืงื•ื ื˜ื•ื‘ ืœื”ืชื—ื™ืœ ื‘ื•: https://codingthesmartway.com/tailwind-css-for-absolute-beginners/ ื•ื›ืžื•ื‘ืŸ ื”ืชื™ืขื•ื“ ื”ืžืขื•ืœื” ืฉืœื”ื ื‘ืงื™ืฉื•ืจ: https://tailwindcss.com/docs/installation

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

ToCode
1 419
ื‘ืขื•ื“ ืขืฉืจ ื“ืงื•ืช ืžืชื—ื™ืœื™ื ื•ื•ื‘ื™ื ืจ ืขืœ Solid.JS, ืžื•ื–ืžื ื™ื ืœื”ื™ื›ื ืก ื‘ืงื™ืฉื•ืจ:

ToCode
1 419
ื”ื™ ื‘ื•ืงืจ ื˜ื•ื‘ ืœื›ื•ืœื ืžื–ื›ื™ืจ ืฉื”ื™ื•ื ื‘ืขืฉืจ ื ืงื™ื™ื ื•ื•ื‘ื™ื ืจ ืขืœ Solid Js ืชื›ืฃ ืืฉืœื— ืคื” ืืช ื”ืœื™ื ืง ืœื›ื ื™ืกื”

ToCode
1 419
ื‘ืชื™ืงื™ื™ืช src/app ืฉืœ ื”ืคืจื•ื™ืงื˜ ืชื•ื›ืœื• ืœืžืฆื•ื ืงื•ื‘ืฅ ื‘ืฉื store.js ืฉืžื—ื–ื™ืง ืืช ื”ืชื•ื›ืŸ ื”ื‘ื:
import { configureStore } from '@reduxjs/toolkit';
import memoryReducer from '../features/memory/memorySlice';
import memory from '../features/memory/memoryMiddleware';

export const store = configureStore({
  reducer: {
    memory: memoryReducer,
  },
  middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(memory),
});
ืชื›ืฃ ื ื“ื‘ืจ ืขืœ ื”ืžื™ื“ืœื•ื•ืจ, ืื‘ืœ ื‘ื™ื ืชื™ื™ื ื‘ื•ืื• ื ืชืžืงื“ ื‘ Reducer - ื”ืคื•ื ืงืฆื™ื” configureStore, ื’ื ื”ื™ื ืž Redux Toolkit, ืžื—ื–ื™ืจื” Redux Store ืœืคื™ ืจืฉื™ืžืช ื” Reducers ืฉืชืขื‘ื™ืจื• ืœื”, ื•ืืช ื” Reducer ืื ื™ ืžื™ื™ื‘ื ืžื”ืงื•ื‘ืฅ ื”ืงื•ื“ื ืฉื›ืชื‘ื ื•. ## ืงื•ืžืคื•ื ื ื˜ืช ืจื™ืืงื˜ ื”ื—ืœืง ื”ื›ื™ ื˜ื•ื‘ ื‘ืขื‘ื•ื“ื” ืขื ืจื™ื“ืืงืก ื”ื•ื ืฉื›ืœ ื”ืœื•ื’ื™ืงื” ื›ื‘ืจ ืงื™ื™ืžืช ื‘ืœื™ ืงืฉืจ ืœืžืžืฉืง, ื•ืœื›ืŸ ื›ืฉืื ื™ ืžื’ื™ืข ืœื›ืชื•ื‘ ืงื•ืžืคื•ื ื ื˜ืช ืจื™ืืงื˜ ืื ื™ ื‘ืกืš ื”ื›ืœ ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืื™ื–ื” "ืžื™ื“ืข" ืžืฉืคื™ืข ืขืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ื•ืื™ื–ื” ืคืขื•ืœื•ืช ื”ื™ื ื™ื›ื•ืœื” ืœืขืฉื•ืช. ื‘ืžืงืจื” ืฉืœ ืžืฉื—ืง ื”ื–ื™ื›ืจื•ืŸ ื”ืžื™ื“ืข ื”ื•ื ืจืฉื™ืžืช ื”ืงืœืคื™ื ื•ื”ืคืขื•ืœื” ื”ื™ื—ื™ื“ื” ื”ื™ื ืœืœื—ื•ืฅ ืขืœ ืงืœืฃ. ื”ื ื” ื”ืงื•ื“ ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื”:
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import {
  play,
  selectCards,
} from './memorySlice';
import './memory.css';

export function MemoryGame() {
  const cards = useSelector(selectCards);
  const dispatch = useDispatch();

  return (
    <div>
      {cards.map((c, i) => (
        <div
          className={c.hidden 
          ? "card hidden" : c.found
          ? "card found" : "card"
          }
          onClick={() => dispatch(play(i))}
          key={i}
        >
          {c.value}
        </div>
      ))}
    </div>
  );
}
## ื”ืžื™ื“ืœื•ื•ืจ ืขื“ ืœืคื” ื”ื™ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืœื ื• ืงื•ื“ ืฉืžืจืื” ืจืฉื™ืžืช ืงืœืคื™ื ื•ื—ื•ืฉืฃ ืงืœืคื™ื ื›ืฉืื ื—ื ื• ืœื•ื—ืฆื™ื ืขืœื™ื”ื, ื•ื’ื ืฆื•ื‘ืข ื‘ืฆื”ื•ื‘ ืงืœืคื™ื ื–ื”ื™ื ืฉืžืฆืื ื•. ื‘ืฉื‘ื™ืœ ืžืฉื—ืง ืืžื™ืชื™ ืื ื—ื ื• ืฆืจื™ื›ื™ื ื’ื ืœื”ืกืชื™ืจ ื‘ื—ื–ืจื” ืืช ื”ืงืœืคื™ื ื•ื›ืืŸ Redux Middleware ื”ื•ื ืคื™ืชืจื•ืŸ ืฉืžืชืื™ื ื›ืžื• ื›ืคืคื” ืœื™ื“: 1. ื›ืœ ืคืขื ืฉืื ื™ ืฉื•ืœื— ืคืงื•ื“ืช play ื”ืžื™ื“ืœื•ื•ืจ ื™ื›ื•ืœ ืœื”ืจื™ืฅ ืืช ื”ืคืงื•ื“ื” ื•ืœื‘ื“ื•ืง ืื ืื—ืจื™ ืฉื”ืกืชื™ื™ืžื” ื™ืฉ ืฉื ื™ ืงืœืคื™ื ื’ืœื•ื™ื™ื ืฉืขื“ื™ื™ืŸ ืœื ืžืฆืื ื• ืืช ื”ื–ื•ื’ ืฉืœื”ื. ืื ื›ืŸ, ื”ื•ื ื™ืฉื™ื ื˜ื™ื™ืžืจ ืฉืœ ืฉืชื™ ืฉื ื™ื•ืช ื•ื‘ืขื•ื“ ืฉืชื™ ืฉื ื™ื•ืช ื™ืฉืœื— ื‘ืงืฉื” ืœื”ืคื•ืš ืื•ืชื. 2. ื›ืœ ืคืขื ืฉืื ื™ ืžืงื‘ืœ ืคืงื•ื“ืช play ืœืคื ื™ ื”ืจืฆืช ื”ืคืงื•ื“ื” ื”ืžื™ื“ืœื•ื•ืจ ื™ื‘ื“ื•ืง ืื ื™ืฉ ืื™ื–ื” ื˜ื™ื™ืžืจ ืคืขื™ืœ, ื•ืื ื›ืŸ ื”ื•ื ื™ื‘ื˜ืœ ืื•ืชื• ื•ืคืฉื•ื˜ ื™ืจื™ืฅ ืžื™ื“ ืืช ื”ืื™ืคื•ืก. ื”ืžื—ืฉื‘ื” ื›ืืŸ ื”ื™ื ืฉืื ืžื™ืฉื”ื• ืœื•ื—ืฅ ืขืœ ืงืœืฃ "ืฉืœื™ืฉื™" ืฆืจื™ืš ืžื™ื“ ืœื”ืกืชื™ืจ ืืช ืฉื ื™ ื”ื’ืœื•ื™ื™ื ืžื”ืชื•ืจ ื”ืงื•ื“ื. ื”ืงื•ื“ ืฉืžืชืื™ื ืœืชื™ืื•ืจ ื”ืžื™ืœื•ืœื™ ืฉืœื™ ื”ื•ื ื‘ืกืš ื”ื›ืœ:
const gameMiddleware = ({ dispatch, getState }) => next => action => {
  // before play, if we're waiting for a "check" we'll
  // cancel the timer, check immediately and then continue
  // to play
  if (action.type === play.type && activeTimer) {
    clearTimeout(activeTimer);
    activeTimer = null;
    dispatch(check());
  }

  let result = next(action)

  // after play we count 2 seconds and check the status
  if (action.type === play.type) {
    if (selectVisibleCards(getState()).length === 2) {
      activeTimer = setTimeout(() => {
        dispatch(check());
      }, 2000);
    }
  }

  return result
};
ื•ื–ื” ื‘ืขืฆื ื›ืœ ืžืฉื—ืง ื”ื–ื™ื›ืจื•ืŸ ืฉืœื ื•. ื”ื ื” ืžื” ืฉื”ืจื•ื•ื—ื ื• ื‘ืขื‘ื•ื“ื” ืขื Redux Toolkit: 1. ื›ืœ ื”ืœื•ื’ื™ืงื” ืžืจื•ื›ื–ืช ื‘ืคื•ื ืงืฆื™ื•ืช ืคืฉื•ื˜ื•ืช, ืฉืžืงื‘ืœื•ืช ืื•ื‘ื™ืงื˜ ืกื˜ื™ื™ื˜ ื•ืื•ื‘ื™ืงื˜ action ื•ืžืฉื ื•ืช ืืช ื”ืกื˜ื™ื™ื˜ ืœืคื™ ื”ื‘ืงืฉื” ื‘ action. 2. ืื ื‘ืขืชื™ื“ ื ืจืฆื” ืœื”ื•ืกื™ืฃ ืžื ื’ื ื•ื ื™ื, ืžืื•ื“ ื‘ืจื•ืจ ืœื ื• ืื™ืš ืœืขืฉื•ืช ืืช ื–ื” ื‘ืœื™ "ืœืงืœืงืœ" ืื• ืœืฉื ื•ืช ืืช ื”ืงื•ื“ ื”ืงื™ื™ื. ืคืฉื•ื˜ ืฆืจื™ืš ืœื”ื•ืกื™ืฃ ืขื•ื“ ืกืœื™ื™ืก. ื”ืงื•ื“ ื”ื™ื—ื™ื“ ืฉืืฆื˜ืจืš ืœืฉื ื•ืช ื”ื•ื ื”ืงื•ื‘ืฅ store.js, ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืฉื ื”ืชื™ื—ืกื•ืช ืœืกืœื™ื™ืก ื”ื—ื“ืฉ. 3. ืงื•ืžืคื•ื ื ื˜ืช ืจื™ืืงื˜ ืฉื™ืฆืจืชื™ ื™ืฆืื” ืžืื•ื“ ืคืฉื•ื˜ื”. ื”ืœื•ื’ื™ืงื” ื”ื™ื—ื™ื“ื” ืฉื‘ื” ื”ื™ื ืœื•ื’ื™ืงื” ืฉืงืฉื•ืจื” ืœืชืฆื•ื’ื”. 4. ืœืžืจื•ืช ืฉืœื ื”ืจืื™ืชื™ ื›ืืŸ, ื™ื”ื™ื” ืงืœ ืžืื•ื“ ืœื›ืชื•ื‘ ืงื•ื“ ื‘ื“ื™ืงื” ืœืœื•ื’ื™ืงื” ื›ื™ ื›ื•ืœื” ืžื•ืจื›ื‘ืช ืžืคื•ื ืงืฆื™ื•ืช ื˜ื”ื•ืจื•ืช. 5. ืœืžืจื•ืช ืฉืœื ื”ืจืื™ืชื™ ื›ืืŸ, ืจื™ื“ืืงืก ื˜ื•ืœืงื™ื˜ ืžื’ื™ืข ืขื ื›ืœ ื›ืœื™ ื” debug ืฉืœ ืจื™ื“ืืงืก ืื– ื™ืฉ ืœื›ื ืืช ื›ืœ ื”ืคื™ื ื•ืงื™ื ืฉืœ ืžืกืข ืื—ื•ืจื” ื‘ื–ืžืŸ ื•ืฆืคื™ื” ื‘ื›ืœ ื” actions ืฉืขื•ื‘ืจื•ืช ื‘ืžืขืจื›ืช. ืกืš ื”ื›ืœ ื›ืชื™ื‘ืช ืจื™ื“ืืงืก ื”ื™ื•ื ื”ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืคืฉื•ื˜ื” ืžืžื” ืฉื”ื™ืชื” ื‘ืขื‘ืจ ื•ื”ืจื‘ื” ื‘ื–ื›ื•ืช redux toolkit. ืืช ืงื•ื“ ื”ืžืฉื—ืง ื”ืžืœื ืืชื ื™ื›ื•ืœื™ื ืœืžืฆื•ื ื‘ืžืื’ืจ ื›ืืŸ: https://github.com/ynonp/redux-memory-game

ToCode
1 419
# ืžื“ืจื™ืš ืงื•ื“: ื‘ื•ืื• ื ื›ืชื•ื‘ ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื‘ Redux ื• React ืœืคื ื™ ืฉื ืชื™ื™ื ื›ืชื‘ืชื™ ื›ืืŸ ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ืขื ืจื™ืืงื˜ ื‘ืขื–ืจืช ื”ืคื•ื ืงืฆื™ื” useReducer. ื”ื™ื•ื ืื ื™ ืจื•ืฆื” ืœื ืกื•ืช ืžืฉื—ืง ื“ื•ืžื” ืขื Redux ื›ื“ื™ ืœืจืื•ืช ืžื” ื”ืชื—ื“ืฉ ื‘ืจื™ื“ืืงืก ื‘ืฉื ื™ื ื”ืื—ืจื•ื ื•ืช ื•ื‘ืžื™ื•ื—ื“ ื›ื“ื™ ืœืฉื—ืง ืขื Redux Toolkit, ืกืคืจื™ื” ืฉื”ื•ืคื›ืช ืืช ื”ื›ืชื™ื‘ื” ื‘ืจื™ื“ืืงืก ืœืžืฉื—ืง ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ื ื”. ## ื”ืกื•ื“ ืฉืœ ืจื™ื“ืืงืก ื˜ื•ืœืงื™ื˜ ื”ื•ื ื‘ื›ืœืœ Immer ื”ืืžืช ื—ื™ื™ื‘ืช ืœื”ื™ืืžืจ, ื›ืชื™ื‘ืช ืงื•ื“ JavaScript ืฉืžืชืขืกืง ืขื Immutable Data ื–ื” ืœื ืชืขื ื•ื’. ืื ืื ื™ ืฆืจื™ืš ืœืงื—ืช ืื•ื‘ื™ืงื˜ ืกื˜ื™ื™ื˜ ืฉืžื•ืจื›ื‘ ืžืื•ื‘ื™ืงื˜ื™ื ืคื ื™ืžื™ื™ื ื•ืœืฉื ื•ืช ืžืฉื”ื• ื‘ืื—ื“ ื”ืื•ื‘ื™ืงื˜ื™ื ื”ืคื ื™ืžื™ื™ื ืฉืœื• ืื ื™ ืžื”ืจ ืžืื•ื“ ืžื•ืฆื ืืช ืขืฆืžื™ ื›ื•ืชื‘ ื“ื‘ืจื™ื ื›ืืœื”:
function handwrittenReducer(state, action) {
  return {
    ...state,
    first: {
      ...state.first,
      second: {
        ...state.first.second,
        [action.someId]: {
          ...state.first.second[action.someId],
          fourth: action.someValue,
        },
      },
    },
  }
}
ื•ืžืคื” ื”ื“ืจืš ืœืื‘ื“ื•ืŸ ืงืฆืจื”. ื”ื˜ืจื™ืง ื”ื›ื™ ืžืœื”ื™ื‘ ืขื Redux Toolkit ื–ื” ื”ื—ื™ื‘ื•ืจ ื”ืžื•ื‘ื ื” ืฉืœื” ืขื Immer. ืื™ืžืจ, ืœืžื™ ืฉืœื ืžื›ื™ืจ, ื–ื• ืกืคืจื™ื™ืช JavaScript ืฉืžืืคืฉืจืช ืœื™ ืœื›ืชื•ื‘ ืงื•ื“ ืฉืžืฉื ื” ืžื™ื“ืข ื•ื”ื•ืคื›ืช ืื•ืชื• ืื•ื˜ื•ืžื˜ื™ืช ืœืงื•ื“ ืฉืžืฉื›ืคืœ ืืช ื”ืžื™ื“ืข ื‘ืžืงื•ื ืœืฉื ื•ืช ืื•ืชื•. ื”ืคื•ื ืงืฆื™ื” ื”ื›ื™ ื—ืฉื•ื‘ื” ืฉืœ Redux Toolkit ื ืงืจืืช createSlice ื•ื”ื™ื ื‘ืขืฆื ื™ื•ืฆืจืช ื’ื Reducer ื•ื’ื Action Creators, ืžืฉื•ืœื‘ืช ืขื Immer ื›ืš ืฉื”ืงื•ื“ ืฉืื ื™ ื›ื•ืชื‘ ื‘ื” "ื›ืื™ืœื•" ืžืฉื ื” ืืช ื”ืื•ื‘ื™ืงื˜ื™ื. ื‘ื•ืื• ื ืฆืœื•ืœ ืœืžืฉื—ืง ื”ื–ื™ื›ืจื•ืŸ ื›ื“ื™ ืœืจืื•ืช ืืช ื”ืกื™ืคื•ืจ ื”ื–ื” ื‘ืคืขื•ืœื”. ื›ืœ ื”ืงื•ื“ ืฉืื ื™ ื›ื•ืชื‘ ืขืœื™ื• ื–ืžื™ืŸ ื‘ืจื™ืคื• ื”ื–ื”: https://github.com/ynonp/redux-memory-game ืื– ื‘ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื™ืฉ ืœื™ ื—ื‘ื™ืœื” ืฉืœ ืงืœืคื™ื ืฉืื ื™ ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืขื:
const initialState = {
  cards: _.shuffle(_.range(10).map(i => ({
    value: Math.floor(i / 2),
    hidden: true,
    found: false,
  }))),
};
ื”ืžืืคื™ื™ืŸ value ืฉืœ ืงืœืฃ ืžื™ื™ืฆื’ ืืช ื”ืžืกืคืจ ืฉืขืœื™ื•, hidden ืื•ืžืจ ืื ื”ื•ื ื”ืคื•ืš ื• found ืื•ืžืจ ืื ืžืฆืื ื• ืื•ืชื• ื™ื—ื“ ืขื ื”ื–ื•ื’ ืฉืœื•. ื”ืคื•ื ืงืฆื™ื” ื”ืจืืฉื•ื ื” ืฉืื ื™ ืฆืจื™ืš ื‘ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื”ื™ื ืคื•ื ืงืฆื™ื” ืฉื ืงืจืืช ื›ืฉืžืฉืชืžืฉ ืœื•ื—ืฅ ืขืœ ืงืœืฃ. ื”ื ื” ื”ืžื™ืžื•ืฉ ื”ืžืคืชื™ืข ืฉืœื™:
function onPlay(state, action) {
  const index = action.payload;
  if (state.cards[index].hidden) {
    state.cards[index].hidden = false;
  }

  const visibleCards = state.cards.filter(c => !c.found && !c.hidden);
  if (visibleCards.length === 2) {
    if (visibleCards[0].value === visibleCards[1].value) {
      visibleCards[0].found = true;
      visibleCards[1].found = true;
    }
  }
}
ื•ืœืžื” ื–ื” ืžืคืชื™ืข? ื›ื™ ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื‘ Redux ื›ืœ Reducer ืฆืจื™ืš ืœืงื‘ืœ state ื• action ื•ืœื”ื—ื–ื™ืจ state ื—ื“ืฉ. ืคื” ืื ื™ ืคืฉื•ื˜ ืžืฉื ื” ืืช ื” state ื‘ืžื” ืฉื ืจืื” ื›ืžื• ืฉื™ื ื•ื™ ื‘ืžืงื•ื:
state.cards[index].hidden = false;
ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืกืคืจื™ื™ืช immer ื”ื•ืคื›ืช ืืช ื”ืงื•ื“ ื”ื–ื” ืœืงื•ื“ ืฉืœื ื‘ืืžืช ืžืฉื ื” ืืช ื”ืกื˜ื™ื™ื˜ ืืœื ื™ื•ืฆืจ ืกื˜ื™ื™ื˜ ื—ื“ืฉ ื•ืžื—ื–ื™ืจ ืื•ืชื•. ืื’ื‘ ืคื•ื ืงืฆื™ื” ืฉื ื™ื” ืฉืชืขื–ื•ืจ ืœื™ ื‘ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ืชื•ืคืขืœ ื›ืžื” ืฉื ื™ื•ืช ืื—ืจื™ ื”ืชื•ืจ ื”ืฉื ื™ ื‘ืฉื‘ื™ืœ ืœื”ืคื•ืš ืืช ื›ืœ ื”ืงืœืคื™ื ืฉืฆืจื™ืš ืœื”ืกืชื™ืจ:
function onCheck(state) {
  for (let c of state.cards) {
    if (!c.found) {
      c.hidden = true;
    }
  }
}
ืืช ื›ืœ ื”ืงื•ื“ ื”ื–ื” ื›ืชื‘ืชื™ ื‘ืงื•ื‘ืฅ ืฉื ืงืจื memorySlice.js ื•ืขื“ ืขื›ืฉื™ื• ืœื ื”ื™ื” ืฉื•ื ื“ื‘ืจ ืฉืงืฉื•ืจ ืœืจื™ื“ืืงืก ืื• ืœ redux-toolkit ื‘ืงื•ื‘ืฅ. ื”ื—ืœืง ื”ืื—ืจื•ืŸ ื”ื•ื ื›ื‘ืจ ื ืงื•ื“ืช ื”ื›ื ื™ืกื” ืœ Redux:
export const memorySlice = createSlice({
  name: 'memory',
  initialState,
  // The `reducers` field lets us define reducers and generate associated actions
  reducers: { play: onPlay, check: onCheck },
});
ื”ืคื•ื ืงืฆื™ื” createSlice ืžืงื‘ืœืช ืืช ืฉืชื™ ื”ืคื•ื ืงืฆื™ื•ืช ืฉื›ืชื‘ืชื™ ืœืชื•ืš ืžืคืชื— reducer ืฉืœ ืื•ื‘ื™ื™ืงื˜ ื”ืคืจืžื˜ืจื™ื ืฉืœื” ื•ื™ื•ืฆืจืช ื’ื Reducer ืžืกื•ื“ืจ ื•ื’ื Action Creators. ืขื›ืฉื™ื• ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืขืจืš ื”ื”ื—ื–ืจ ืฉืœื” ื›ื“ื™ ืœื™ื™ืฆื ืืช ื”ืชื•ืฆืื•ืช:
export const { play, check } = memorySlice.actions;
export default memorySlice.reducer;
ืœืกื™ื•ื ื”ืงื•ื‘ืฅ ืื ื™ ื™ื•ืฆืจ ื•ืžื™ื™ืฆื ืขื•ื“ ืฉืชื™ ืคื•ื ืงืฆื™ื•ืช ืขื–ืจ ืื™ืชืŸ ืงื•ื“ ืžืงื‘ืฆื™ื ืื—ืจื™ื ื™ื•ื›ืœ ืœืงืจื•ื ืžื™ื“ืข ืžื” State:
export const selectVisibleCards = (state) => state.memory.cards.filter(c => !c.hidden && !c.found);

export const selectCards = (state) => state.memory.cards;
## ืื™ืš ืžืฉืชืžืฉื™ื ื‘ Reducers

ToCode
1 419
# ืฉืืœื” ืฉืœ ื’ื™ืฉื” ืœื ืžื–ืžืŸ ื“ื™ื‘ืจืชื™ ืขื ืžืชื›ื ืช ืจื™ืืงื˜ ืžืื•ื“ ืžื•ื›ืฉืจ, ืฉืฉื™ื›ื ืข ืื•ืชื™ ื‘ื ืื•ืžื™ื ื—ื•ืฆื‘ื™ ืœื”ื‘ื•ืช ืฉื”ื“ืจืš ื”ื ื›ื•ื ื” ืœื›ืชื•ื‘ ืงื•ื“ ืจื™ืืงื˜ ื”ื™ื ืœื”ืฉืชืžืฉ ื‘ useEffect ื•ื‘ Custom Hooks ื›ื“ื™ ืœื”ืขื‘ื™ืจ ื›ืžื” ืฉื™ื•ืชืจ ืœื•ื’ื™ืงื”, ื›ื•ืœืœ ืœื•ื’ื™ืงื” ืฉืœ ืชืงืฉื•ืจืช, ืœืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื•ืช. ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ, ื”ื•ื ื˜ืขืŸ, ืœื ื”ืœ ืืช ื”ืœื•ื’ื™ืงื” ืฉืœ ื”ืฉืœื™ืคื•ืช ื›ืฉื”ืฉืœื™ืคื” ืงืจื•ื‘ื” ืœืงื•ื“ ืฉืžืฆื™ื’ ืืช ื”ืชื•ืฆืื” ืฉืœื”. ื‘ื ื•ืกืฃ, ื›ืฉืืชื” ืžื•ื—ืง ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืื•ื˜ื•ืžื˜ื™ืช ืืชื” ืžื•ื—ืง ืืช ืงื•ื“ ื”ืฉืœื™ืคื” ืฉืงืฉื•ืจ ืืœื™ื”, ื•ืœื ื ืฉืืจ ืขื ืžื ื’ื ื•ื ื™ ืฉืœื™ืคื” ืฉืืฃ ืื—ื“ ืœื ืžืฉืชืžืฉ ื‘ื”ื. ื•ืื– ืžืฆืืชื™ ืืช ื”ืžืฉืคื˜ ื”ื‘ื ื‘ืชื™ืขื•ื“ ืฉืœ Redux Toolkit: > With RTK Query, you usually define your entire API definition in one place. This is most likely different from what you see with other libraries such as swr or react-query, and there are several reasons for that. Our perspective is that it's much easier to keep track of how requests, cache invalidation, and general app configuration behave when they're all in one central location in comparison to having X number of custom hooks in different files throughout your application. ื‘ืชืจื’ื•ื ื•ืงื™ืฆื•ืจ ื”ื ืื•ืžืจื™ื ืฉื”ื ื‘ื ื• ืืช RTK Query ื›ื™ ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœื ื”ืœ ืชืงืฉื•ืจืช ื›ืฉื›ืœ ื”ืงื•ื“ ืฉืžืชืขืกืง ื‘ื” ื ืžืฆื ื‘ืžืงื•ื ืื—ื“. "ืžื™ ืฆื•ื“ืง" ื–ืืช ื‘ื›ืœืœ ืœื ื”ืฉืืœื” ื›ืืŸ. ื”ืจื‘ื” ืืชื’ืจื™ื ื‘ืชื›ื ื•ืช ื‘ื ื•ื™ื™ื ื›ื›ื” ืฉืืคืฉืจ ืœืคืชื•ืจ ืื•ืชื ื‘ื›ืœ ืžื™ื ื™ ื“ืจื›ื™ื. ื›ืœ ื’ื™ืฉื” ืžื’ื™ืขื” ืขื ื”ื›ืœื™ื ืฉืœื” ื•ื‘ื›ืœ ื’ื™ืฉื” ืืคืฉืจ ืœื‘ื ื•ืช ืคื™ืชืจื•ื ื•ืช ื˜ื•ื‘ื™ื (ืื• ืคื—ื•ืช ื˜ื•ื‘ื™ื). ื”ื“ืจืš ืœื”ื™ื•ืช ืžืชื›ื ืชื™ื ื˜ื•ื‘ื™ื ื™ื•ืชืจ ื”ื™ื ืœื ืœืžืฆื•ื ืืช "ื”ื’ื™ืฉื” ื”ืื—ืช" ืฉืชืžื™ื“ ื ื›ื•ื ื”, ืืœื ืœื”ื™ืคืชื— ืœื™ื•ืชืจ ื’ื™ืฉื•ืช, ื•ืœื”ื‘ื™ืŸ ื‘ืชื•ืš ื’ื™ืฉื” ืžืกื•ื™ืžืช ืžื” ื”ืกื˜ื ื“ืจื˜ื™ื ืฉืžืงื•ื‘ืœื™ื ื‘ื”, ืžื” ื–ื” ืื•ืžืจ ืœื›ืชื•ื‘ ืงื•ื“ ื˜ื•ื‘ (ืื• ื’ืจื•ืข) ื›ืฉื”ืœื•ื’ื™ืงื” ื‘ืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื•ืช, ื•ืžื” ื–ื” ืื•ืžืจ ืœื›ืชื•ื‘ ืงื•ื“ ื˜ื•ื‘ (ืื• ื’ืจื•ืข) ื›ืฉื”ืœื•ื’ื™ืงื” ื ืžืฆืืช ื‘ืžืงื•ื ืื—ืจ, ื•ืื™ื–ื” ืžืœื›ื•ื“ื•ืช ืื• ืกื›ื ื•ืช ืฆืคื•ื™ื•ืช ืœื ื• ื‘ื›ืœ ืื—ืช ืžื”ื’ื™ืฉื•ืช.