ΠΡΠΈΠ²Π΅Ρ, ΡΠΌΠΎΡΡΠ΅Π» ΡΠ²ΠΎΠΉ ΡΠ°Π·Π±ΠΎΡ Π±ΠΎΡΠΎΠ² Π½Π° ΡΡΡΠ±Π΅, ΠΈ Ρ Π½ΠΈΡ Ρ Π²ΡΠ΅Ρ Π±ΡΠ»Π° ΠΎΠ΄Π½Π° Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: Π²Π΅ΡΡ ΠΊΠΎΠ΄ - ΠΏΠΎΡΡΡΠ½ΠΊΠ° Π½Π° 5ΠΊ ΡΡΡΠΎΠΊ. ΠΠΎΡΡΠΎΠΌΡ Ρ ΠΌΠ΅Π½Ρ ΡΠΎΠ·ΡΠ΅Π» Π²ΠΎΠΏΡΠΎΡ: ΠΊΠ°ΠΊ ΡΡ Π²ΠΈΠ΄ΠΈΡΡ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΡΠΎΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ Ρ VK-IO. ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² Π½ΡΠ½Π΅ΡΠ½Π΅ΠΌ Π²ΠΈΠ΄Π΅ ΡΡΠΎ Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΡΡΠ½ΠΊΠ°, Π»ΠΈΠ±ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ + ΠΊΠΎΠ½ΡΠΈΠ³ + ΠΊΡΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π²ΠΎΡ ΡΠ°ΠΊ:
/** <strong i="8">@filename</strong>: config.ts */
export const vk = new VK({ /* ... */ })
/** <strong i="11">@filename</strong>: feat1.ts */
import { vk } from "./config"
vk.updates.on('message', async(ctx, next) => {
/* code */
})
/** <strong i="14">@filename</strong>: index.ts */
import { vk } from "./config"
import "./feat1"
vk.updates.startPolling().then(() => console.log("Bot works!"))
Π Ρ Π½Π΅Π³ΠΎ ΡΠΎΠΆΠ΅ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
Π₯ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΡΡΠ»ΡΡΠ°ΡΡ ΡΠ²ΠΎΠΉ ΠΎΡΠ²Π΅Ρ Π½Π° ΡΡΠΎ ΠΈ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π³ΠΎ Π² ΠΎΡΠ΅Π½Ρ ΡΠ²Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² README.md
ΠΠ΅ ΡΠΊΠ°ΠΆΡ ΡΡΠΎ "ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ" ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄Π΅Π»ΡΡΡ Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°ΡΡΠΈ.
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ monorepo Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°). ΠΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΈ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΠΎΡΠ° ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ (ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π»ΡΠ±ΠΎΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ Π΄Π»Ρ Π΅Π³ΠΎ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ). Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠΎ-Ρ ΠΎΡΠΎΡΠ΅ΠΌΡ ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Ρ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅, Π·Π΄Π΅ΡΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Docker.
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±ΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ²Π½ΡΠΌΠΈ, Ρ.Π΅. Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ "ΡΠΈΡ" Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡΡΠ°, ΠΈΠ½Π°ΡΠ΅ ΡΡΡ Π½Π°ΡΠ½ΡΡΡΡ ΡΡΡΠΈΠΉ ΠΊΠΎΡΠΌΠ°Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ. ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄:
// commands/random.ts
import { Command } from '@my-project/core';
import { getRandomIntegerInRange } from '@my-project/utils';
export const randomCommand = new Command({
slug: 'random',
aliases: [
'ΡΠ°Π½Π΄ΠΎΠΌ',
'random'
],
description = 'ΡΠ°Π½Π΄ΠΌΠΎΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π² ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ΅';
arguments: [
{
type: 'integer',
key: 'min',
label: 'ΠΌΠΈΠ½ΠΊ/ΠΌΠ°ΠΊΡ',
default: null
},
{
type: 'integer',
key: 'max',
label: 'ΠΌΠΈΠ½ΠΊ/ΠΌΠ°ΠΊΡ',
default: null
}
],
handler(context) {
// Π Π°Π±ΠΎΡΠ°Π΅ΠΌ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, Π° Π½Π΅ ΡΠ΅ΠΊΡΡΠΎΠΌ
let { min = null, max = null } = context.commander.params;
if (min === null && max === null) {
min = 0;
max = 100;
} else if (max === null) {
max = min;
min = 0;
}
const result = getRandomIntegerInRange(min, max);
return context.answer({
text: `ΡΠΈΡΠ»ΠΎ Π² ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ΅ ${min} - ${max}: ${result}`
});
}
});
// commands/index.ts
export * from './random';
// bot.ts
import {
Bot,
SessionManager,
RedisSessionStorage,
RateLimitManager,
CommanderManager
} from '@my-project/core';
import * as commands from './commands';
const sessionManager = new SessionManager({
storage: new RedisSessionStorage({})
});
const rateLimitManager = new RateLimitManager({
maxPerSecond: 1
});
const commanderManager = new CommanderManager();
for (const command of Object.values(commands)) {
commanderManager.add(command);
}
const bot = new Bot({
// ...options
});
// ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½Π°Ρ ΡΠ΅ΠΏΠΎΡΠΊΠ° middleware Π² Π±ΠΎΡΠ΅
bot.incoming.on('message', sessionManager.middleware);
bot.incoming.on('message', rateLimitManager.middleware);
bot.incoming.on('message', commanderManager.middleware);
bot.start()
.then(() => {
console.log('Bot started', error);
})
.catch((error: Error) => {
console.error('Error starting bot', error);
process.exit(1);
});
ΠΠ°ΠΆΠ½ΡΠ΅ Π²Π΅ΡΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° Π²ΡΡΠ΅:
@my-project/core
, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π²Π΅ΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Π±ΠΎΡΠ°.Dispatcher
. ΠΠ°ΡΠ΅ΠΌ ΠΆΠ΅ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ? ΠΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ β ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· Π»ΡΠ±ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ. ΠΠ· ΡΠ΅ΠΊΡΡΠ° ΠΌΡ ΠΏΠ°ΡΡΠΈΠΌ Π»ΡΠ±ΡΠΌ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅, Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π·Π°Π΄Π°ΡΡΡΡ ΡΠΆΠ΅ Ρ Π½ΠΈΠΌΠΈ ΠΈ Π°Π΄ΡΠ΅ΡΡΡΡΡΡ ΠΊ Π½ΡΠΆΠ½ΠΎΠΉ Π½Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π΅. Π’Π΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΌΡ ΠΈΠ·Π±Π΅ΠΆΠ°Π»ΠΈ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ² ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠΉ:export const dndCommand = new Command({
// ...
handler(context) {
return context.commander.enter('random', {
params: {
min: 1,
max: 20
}
});
}
});
ΠΡΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π² ΠΌΠΎΠΈΡ
Π±ΠΎΡΠ°Ρ
, ΠΈ ΠΎΠ½ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΌ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ ΠΏΡΠΎΡΡΡΡ
Π΄ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ
Π±ΠΎΡΠΎΠ². Π Π»ΡΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°ΠΊΠ΅Ρ @my-project/core
Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π°Π»ΠΈΠ°ΡΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΆΠ΅ Π²ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»Π° ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π»Π°, Π° ΡΠ°ΠΉΠ» Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
export { Bot, Command } from 'super-bot-library';
export { ViewerManager } from './middlewares';
Π ΡΠ»ΡΡΠ°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². ΠΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ Π΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΡΡΡ Π΅ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ Π±ΠΎΡΠ° Π½Π° Ρ
ΡΠΊΠ°Ρ
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌ Π² React
ΠΈΠ»ΠΈ Vue
, ΠΏΠΎΡΡΠΊΠ°ΡΡ Π²ΠΆΠΈΠ²ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎΡ ΠΊΠΎΠ΄.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ, ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΈΠΉ ΠΈ ΡΠ°Π·Π²ΡΡΠ½ΡΡΡΠΉ ΠΎΡΠ²Π΅Ρ. Π Ρ Π±Ρ Ρ ΠΎΡΠ΅Π» ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ, ΡΠ΅Π±Ρ ΠΎΡΡΠ°Π²ΠΈΡΡ issue ΠΎΡΠΊΡΡΡΡΠΌ, ΡΡΠΎΠ±Ρ Π΄ΡΡΠ³ΠΈΠ΅ Π»ΡΠ΄ΠΈ ΡΠΎΠΆΠ΅ ΡΠΌΠΎΠ³Π»ΠΈ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠ΅ ΡΠΊΠ°ΠΆΡ ΡΡΠΎ "ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ" ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄Π΅Π»ΡΡΡ Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°ΡΡΠΈ.
ΠΠ±ΡΠΈΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ monorepo Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°). ΠΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΈ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΠΎΡΠ° ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ (ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π»ΡΠ±ΠΎΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ Π΄Π»Ρ Π΅Π³ΠΎ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ). Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠΎ-Ρ ΠΎΡΠΎΡΠ΅ΠΌΡ ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Ρ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅, Π·Π΄Π΅ΡΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Docker.
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±ΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ²Π½ΡΠΌΠΈ, Ρ.Π΅. Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ "ΡΠΈΡ" Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡΡΠ°, ΠΈΠ½Π°ΡΠ΅ ΡΡΡ Π½Π°ΡΠ½ΡΡΡΡ ΡΡΡΠΈΠΉ ΠΊΠΎΡΠΌΠ°Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ. ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄:
ΠΠ°ΠΆΠ½ΡΠ΅ Π²Π΅ΡΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° Π²ΡΡΠ΅:
@my-project/core
, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π²Π΅ΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Π±ΠΎΡΠ°.Dispatcher
. ΠΠ°ΡΠ΅ΠΌ ΠΆΠ΅ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ? ΠΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ β ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· Π»ΡΠ±ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ. ΠΠ· ΡΠ΅ΠΊΡΡΠ° ΠΌΡ ΠΏΠ°ΡΡΠΈΠΌ Π»ΡΠ±ΡΠΌ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅, Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π·Π°Π΄Π°ΡΡΡΡ ΡΠΆΠ΅ Ρ Π½ΠΈΠΌΠΈ ΠΈ Π°Π΄ΡΠ΅ΡΡΡΡΡΡ ΠΊ Π½ΡΠΆΠ½ΠΎΠΉ Π½Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π΅. Π’Π΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΌΡ ΠΈΠ·Π±Π΅ΠΆΠ°Π»ΠΈ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ² ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠΉ:ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π² ΠΌΠΎΠΈΡ Π±ΠΎΡΠ°Ρ , ΠΈ ΠΎΠ½ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΌ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ ΠΏΡΠΎΡΡΡΡ Π΄ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ Π±ΠΎΡΠΎΠ². Π Π»ΡΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°ΠΊΠ΅Ρ
@my-project/core
Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π°Π»ΠΈΠ°ΡΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΆΠ΅ Π²ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»Π° ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π»Π°, Π° ΡΠ°ΠΉΠ» Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:Π ΡΠ»ΡΡΠ°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². ΠΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ Π΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΡΡΡ Π΅ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ Π±ΠΎΡΠ° Π½Π° Ρ ΡΠΊΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌ Π²
React
ΠΈΠ»ΠΈVue
, ΠΏΠΎΡΡΠΊΠ°ΡΡ Π²ΠΆΠΈΠ²ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎΡ ΠΊΠΎΠ΄.