Ответ
Да, я использую кодогенерацию для автоматизации рутинных задач и обеспечения консистентности кода. В моих Node.js проектах это особенно полезно для:
- Генерации типизированных клиентов API из спецификаций OpenAPI/Swagger с помощью инструментов вроде
openapi-typescript-codegen. - Создания TypeScript-типов для GraphQL с использованием
graphql-code-generatorна основе схемы. - Генерации кода для работы с БД, например, Prisma Client от Prisma ORM, который создает полностью типизированный запросник на основе схемы данных.
Я также настраиваю собственные генераторы для шаблонных структур проекта, например, для создания новых модулей с контроллерами, сервисами и тестами. Для этого удобно использовать plop.js:
// plopfile.js
export default function (plop) {
plop.setGenerator('service', {
description: 'Generate a new service module',
prompts: [
{
type: 'input',
name: 'name',
message: 'Service name (e.g., user, payment):'
}
],
actions: [
{
type: 'add',
path: 'src/services/{{kebabCase name}}.service.ts',
templateFile: 'plop-templates/service.hbs'
},
{
type: 'add',
path: 'src/services/__tests__/{{kebabCase name}}.service.test.ts',
templateFile: 'plop-templates/service.test.hbs'
}
]
});
}
Ключевой принцип — применять кодогенерацию там, где она устраняет повторяющуюся работу и снижает вероятность человеческой ошибки, но при этом не создает "магию", затрудняющую отладку и понимание кодовой базы.
Ответ 18+ 🔞
А, ну про кодогенерацию спросил! Да, конечно, пользуюсь, ёпта, иначе ж с ума сойти можно от этой рутины. Это ж как в том анекдоте: зачем делать руками, если можно заставить железную обезьяну это делать, пока ты кофе пьешь?
Вот смотри, в моих Node.js проектах это просто палочка-выручалочка, ядрёна вошь. Особенно когда нужно:
- Нагенерировать типизированных клиентов для API из этих ваших OpenAPI-спецификаций. Беру
openapi-typescript-codegen, и он мне выдает готовый клиент с типами. Сиди и не парься, не надо вручную каждый эндпоинт оборачивать — волнение ебать, как удобно. - Создать TypeScript-типы для GraphQL. Тут
graphql-code-generatorрулит, пизда рулю. Кинул ему на вход схему, а он тебе на выходе — все интерфейсы, запросы, мутации. Красота, а не работа. - Сгенерировать код для работы с базой. Ну, тут Prisma ORM — король, бля. Написал схему данных, а он тебе Prisma Client выдает — полностью типизированный запросник. Никаких "ой, а тут опечатка в названии поля" — всё проверит компилятор.
Но это, понимаешь, готовые инструменты. А бывает, что проект свой, особенный, и нужны свои шаблонные штуки. Ну, например, чтобы не копипастить каждый раз структуру нового модуля с контроллером, сервисом и тестами. Для этого я plop.js юзаю — хитрая жопа, но удобная. Настраиваешь раз, а потом как попросит — он тебе всё по шаблону нарисует.
Вот, смотри, примерный конфиг, чтобы понятно было:
// plopfile.js
export default function (plop) {
plop.setGenerator('service', {
description: 'Generate a new service module',
prompts: [
{
type: 'input',
name: 'name',
message: 'Service name (e.g., user, payment):'
}
],
actions: [
{
type: 'add',
path: 'src/services/{{kebabCase name}}.service.ts',
templateFile: 'plop-templates/service.hbs'
},
{
type: 'add',
path: 'src/services/__tests__/{{kebabCase name}}.service.test.ts',
templateFile: 'plop-templates/service.test.hbs'
}
]
});
}
Запустил, ввел имя, и всё — два файла на нужных местах лежат, с базовой структурой. Экономия времени — просто овердохуища.
Но главный принцип, чувак, который я для себя вывел: генерация — это чтобы рутину убивать и ошибки человеческие сокращать, а не чтобы наколдовать какую-то нечитаемую магию. Потому что если твой сгенерированный код потом невозможно отладить или понять, как он работает, то это уже не инструмент, а манда с ушами. Доверия к такому коду — ноль ебать. Генератор должен быть помощником, а не чёрным ящиком, из-за которого потом вся команда голову ломает.