О тихом насилии неявных преобразований
JavaScript позволит сложить [] с {} — и ещё скажет спасибо. Полевой справочник по граблям.
Заметки с рабочего стола программиста — о коде, системах и странном удовольствии от отладки в 2 часа ночи.
Я Максим Жабин — инженер-программист, пишущий о ремесле. TypeScript сегодня, Rust завтра, ассемблер для души. Новое эссе раз в две недели, по вторникам.
JavaScript позволит сложить [] с {} — и ещё скажет спасибо. Полевой справочник по граблям.
Забудьте про регэкспы. Забудьте про генераторы. Двести строк switch — и вы поймёте что-то новое о каждом языке, которым когда-либо пользовались.
Типы Result, каналы ошибок и любопытное спокойствие, когда всё падает громко — хотя бы в разработке.
Мигающее приветствие наверху страницы — не CSS-анимация, а настоящий React-хук. Печатает, ждёт, стирает, повторяет. Нажмите «копировать» и вставьте в свой проект.
// Самоочищающийся хук печатной машинки. Без зависимостей, ~30 строк.
import { useState, useEffect } from 'react';
export function useTypewriter(
words: string[],
speed = 80,
pause = 1800,
) {
const [text, setText] = useState('');
const [i, setI] = useState(0);
const [del, setDel] = useState(false);
useEffect(() => {
const word = words[i % words.length];
const delay = del ? speed / 2 : speed;
const t = setTimeout(() => {
setText(del
? word.slice(0, text.length - 1)
: word.slice(0, text.length + 1));
}, delay);
if (!del && text === word) {
const p = setTimeout(() => setDel(true), pause);
return () => { clearTimeout(t); clearTimeout(p); };
}
if (del && text === '') {
setDel(false);
setI(i + 1);
}
return () => clearTimeout(t);
}, [text, del, i, words, speed, pause]);
return text;
}
function Hero() {
const greeting = useTypewriter([
'hello, traveler.',
'you found /dev/log.',
'console.log(love)',
]);
return <h1>{greeting}</h1>;
}
142 эссе о программировании, написанные за четыре года. Здесь — отфильтровано по свежести, полный индекс лежит в JSON.
Одно эссе. Без трекинга, без рекламы и без всяких «10x». Отписка в один клик — я даже не обижусь.