Ответ
Один из способов — использовать общий код через монорепозиторий или npm-пакеты. Например, валидацию форм можно вынести в отдельный модуль и импортировать на клиенте и сервере.
// shared/validators.js
export const validateEmail = (email) => /^[^s@]+@[^s@]+.[^s@]+$/.test(email);
GraphQL — другой подход, где сервер описывает схему данных, а клиент запрашивает только нужные поля, уменьшая дублирование логики выборки.
Isomorphic/Universal JavaScript позволяет выполнять один код и на сервере (Node.js), и на клиенте. Например, рендеринг React-компонентов:
// server.js
import App from './App';
const html = ReactDOMServer.renderToString(<App />);
Конфигурация через API — сервер предоставляет клиенту настройки (например, feature flags), избегая хардкода.