ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
-530 kunlar
Postlar arxiv
1 419
ืืชืืชื ืคื ืืคื ื ืืื ืืืื ืขื ืืฉืื ืื ืืื ืืจืืืงื 19 ืฉืืืืจ ืืงืืงื ืืช ืจืืืงื ืงืืืจื
ืื ืืฉืืืชื ื ืืืืจืื ืืงืฉืืื ืืฆืขืงืืช ืืืกืืคืืจ ืืจืืข ืืืงืคื
https://blog.codeminer42.com/how-react-19-almost-made-the-internet-slower/
1 419
ืคืืื ืืคืืื ืื ืกืืช (ืกืืืืช ืชืจืืื)
ืืืชืื ืืคืืืงืฆืืืช ืืื ืืื ืคืจืืืืืืจืง? ืื ื ืคืืื ืืคืืื ืื ืกืืช. ืืืืคื ืื ื ืืงื ืืช ืื ืืืืืืืช ืืงืื? ืืื ืื ืื ืกืืืื ืืืืืืื? ืืื ืื ืืงืื ืืกืชืื ืืืฆื ืืฉืืืื?
ืืคืจืืืงื ืืืงืื ืื ืืืงืื ืขืืืื ืืื ืืืจ ืืืชืจ ืืืขื ืืืืืืจ ืืช ืืืื ืืืืืื ืืืืืกืกืช, ืืืช ืฉืืืื ืืื ืงื ืืืืืก ืื ืฉืื ืขืืืจื, ืืืืขืืจ ื Chat GPT ืืฉืืืืช ืืืื ืืฉืื ืืืขืช ืฉืื ืืฉื ื ืื ืืงืจื ืชืืื ืืืื ืืืฆื. ืื ืฉืื ืืืจืื ืืืจ ืืชืื ืืืฉืืืื ืืืืื ืืจืืืงื ืืืื ืื ืื ื ืืกืชืืจ.
ืืื ืืคืจืืืงื ืฆื? ืืคืจืืืงื ืืืืืืืื? ืืงืืจืก?
ืืืช ืืืืจืืช ืฉื ืคืจืืืงืืื ื ืืืื ืกืืืื ืืื ืืงืื ืืจืื ืืืื ืืืชื ืกืืช, ืืจืื ืฉืื ืืคืฉืจ ืืืชืื ืืคืืืงืฆืื ืืืืฉืช Micro Services ืื ืื ืื Overkill, ืืืื ืืก ืืกืืก ื ืชืื ืื ืืืืืจ (ืื 5 ืืกืืกื ื ืชืื ืื), ืืขืฆื ืืฃ ืืืช ืชืืช ืืืืื ืขื Three.js ืืื ืื ืืืชืื ืืช ื Front End ืืื ืืฃ ืคืจืืืืืืจืง ืืืช ืฆื ืืฉืจืช ื Rust. ืื ืืืืข ืืืื ืืืจืขืืื ืืช ืืืื ืืขืืื ืืคืจืืืงื ืฉืืื ืืืื ืืคืจืืืงืื ืืืืืืืื ืืืื ืืืืช ืืฆืืืื ืืืชืจืืื, ืืื ืื ืฉืืืื ืฉืืกืืื ืืืชืืื ืชืืื ืืื ืืื ื ืืืื ืฉื ืฉืืืช ืขืืืื ืืืฉื, ืืืืื ืืืง ืืฉืืืืช ืืขืืืื ืืืื ืืขืืจื ืืื ืื ืืคืจืืืงืืื ืืืืชืืื.
1 419
ืขืื ืืื ืืืขืื ืื ื ืื ืืืืคืกืงืจืืคื
ืืืืขืื ืืจืืฉืื ื ืื ืืืืคืกืงืจืืคื ืืื ืฉืืื ืฆืืจื ืืืื ืืืืกืืฃ ืฉืื "ืื ืืื" ืืขืืืฃ ืืฉืืื ืืืคืืคื ืืฉืืจืืช ืืช ืืงืื ืฉืื ืื ื ืืืชืืื, ืืืืืื ืืืืจ ืืืคืืคื ืื ืชืืืืื ื ES Modules ื Import Maps. ืื ื ืฉื ืืช ืืืืขืื ืืื ืืฆื ืื ืืืืช ืฉืืชืจืืื ื ืืฉืื ืืื ืืื.
ืืืืขืื ืืฉื ื ื ืื ืืืืคืกืงืจืืคื ืืืชืจ ืืขื ืืื - ืืืื ืฉืืืืคืกืงืจืืคื ืคืฉืื ืื ืืกืคืืง ืืืื ืืืคืืื ืืืงืจืื ืคืฉืืืื ืฆืจืืืื ืืืืกืืฃ ืืขืงืคืื. ืงืื ืืืืืื:
type Table = Array<Array<number>>;
function duplicateRow(table: Table, rowIndex: number): Table {
if ((rowIndex >= table.length) || (rowIndex < 0)) {
throw new Error("row index out of range")
}
return [...table.slice(0, rowIndex), table.at(rowIndex), ...table.slice(rowIndex)];
}
ืืงืื ืืื ืืื ื ืืืืคืกืงืจืืคื ืชืงื ื ืื ืืืืคืกืงืจืืคื ืื ืืืืข ืฉ at ืืืื ืืืืืืจ ืฉืืจื ืืชืื ืืืขืจื ืื ืืืจ ืืืืื ื ืฉืืืื ืืงืก ื ืืฆื ืืืืื ืฉืืจื ืืขื. ืืื ืื ื ืืืื ืืืืืืฃ ืืช ื at ืืกืืืจืืื ืืจืืืขืื ืืื ืืื ืืชืงืืคื, ืืื ื ืืืื ืืืงืฉ ืืืืืคืกืงืจืืคื ืืืชืขืื ืืืฉืืืื ืืื ื ืืืื ืืืืกืืฃ as ืืื ืืืจืืงืื ืืืื, ืืื ืื ืืืืืง ืกืื ืืฉืื ืืืื ืฉืื ืื ื ืื ืจืืืื ืืช ืืขืจื ืฉืืื.
ืืืืขืื ืฉืืืฉื ืืื ืืงืืืื. ืื ืื ืื ืื ื ืืฆืืืืื ืืืชืืืื ืขื ืืกืืืืืืืช ืืงืื ืฉืื ื ืืจืื ืืืื ืกืคืจืืืช ืืืืคืกืงืจืืคื ืืืืืืช ืืื ืกืืฃ ืืจืืงืื ืฉื ืืฉืคื ืืื ืืืฆืืจ ืืฆืืจื ืืืืืืืืช ืืช ืืืืจืืช ืืืืคืืกืื ืืคื ืงืื ืฉืื ืื ื ืืืชืืื. ืืืืืื ืจืืืืงืก ืืืืงืื ืืืงืืช ืืช ืงืื ื Reducers ืืืืฆืจืช ืืื ื ืืืืจืืช ืืืคืืกืื, ืืื ืื ืืฉ ืืขืืช ืงืื ื ืืงืื ืื ืืคืืื ืืื ื ืฉืืื ืื ืืืืืง ืื ืฉืืืชืื Redux Toolkit ืืชืืืื ื ืื ืื ื ืืืืืื ืืืฆืื ืืช ืขืฆืื ื ืืื ืืืืขืืช ืฉืืืื ืืืืืืช ืฉืืืงื ืืจืื ืืื ืืคืขื ื. ืื ืืคืืื ืฉืืื ืืกื ืืืืืจืืช ืืืืคืืกืื ืืืฉ ืืช ืฉืืืืชืืช ื GraphQL (ืืืืจืืืช ืืืื ืืืืื) ืืื ืื ืืืจื ืืฆืืจืช ืืืืคืืกืื ืื ื ืืฉื ื ืืคืืื ืคืกืืง ืื ืจืืื ืืฉืืืืชื ืคืชืืื ืื ืืขืจืืช ืืืืคืืกืื ืืคืกืืงื ืืขืืื. ืื ืงืืกืื ืฉืืืื ืืื ืืช ืืื ื ืืืืืืืช ืืืืืจ ืืื ื ืืื ืืืช ืืืืจืืช ืืืคืืกืื ืืื ืฉืฉืืืืชืืช ืฉืื ืื ื ืืืชืืื ืืืื Type Safe ืืืืจื ืืืื ืืช ืืืืคืกืงืจืืคื ืืงืฆื. ืื ืขืื ืื ืขืืื ืืื ืืืืจืืช ืืืืคืืกืื ืืืืืจืืช ืืืืืืช ืจืง ืืชืื ืงืื ืืกืคืจืื ืืื ืืกืืจ, ืืื ืืืขื ืืื ืกืคืจืื ืืืืข ืจืืข ืฉืฆืจืื ืืืืื ืก ืคื ืืื ืืงืื ืฉืืื ืืื ืืืืื ืืื ืืืชืื ืืช ืืืืคืืกืื ืื ืฉืืืืคืกืงืจืืคื ืืืื ืฉืื.
ืื ื ืขืืืื ืืืื ืืืืคืกืงืจืืคื ืืืืฉื ืฉืืื ืืืื ืืืชืจ ืืืืืืจื ืืืื ืฉื ืืชืืื ืืื ืืืคืืกืื ืืจืื ืืคืจืืืงืืื, ืืื ืื ืืคืฉืจ ืืืชืขืื ืืืืืจืืืืช ืฉื ืืฉืคื ืืืืงืืกืืกืื.1 419
ืื ืื ื ืืืจ ืื ืืืฉืืื ืืื ืืืชืจ
ืืื ืืืืจืื ืฉืืืืชื ืืจืืืงื ืื ืฉืื ืืืขื ืืฃ ืคืขื ืื ืฉืืืจืื ืชืืืืืช ืืืืจื ืืืืื ืช ืงืื. ืื ืืืื ืื ืฉืืฉ ืื ืฉืื ืฉืืฉืชืืฉืื ืืืืฆืจืื ืฉืืื ืืคืจืืืงืฉื, ืฉืจืืฆืื ืืืืฉืืจ ืืขืืืื ืื ืืืืฉืชืืฉ ืืืืจืกืืืช ืืืฉืืช ืฉื ืจืืืงื ืืื ืื ืชืืื ืืืืืื ืื ืจืืฆืื ืืฉื ืืช ืืช ืกืื ืื ืืืชืืื ืฉืืื.
ืืืื ืืืจืืช ืฉ Functional Components ืื ืืืืจ, ืขืืืื ืืคืฉืจ ืืืฉืชืืฉ ื Class Components ืืืื ืืขืืื.
ืืืืจืืช ืฉ Concurrent Mode ืื ืืืืจ, ืขืืืื ืืคืฉืจ ืืืคืขืื ืจืืืงื ืืืขืืื ืืืื ืืขืืื.
ืืื ืืืื ืื ื ืืขื - ืืฆืืืช ืืคืืชืื ืืฉ ืืขื, ืืืขื ืฉืืื ืืื ืืืื ืืืืื ืืฉืื ืืืื ืฉื ืื ืกืื ืืคืจืืืืืืจืง ืืืืขื ืฉืืื ืื ืืืืื ืืืฉืชื ืืช. ืืืงืกื ืืื ืืชืื PR ืื ืืฉื Concurrent Mode ืืฉืื ืืืืื ืืื:
> This was when we were more bullish about lazy fetching being a good idea some of the time (when combined with prefetching), as opposed to our latest thinking, which is that it's almost always a bad idea.
ืืื lazy fetching ืืื ืจืขืืื ืืื ืื ืจืข? ืื ื ืื ืจืืฆื ืืืืื ืก ืืืืื ืืื (ืืฉ ืืืื ืืขื ืืื ืืงืืฉืืจ). ืืื ืืืจืืืจ ืืืฉืืืช ืืืืข ืืฉืจืช ืฆืจืื ืืืืืช ืจืื ืืืจ ืฉื ืงืืืคืื ื ืื ืื ืืืืฉืื ืืจืืืจ ืืืื ืืืชืจ ืืจืืช ืืืคืืืงืฆืื? ืฉืื, ืืืื ืืขื ืืื, ืื ืืืืื. ืื ืฉืืฉืื ืืื ืฉืืืืื ืืื ืฆืืืช ืืืคืชืืื ืฉื ืจืืืงื ื ืงื ืขืืื ืืจืืจื ืืฆื ืืื, ืืืืื ืื ื ืืงืืื ืขืืื ืืจืืจื ืืฆื ืืฉื ื, ืืืื ืฉืื ืืืื ืืฉืืขืืชืืื ืืคืจืืืืืืจืง ืฉืืืคืืื ืืช ืืืช ืืืืฉืืช ืืืจืื ืืืชืจ ืงืฉื ืืืืืืฉ.
ืขืืืื ืืืงืื ืืืืื ืืื ืืกืืคืืจ ืืื ืืืื, ืืื ืื ืืฉืื ืืืฉืืืจ ืืจืืฉ ืฉืืืจืื ืืืื ืงืืจืื ืืืฉืื ืื ื ืืื ืื ืืจืืืืงืืืจื ืืืืฉืื ืฉืื ื ืืืืืจ ืฉืืืืจืืืช ืขืืื ื, ืื ืืฉืื ืืจื ืงืืืจืง ืืฉื ื ืืช ืืขืชื.
1 419
'my-cell': MyCell } }ื ืขืืืจ ืืฆืืจื ืืจืืื ืขื ืืจืขืืื ืืช ืืืฉืืืื ืฉืืืืชื ืืืชืืืช ืืืืืื: 1. ืืฉืื ื ืืชืื ืงืืืคืื ื ืื ืฉื "ืชื" ืืจืืฆื ืืืขืืืจ ืคืืงืืก ืืืจื ืืืืืื ืฉืื ืืฆืืช ืืืืฆื ืืงืืืคืื ื ืื ืฉื ืืืืื ืืื ืืฉืืื ืืืจืืข. ืจืง ืงืืืคืื ื ืืช ืืืืื ืืืืื ืืงืื ืืช ืืืืจืืข ืืืืขืืืจ ืืช ืืคืืงืืก. 2. ืื ืืฉืื ื ืจืืฆื ืืืขืืืจ ืืช ืืคืืงืืก ืื td ื input ืฉื ืืฆื ืืชืืื ืืฉ ืืืฆืข ืืช ืืงืจืืื ืืืงืืืคืื ื ืื ืฉื ืืืืื, ืื ืืื ืื ืฉืืืืืจื ืืช ื input ืฉืืชืื ื td. 3. ืืื ืืฉืื ื ืจืืฆื ืืืขืืืจ ืืช ืืคืืงืืก ืื input ื td ืฉืืืื ืืืชื - ืคื ืฆืจืื ืืืจ ืืงืจืื ื focus ืืงืืืคืื ื ืืช ื"ืชื ืืืืื" ืื ืืื ืืืช ืฉืืฆืจื ืืช ื td. ืืงืืฆืืจ ืื ืงืืืคืื ื ืื ื Shadow DOM ืืืจืืืช ืขื ืืืืื ืืื ืฉืืื ืืืฆืจืช. ืขืื ืฉืชื ื ืงืืืืช ืฉืืืืชื ืืืืืืื ืืืืช ืขื ืืื: 1. ืืืืจืช ืงืืืฅ CSS ืืื ืืขืืื ืื ืืฉืคืืขื ืขื ืืงืืืคืื ื ืืืช ืฉื lit. ืื ืงืืืคืื ื ืื ืืืืืช ืืืืืืจ ืืช ืงืืืฅ ื CSS ืืขืฆืื. ืืืื ืืขืืืฃ ืืฉืจืืฆืื ืืืืืืจ ืขืืฆืื ืืืืืืื ืืืคืืืงืฆืืืช lit. 2. ืื ืื ืื ืืืืคืืืืืก ืฉื ืืื ืืื ืืืจืื ืืืืืจืืืืช ืืืืช ืื ืชืืื ืขืืืืช ืืืืืชื ื. ืืืืืื ืืืจื ืืืืจืช ืืชืื ืืืช ืืจืืืื ืฉืืื ืื ืืคืฉืจ ืืืฉืชืืฉ ืืืฉืชื ื ืืื ืืงืืืข ืื ืืืื ื tag ืืชืื ืืชืื ืืช. ืืคืฉืจ ืืขืงืืฃ ืืช ืื ืื ืืฉืชืืฉืื ืืคืื ืงืฆืื ืืืจืช ืฉืืื ืืื ืืืฆืืจ ืืช ืืชืื ืืช (ืืฉืชื ืืคืื ืงืฆืืืช ืงืืจืืื ืืืืชื ืฉื html), ืืื ืื ืืืืืื ืืช ืืจืืืงืืืืืืช.
1 419
ื ืืืื ืคืืงืืก ื Shadow DOM
ืืื ืืงืฉืืื ืืืจืืืืื ืฉืืื ืื ืืขืืืื ืขื ืืื ืืื ืืืืคืจื ืืืจืขืืื ืฉืื ืืืืจืื ืืืื ืืืืชื ืขืืื. ืืืขืฉื ืืืจ ืืจืื ืฉื ืื ืฉืคืจืืืืืืจืงืื ืฉื ืืื ืื ืกืื ืืงืืช ืืช "ืืขืืื ืืืื" ืฉื ืืืคืืคื ืืืื ืืช ืืชืืื ืงืืจืืช. ืืขืืืื ืขื ืืื ืืงืืจ ืืืจ ืฉื - ืืืื ื Shadow DOM, ืืืื ืืขืืจืช ืืืืืข ืืื ืงืืืคืื ื ืืืช ืืืืืช ืืงืจืืช ืจืง ืืจื ืื ืื ืื ืืืืจืืขืื.
ืืืืืื ืืคืขื ืื ืืชื ืืืื ืฉืืืจืืืช ืืงืืืคืื ื ืื ืืืช ืืฉืืื ืืชื ืืงืืืคืื ื ืื ืืืจืช ืืฉืืื ืืืืื, ืืจืฆืืชื ืฉืืืืฆื ืขื ืืืฆืื ืืฉืื ื ืืคืืงืืก ืขื ืืื ืืชืืื ืชืฉื ื ืืช ืืคืืงืืก ืืชื ืฉืืืืื, ืืฉืืื ืืขื ืื ืืชืืช (ืืคื ืืืฅ ืฉื ืืืฅ).
ืืคืฉืจ ืืืฆืื ืืช ืืงืื ืืืชืืฆืื ืืกืืืงืืืืฅ ืืื:
https://stackblitz.com/edit/vitejs-vite-r29prn?file=src%2Fmy-element.ts
ืืื ืืงืื ืืืืืงื:
import { LitElement, css, html, unsafeCSS } from 'lit'
import { customElement, property } from 'lit/decorators.js'
import litLogo from './assets/lit.svg'
import viteLogo from '/vite.svg'
import _ from 'lodash';
import style from "./index.css?inline";
@customElement('my-cell')
export class MyCell extends LitElement {
static styles = unsafeCSS(style);
static shadowRootOptions = {...LitElement.shadowRootOptions, delegatesFocus: true};
handleKeypress(ev: KeyboardEvent) {
if (ev.key === "Enter") {
if (this.shadowRoot?.activeElement === this.shadowRoot?.querySelector('td')) {
// td is in focus
this.dispatchEvent(new Event('focusinside', {composed: true, bubbles: true}))
} else {
this.shadowRoot?.querySelector('td').focus();
};
} else if (ev.key === "ArrowRight") {
this.dispatchEvent(new Event('focusright', {composed: true, bubbles: true}))
} else if (ev.key === "ArrowLeft") {
this.dispatchEvent(new Event('focusleft', {composed: true, bubbles: true}))
} else if (ev.key === "ArrowUp") {
this.dispatchEvent(new Event('focusup', {composed: true, bubbles: true}))
} else if (ev.key === "ArrowDown") {
this.dispatchEvent(new Event('focusdown', {composed: true, bubbles: true}))
}
}
takeFocus(ev: KeyboardEvent) {
if (ev.key === "Enter") {
this.shadowRoot?.querySelector('td')?.focus();
}
}
render() {
return html\<td
tabindex="1"
@keyup=${this.handleKeypress}
class="border-dashed border border-1 border-gray-500 focus:border-solid focus:border-green-200 focus:border-2"
>
<slot></slot>
</td>
\
}
}
@customElement('my-table')
export class MyTable extends LitElement {
static styles = unsafeCSS(style);
@property({ type: Number })
rows = 4
@property({ type: Number })
columns = 2
focusUp(e: any) {
const me = e.target;
const tr = me.parentNode;
const index = Array.prototype.indexOf.call(tr.children, me);
tr.previousElementSibling.children[index].focus();
}
focusDown(e: any) {
const me = e.target;
const tr = me.parentNode;
const index = Array.prototype.indexOf.call(tr.children, me);
tr.nextElementSibling.children[index].focus();
}
render() {
return html\
<table class="bg-orange border-collapse"
@focusinside=${(e: any) => e.target.firstElementChild.focus()}
@focusright=${(e: any) => e.target.nextElementSibling.focus()}
@focusleft=${(e: any) => e.target.previousElementSibling.focus()}
@focusup=${this.focusUp}
@focusdown=${this.focusDown}
>
<tbody>
${_.range(this.rows).map((i) => (
html\
<tr>
${_.range(this.columns).map((j) => (
html\<my-cell>
<input
type="text"
value="${\${i}, ${j}\}"
class="outline-none bg-transparent border-none border-2"
/></my-cell>\
))}
</tr>
\
))}
</tbody>
</table>
\
}
}
declare global {
interface HTMLElementTagNameMap {
'my-table': MyTable1 419
ืืคืื ืงืฆืืืช toReversed ื toSorted ื JavaScript
ืื ื ืชืืื ืืืื ืืฉืฉืคืช ืชืื ืืช ืืืงืืช ืขืื ืฆืขื ืืืืืื ืืคืื ืงืฆืืื ืืื, ืืื ืืืื ืืกืืคืืจ ืืืื ืขื ืฉืชื ืคืื ืงืฆืืืช ืืืฉืืช ื JavaScript - ืืคืื ืงืฆืืืช toReversed ื toSorted, ืืืืจืกืืืช ืืคืื ืงืฆืืื ืืืืืช ืฉื reverse ื sort. ืืขืื ืฉืืคืื ืงืฆืืืช ืืืงืืจืืืช ืฉืื ื ืืช ืืื ื ืื ืชืื ืื, ืืืืจืกืืืช ืืืืฉืืช ืฉืืื ืืืืืจืืช ืื ื ืขืืชืง ืฉื ืืื ื ืื ืชืื ืื ืืืืื ืื ืืคืื.
ืืคืื ืงืฆืื reverse ืฉื JavaScript ืืืคืขืืช ืขื ืืขืจื ืืืืคืืช ืืช ืืืืืจืื ืื:
> const x = [1, 2, 3, 4];
undefined
> x.reverse()
[ 4, 3, 2, 1 ]
ืืืืจืกื ืืืืฉื ืฉืื toReversed ืืืืืจื ืขืืชืง ืืืฉ ืฉื ืืืขืจื ืขื ืืืืืจืื ืืคืืืื:
> const x = [1, 2, 3, 4]
undefined
> x.toReversed()
[ 4, 3, 2, 1 ]
> x
[ 1, 2, 3, 4 ]
ื ืฉืื ืื ืฉืืฉืืืขืจื ืืงืื ื ืืืืื ืืื ืืคื ืืืืื ืื ืืืขืชืงืื, ืืื:
> const x = [{a: 10}, {a: 10}, {a: 20}, {a: 30}]
undefined
> x.toReversed()
[ { a: 30 }, { a: 20 }, { a: 10 }, { a: 10 } ]
> x.toReversed()[0].a = 40
40
> x
[ { a: 10 }, { a: 10 }, { a: 20 }, { a: 40 } ]
ืื ืืืงืื ืืืคืื ืื ืื ื ืจืืฆืื ืืืืื ื ืืื ืืงืจืื ื toSorted, ืฉืืื ืืืืจืกื ืืคืื ืงืฆืืื ืืืืช ืฉื sort. ืืื sort ืื toSorted ืืืืื ืืงืื ืคืื ืงืฆืืืช ืืืื ืื ืืืืื ืืคื ืกืืจ ืืืืื ื:
> const values = [1, 10, 21, 2];
undefined
> values.toSorted()
[ 1, 10, 2, 21 ]
> values.toSorted((a, b) => a - b)
[ 1, 2, 10, 21 ]
ืืคืฉืจ ืืืฉืื ืขื ืฉืชืืื ืืชืืจ ืืืจืกื ืืืืจื ืืืจืืจื ืืืชืจ ืฉื array.slice().reverse() ื array.slice().sort:
> x.slice().reverse()
[ 9, 1, 2, 10 ]
> x
[ 10, 2, 1, 9 ]
> x.slice().sort()
[ 1, 10, 2, 9 ]
> x
[ 10, 2, 1, 9 ]1 419
ืืืืฉื ืืืคืื ื Pair Programmning ืืขืื ืืืชืจ
ืชืื ืืช ืืฆืืืช ืืืื ืืขืืืจ ืื ื ืืืชืื ืงืื ืืื ืืืชืจ ืืืืจ ืืืชืจ, ืืื ืื ืืืื ืืงืืืช ืืืฉืชืืฉ. ืืืคืชื ืืืฆืืื, ืื ืื ืงืฉื ืืืื ืืืืฉืื ืืื ืืืืจื ืืืื ืฉื ืืฉืืชืคืื ืืคืจืืืงื. ืื ื ืืื ืืืคืื ืฉืขืืืจืื ืื ืืืืืช ืื ืฉืื ืฉืืืื ืืืชืื ืืืชื ืงืื, ืืืืืืคืื ืื ืฉืื ืฉืขืืืฃ ืืื ืืฆืืืื ืฉื ืขืืื ืื ืคืจื:
1. ืืืจื ืืืจ ืื ืืืจื ืขื ืจืงืข ืฉืื ื ืืฉืืื. ืืืืจื ืฉื Pair Programming ืืื ืื ืืืชืื ืงืื ืืื ืฉืืืชืจ ืืืจ ืืื ืืืืจ ืขื ืืืืจืื ืืืฉืืขืืชืืื ืืชืืืื ืืคืืชืื. ืืื ืฉืืฉ ืคืขืจ ืืจืงืข ืฉืืื ืืคืฉืจ ืืืื ืืงืื ื ืงืืืช ืืื ื ืืกืคืช ืืืขื ืืื ืช ืขื ืืืจืืืืงืืืจื.
2. ืืืจื ืืื ืืืืืืืช ืืืชื ืืคืืืช ืืื ืืฆืืืื ืืืื ืื ืืืื ื ืืืื. ืืืืจื ืฉื Pair Programming ืืื ืืืืื, ืื ืื ืื ื ืจืืฆืื ืืฆืืฆื ืืื ื Debug ืืืื ื ืืืคืืฉ ืืืื ืืจื ื.
3. ืขืฉื ืฉืืขืืจื ืืืช - ืื ืฆืจืื ืืืชืื ืืื ืืช ืื ืืงืื. ื ืกื ืืืืืื ืืื ืขื ืืืจืืืืงืืืจื, ืืืืฉ ืืื ืืช ืืืืงืื ืืงืฉืื ืืืืฉืืืื ืฉื ืืคืจืืืงื, ืืื ืืืชืงืื ืื ืคืจื ืืืืงืื ืฉืื ืืืจืฉืื ืืืฉืื.
4. ืืงืฉืืื ืืฆื ืืฉื ื ืื (ืืืืืืื) ืืฉื ืฉืืข ืฉืื ืืืืจืื ืฉืืืืืช - ืืืืจืื ืฉืืชืืื ื ืขื ืืืจ ืื ืืืจื ืขื ืจืงืข ืฉืื ื ืืฉืื ื? ืื ืืืืจ ืฉืืืง ืืืืืจืื ืฉื ืจืืื ืื ื ืืืื ืื ืืืืืื ืืืื ืขืืืจื ืืืฉืื ืืืคืชืืขืื, ืืืืง ืืืืืจืื ืฉื ืจืืื ืืื ืืืื ืื ืืืืืื ืืืื ืื ื ืืืฉืื ืืืคืชืืขืื. ืืื ืืื ืืจืืข ืืช ืืืืื ืืืืืื ืืื ืืฉืืืืืช ืืืืจื ืืืืืื ืฉื ืืฆื ืืฉื ื ืื ืืืขืชื ืืขืืืืืช ืฉืื ืื, ืืืื ืืื ืืืื ืื ืืืงืฉืื ืืื ืกืืช ืจืขืืื ืืช.
5. ืืื ืกืืืฉ ืืื ืืืจ - ืืืง ืืืืฉืืง ืฉื ืืขืืื ืืืื ืื ืืืืืฉืฃ ืืจืขืืื ืืช ืืืฉืื ืฉืื ืืืืชื ืื ืกืื ืื ืืืืชื ืืื. ืืืง ืืืจืขืืื ืืช ืืืื ืืืืื, ืืืง ืืจืืขืื ืืืืง ืื ืืกืคืืง ืืืืืฉืื. ืื ื ืืฉืชืื ืืงืืืจ ืืืจ ืขื git restore ืืช ืืจืขืืื ืืช ืืืจืืขืื, ืืื ืืช ืืื ืืืืืฉืื ืืืฉืืืจ ืืฆื ืขื git stash. ืืื ืืื ืืืื ืืืื ืืื ืืืงืืจ ืืืชื ืฉืื. ืื ืฉืื. ืืื ืืกืืจ.
ืืฉ ืืื ืืืคืื ื ืืกืคืื ืฉืขืืื? ืืฉืื ืืฉืืืข ืืชืืืืืช ืคื ืื ืืืืืจื.
1 419
ืขืืืื ืืืื'ืื ืืืืืืื ืขื Watchtower
ื ืืื, ืื ืื ื ืื ืืืืจืื ืืืจืืฅ ืืขืจืืช ืคืจืืืงืฉื ืขื Docker Compose. ื ืืื, ืืื ืื ืืื ืืื ืืืืกืคืช ืขืื ืงืื ืืืื ืจืื, ืื ืืืื ืืงืื ืืืื ืจืื ืฉืจืฆืื ืืืื ืืืืจืื ืฉืงืืืจื ืืก ืืืืืื ืืืืขืื ืืขืฉืืช. ืืื ืื ืืคืฉืจ ืืืชืืืื ืขื ืืคืฉืืืช ืฉืื ืืืคืขืืื ืืฉืืคืจืืืงื ืงืื ืืืงืจ ืงืืืคืื ืื ืืืื ืืชืช ืคืืชืจืื ืกืืืจ, ืื ืื ืืื ื.
ืืื ืื ืื ื ืืืจ ืืจืืฆืื ืืขืจืืช ืขื Docker Compose, ืืื ืคืขื ืื ืื ื ืฆืจืืืื ืื ืืืขืืืช ืืืจืกื ืืืฉื ืฉื ืืื ืืืืื'ืื. ืืืืืง ืืฉืืื ืื ื ืืฆืจ Watchtower.
ื Watchtower ืืฉ ืชืคืงืื ืืื ืคืฉืื ืืฉื ืืงืกื ืฉืื - ืคืขื ื X ืืื (ืืื ืฉืชืืืืื) ืืื ืืชืืืจ ื Registry, ืืืคืฉ ืืืจืกืืืช ืืืฉืืช ืฉื ืืืืื'ืื ืืื ืืื ืืืฆื ืืื ืืืจืื ืืช ืืืืจืกืืืช ืืืืฉืืช ืืืขืื ืืืืฉ ืงืื ืืืื ืจืื ืขื ืืืชื ืืืจืกืืืช ืืืฉืืช. ืื ืืืืจ ืฉืืกืคืืง ืืืืืฃ ืืืื' ื Registry ืืฉืืื ืืขืืื ืืืื ื ืจืฆื ืืื ืืืจ ืืื.
ืืื ืื ืขืืื? ืืืกืืช ืคืฉืื. Watchtower ืืื ืกืจืืืก ืฉืื ืื ื ืืืกืืคืื ื docker-compose.yml, ืืคืฉืจ ืื ืืกืฃ ืืกืจืืืก ืฉืื ื ืื ืืงืืืคืื ืืืจ ืืืืจื:
version: "3"
services:
cavo:
image: ynonp/myapp:latest
ports:
- "443:3443"
- "80:3080"
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 30
ืื ืฆืจืื ืืฉืื ืื ื-3 ื ืงืืืืช ืฉืืคืฉืจ ืืืคืื ืืื:
1. ืื ืืืืื' ืฉืืืจ ืืจืืืกืืจื ืคืจืื ืื ืฆืจืื ืืืขืืืจ ืคื ืืื ืืชืื ืืงืื ืืืื ืจ ืฉื watchtower ืืช ืคืจืื ืืืชืืืจืืช, ืืืจื ืืื ืืฆืืจืช ืืืคืื ืืงืืืฅ config.json ืฉื ืืืงืจ ืคื ืืื ืืชืื ืืงืื ืืืื ืจ.
2. ืืืื ืืจืืื ืงืืืข ืื ืืื ืืื ืฆืจืื ืืืืืง ืื ืงืืืืช ืืืจืกื ืืืฉื ืฉื ืืืืื'. ืืจืืจืช ืืืืื ืืื ืคืขื ืืืื ืื ืืฉืืื ืื ืื ืื ืฉื ืืืคืืืืื ื ื CI/CD ืืืื ืืืืจืื ืืช ืื. ืืืกืคืจ 30 ืืืืืื ืืฆืืื 30 ืฉื ืืืช.
3. ืื ืื ืืชืืชื ืืืจืช ื watchtower ืืขืืื ืืช ืื ืืืืื'ืื ืืื ืืงืื ืืืื ืจืื ืฉืจืฆืื ืขื ืืืืื ื. ืืคืฉืจ ืืกื ื ืงืื ืืืื ืจืื ืื ื ืขืืืจ ืืืจื ืืืื ืืจืืื ืืช ืฉื ืืงืื ืืืื ืจ ืฉืื ืื ื ืจืืฆืื ืืขืืื (ืฉืืื ืื ืฉืื ืฉื ืืงืื ืืืื ืจ ืื ืฉื ืืกืจืืืก ืืงืืืคืื), ืื ืฉืืื ืืืชืจ ืคืฉืืื ืืืขืชื ืืื ืืืืืืจ label ืขื ืื ืงืื ืืืื ืจ ืฉืฆืจืื ืขืืืื. ื ืฉืื ืื ืฉืื ืืฉ ืื ื ืืกืคืจ ืคืจืืืงืืื ืฉืื ืื ืขื ืงืืฆื docker-compose ืฉืื ืื ืื ืขืืืื watchtower ืฉื ืืื ืขืฉืื ืืฉืืจื ืงืื ืืืื ืจืื ืฉื ืืคืจืืืงื ืืฉื ื.
ืกื ืืื ืฉืืืื ืฉืืืฉืช ืืกืขืืคืื ืืืื ืืืชื ื ื docker-compose.yml ืฉื ืจืื ืืขืจื ืื:
services:
db:
image: postgres:16.3
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${DBPASSWORD}
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/ynon/.docker/config.json:/config.json
command: --interval 30 --label-enable
web:
image: my.private.registry.com/webapp:latest
labels:
com.centurylinklabs.watchtower.enable: true
environment:
DATABASE_PASSWORD: ${DBPASSWORD}
DATABASE_HOST: db
ports:
- "3000:3000"
depends_on:
- db1 419
ืขืืฉืื ืืคืขืืื ืืืืฉ ืืช ืืฉืจืช ืืฉื ื ืืืื ืืช - ืืืืื ืืื ื ืคืขืื
./bin/vite dev ืืืืืื ืฉื ื ./bin/rails s. ืื ืืื ืืื ืืื ืฉืฆืจืื ืชืืืื ืืืืื ืก ื localhost:3000 ืืืจืืืช ืืช ืืงืืืคืื ื ืื ืืื ืืกืฃ ืชืืืื ืืฉื ืืช ืืช ืงืื ืืงืืืคืื ื ืื, ืืฉืืืจ ืืืจืืืช ืืช ืืขืืื ืืืคืืคื ืืชืขืืื.
ืืฉืืื ืืจื ืืจ ืงืืืคืื ื ืื ืืืจืช ืืคื ืืขืืื ืื ื ืืขืืืฃ ืืืชืื ืงืฆืช ืงืื JavaScript ืฉืืกืชืื ืืขืืื, ืืืขื ืงืืืคืื ื ืืืช ืืฆืืจื ืืื ืืืช ืืคื data attribute ืฉื ืืืื ืืื ืืืืชืื ืงืืืคืื ื ืืืช ืืื.
ืื ื ืืฉื ื ืืช ืฉื ืืงืืืฅ ืืจืืฉื ื application.js ื application.jsx ืืืืชื ืื ืืช ืืชืืื ืืื:
// file: app/frontend/entrypoints/application.jsx
import React from 'react';
import { createRoot } from 'react-dom/client';
async function renderAll() {
const reactEntrypoints = document.querySelectorAll('.react');
for (const el of reactEntrypoints) {
const componentName = el.dataset.component;
const Component = (await import(\../components/${componentName}.tsx\)).default;
const root = createRoot(el);
const dataprops = el.dataset.props;
const props = dataprops ? JSON.parse(dataprops) : {};
root.render(<Component {...props} />)
}
}
renderAll();
ืื ืืช ืงืื ืืงืืืคืื ื ืื ืื ื ืืขืืื ืื ืืคืฉืจ ืืืืจืื ืืฉื ืืช ื render (ืืื ืงืืจื ืืงืื ืืจืืฉื) ืืืื ืืงืืืฅ Home.tsx ืืืื ืขืืฉืื ืจืง ืืช ืื:
import React from 'react';
export default function Home({text}: {
text: string
}) {
return <div>
<h1>{text}</h1>
<a href="/about">About Page</a>
</div>
}
ืืืกืืื ืื ื ืืขืืื ืืช ื View ืืงืืืฅ app/views/home/index.html.erb ืืื ืืืฆืืจ ืืช ืืงืืืคืื ื ืื:
<div
class="react"
data-component="Home"
data-props='<%= {text: "hello"}.to_json %>'
></div>
ืฉืืื ืื ืฉื Properties ืืงืืืคืื ื ืื ืืชืืืื ืืื ื View, ืื ืืืืจ ืฉื ืืื ืืงืืืช ืืืขืืืจ ืืืชื ืื Controller.
ืจืง ืืฉืืื ืืืฉืืง ืื ื ืืืกืืฃ ืืฃ ื ืืกืฃ ืืืชืจ. ืืงืืืฅ app/controllers./home_controller.rb ืื ื ืืืกืืฃ ืขืื ืคืื ืงืฆืื:
class HomeController < ApplicationController
def index
end
def about
end
end
ืืชืืงืืืช frontend/components ืื ื ืืืฆืจ ืงืืืคืื ื ืื ื ืืกืคืช ืืฉื About.tsx:
// file: app/frontend/components/About.tsx
import React from 'react';
export default function About() {
return <p>About Us</p>
}
ืืืงืืืฅ app/views/home/about.html.erb ืื ื ืืืชื ืืช ืคืจืื ืืงืืืคืื ื ืื:
<div
class="react"
data-component="About"
></div>
ืืืกืืื ืืงืืืฅ config/routes.rb ืื ื ืืืกืืฃ ืืช ืื ืชืื:
Rails.application.routes.draw do
root to: 'home#index'
get '/about', to: 'home#about'
end
ืขืืฉืื ืืคืฉืจ ืืขืืืจ ืืื ืฉื ื ืืืคืื ืืืจืืืช ืฉืื ืื ืืกื ืืืฃ ืืฆืืื ืืช ืืงืืืคืื ื ืื ืฉืืชืืืื ืื.
ืขืื ืกืคืจืืืช ืืืืืฆืืช
ืืฉ ืขืื ืืกืคืจ ืกืคืจืืืช ืฉืืคืขืืื ืื ื ืืฉืื ืฉืืืคืืืช ืืช ืืืืืืจ ืืื ืจืืืงื ืืจืืืืก ืืืคืืื ืืืชืจ ืืืฆืื:
1. ืืกืคืจืื js-from-routes ืืืืจืช ืืื ื Routes ืฉืืืืืจืื ืืจืืืืก ืืชืืจ ืคืื ืงืฆืืืช ื JavaScript.
2. ืืกืคืจืื typesfromserializers ืืืืขืช ืืืืฆืจ ืืืฉืงื ืืืืคืกืงืจืืคื ืืฉืืจืืช ืืชืื Serializers. ืกืจืืืงืืืืืจืื ืืื ืฉืื ืืืืจ ืื ืื ืื ืื ืจืืืืกื ืฉืงืืืข ืืื ืืืื ืืืคืื ื JSON. ืขื ืืกืคืจืื ืืืืช ืืฉ ืื ื ืืืืืืืืช ืืืคืืกื ืืืืคืกืงืจืืคื ืฉืืชืืืืื ืืื ื JSON-ืื ืฉืื ืื ื ืฉืืืืื ืืจืืืืก (ืืื ืื ืืชืืจ props ืืงืืืคืื ื ืืืช ืื ืืจื ื API).1 419
ืืื ื ืคืจืืืงื Rails, React ื TypeScript
ืื ืื ื ื 2024, ืจืืืืก ืขืืืื ืฉืืื ืืช ืืืืืฅ ืืจืืืงื ืืคืื ืืกืคืจืืืช ื UI ืืืืคืืืืืช ืฉื ืืคืชืืื ืจืืื, ืืืืื ืืฉืืืื ืืืืคืกืงืจืืคื. ืืฉ ืืืื ืืคืฉืจืืืืช ืืฉืืืื ืฉืืืฉืช ืืืื ืืืืืืืช ืืืื ืืื ืืื ื ืจืืฆื ืืืจืืืช ืืื ืฉืืื ืืืช ืฉืขืืื ืืฉืืืื ืื ืืื.
ืจืืืืก
ืื ื ืืชืืื ืืืฆืืจืช ืคืจืืืงื ืจืืืืก 7 ืืืฉ ืขื:
$ rails new --skip-javascript .
ืืืจืืช ืฉืืฉ ืืจืืืืก ืื ืื ืื ืืขืืืื ืขื JavaScript (ืืคืืื ืฉื ืืื), ืื ื ืืขืืืฃ ืืช vite ืืืื ืื ื ืืชืงืื ืืช ืื'ื vite-ruby ืืคื ืืืจืืืช ืืืชืงื ื ืฉืืื. ืืชืื ืชืืงืืืช ืืคืจืืืงื ืื ื ืืืชื:
bundle add 'vite_rails'
bundle exec vite install
ืืื ืืคืฉืจ ืื ืกืืช ืืืคืขืื ืืช ืฉืจืช ืืคืืชืื:
$ ./bin/vite dev
ืืืฆืื ืืืคืืข ืืคืื ืืื:
The CJS build of Vite's Node API is deprecated. See https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.
VITE v5.2.13 ready in 242 ms
โ Local: http://localhost:3036/vite-dev/
โ press h + enter to show help
^C
ืื ื ืขืืฆืจ ืืืชื ืขื Ctrl+C ืืื ืืชืงื ืืื ืงืื ืคืืืืจืฆืืืช. ืืจืืฆืื:
$ yarn add vite-plugin-rails typescript react react-dom @vitejs/plugin-react @types/react @types/react-dom
ืืื ืืฉื ืื ืืช ืืงืืืฅ vite.config.ts ืืชืืื ืืื:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import ViteRails from 'vite-plugin-rails'
export default defineConfig({
plugins: [
react(),
ViteRails(),
],
})
ืืืฉืืืื ืืฉืืจืช ืืคืงืืื ืืืืฆืจืื ืืช ืืงืื ืืจืืืจ ืืจืืฉืื:
$ ./bin/rails g controller HomeController index
ืืื ืืงืืืฅ config/routes.rb ืื ื ืืืกืืฃ ืืคื ืื ืืืื ืืื ืฉื ืืื ืืจืืืช ืืืชื ืืืคืืคื:
Rails.application.routes.draw do
root to: 'home#index'
end
ืืคืขืืืื ืืช ืืฉืจืช ืขื ./bin/rails s, ื ืื ืกืื ื localhost:3000 ืืจืืืื ืืช ืืืฃ ืฉืืฆืจื ื.
ืจืืืงื
ืงืืืฅ ื JavaScript ืฉื ืืขื ืืฉืืืืฉืื ืฉืื ื ืขืืื ืืื app/javascript/entrypoints/application.js. ืื ื ืืืฆืจ ืชืืงืืื ืืืฉื ืืฉื app/frontend/components ืืืชืืื ืงืืืฅ ืืืฉ ืืฉื Home.tsx. ืชืืื ืืงืืืฅ ืืื:
import React from 'react';
import { createRoot } from 'react-dom/client';
function Home({text}: {
text: string
}) {
return <h1>{text}</h1>
}
const main = document.querySelector('main')!;
const root = createRoot(main);
root.render(<Home text="Hello World" />);
ืืงืืืฅ ืืืืืจ ืืช ืืงืืืคืื ื ืื ืืจืืฉืื ื ืฉืื ื ืืื ืืจื ืืจ ืืืชื ืืืกื. ืื ืขืืืื ืื ืืกืคืืง ืืื ืื ืื ืืืืจ ืฉืื ืขืืื ืฉื ืืื ืก ืืืื ืืฆืื ืืช ืืืชื ืงืืืคืื ื ืื. ืชืืฃ ื ืชืงื ืืช ืื. ืืื ืงืืื ืืืื ื ืจืื ืฉืจืืืื ืืช ืืงืืืคืื ื ืื ืขื ืืืกื.
ืืคื ื ืฉื ืืื ืืืชืงืื ืืฉ ืืขืืื ืืช ืืงืืืฅ app/views/layouts/application.html ืื ืฉืืืื ืืจืขื ื ืืคื vite ืืื ืืืื ืืืื ื main ืืืื ื ืจื ืืจ ืืช ืืงืืืคืื ื ืื ืฉืืฆืจื ื. ืขืืื ื ืืช ืชืืื ืืงืืืฅ ืืงืื ืืื:
<!DOCTYPE html>
<html>
<head>
<title>RailsReactTypescriptDemo</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<% if Rails.env.development? %>
<script type="module">
import RefreshRuntime from 'http://localhost:3036/vite-dev/@react-refresh'
RefreshRuntime.injectIntoGlobalHook(window)
window.$RefreshReg$ = () => {}
window.$RefreshSig$ = () => (type) => type
window.__vite_plugin_react_preamble_installed__ = true
</script>
<% end %>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag "application" %>
<%= vite_client_tag %>
<%= vite_javascript_tag 'application' %>
<!--
If using a TypeScript entrypoint file:
vite_typescript_tag 'application'
If using a .jsx or .tsx entrypoint, add the extension:
vite_javascript_tag 'application.jsx'
Visit the guide for more information: https://vite-ruby.netlify.app/guide/rails
-->
</head>
<body>
<main />
<%= yield %>
</body>
</html>
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
