Codemod — это скрипт автоматического преобразования кода, используемый для массового обновления синтаксиса, API или структуры проекта. В экосистеме MUI (Material-UI) codemod широко применяется при переходе между версиями библиотеки, особенно при крупных обновлениях, например с v4 на v5, где изменились названия компонентов, пропсов и способы стилизации.
Codemod работает на базе jscodeshift — инструмента для манипуляции AST (Abstract Syntax Tree) JavaScript-кода. Основная задача codemod — преобразовать старый код в новый, минимизируя ручную работу и ошибки при масштабных проектах.
Для запуска codemod скриптов необходим Node.js и пакет jscodeshift. Установка выполняется через npm:
npm install -g jscodeshift
Проверка версии:
jscodeshift --version
Codemod скрипты для MUI обычно поставляются в виде отдельных файлов
.js и содержат инструкции для преобразования конкретных
компонентов или API.
Codemod скрипт состоит из нескольких ключевых элементов:
const j = require('jscodeshift');
file, api и
options:module.exports = function(file, api, options) {
const j = api.jscodeshift;
const root = j(file.source);
// Здесь выполняются преобразования
return root.toSource();
};
root.find() используется для поиска элементов:root.find(j.ImportDeclaration, { source: { value: '@mui/core' } })
.forEach(path => {
path.node.source.value = '@mui/material';
});
// до
import { Button } from '@material-ui/core';
// после
import { Button } from '@mui/material';
variant="raised" у Button заменяется
на variant="contained":root.find(j.JSXAttribute, { name: { name: 'variant' } })
.filter(path => path.value.value.value === 'raised')
.forEach(path => {
path.value.value.value = 'contained';
});
makeStyles в
sx:root.find(j.CallExpression, { callee: { name: 'makeStyles' } })
.forEach(path => {
// Логика преобразования в sx объект
});
GridList, заменяются на новые аналоги
ImageList:root.find(j.ImportSpecifier, { imported: { name: 'GridList' } })
.forEach(path => {
path.node.imported.name = 'ImageList';
});
--dry или
--dry-run для предварительного просмотра изменений
без их применения:jscodeshift -t path/to/codemod.js src --dry
jscodeshift -t codemod.js src/components
Для сложных преобразований полезно использовать логирование:
console.log('Преобразован файл:', file.path);
Также можно проверять AST узлы через
console.dir(node, { depth: null }), чтобы понимать
структуру и корректно модифицировать элементы.
Typography с устаревшим
пропом type:root.find(j.JSXElement, { openingElement: { name: { name: 'Typography' } } })
.find(j.JSXAttribute, { name: { name: 'type' } })
.forEach(path => {
path.value.name.name = 'variant';
});
createMuiTheme в
createTheme:root.find(j.ImportSpecifier, { imported: { name: 'createMuiTheme' } })
.forEach(path => {
path.node.imported.name = 'createTheme';
});
withStyles на
использование styled или sx:root.find(j.CallExpression, { callee: { name: 'withStyles' } })
.forEach(path => {
// Логика конвертации в styled компонент
});
Codemod скрипты можно интегрировать в пайплайн CI/CD для автоматической проверки совместимости кода при обновлении зависимостей MUI. Например, на этапе сборки можно запускать:
jscodeshift -t codemods/mui5-imports.js src --dry
Ошибки или неподдерживаемые конструкции могут быть зафиксированы как предупреждения, что облегчает миграцию крупных проектов.
sx.Этот подход обеспечивает системный и безопасный переход между версиями MUI, позволяя сократить ручные исправления и ускорить обновление больших проектов.