Codemod гэж юу вэ?

Zolboobayar Gantumur
2 min readDec 8, 2020

Маш их хэмжээний код дээр засвар оруулах хамгийн үр дүнтэй аргуудын нэг бол codemod юм.

Эх кодийг өөрчилдөг script-ийг codemod гэдэг. Гэхдээ codemod хийхээс өмнө суурь ойлголттой болох хэрэгтэй.

Метапрограмчлал

Програм өөр кодыг өөрийн өгөгдөл гэж үздэг аргачлалыг метапрограмчлал гэнэ. Амархан жишээ гэвэл Array.map байна:

const x = [2, 3, 4];
x.map(x => x ** 2);

Array.map гэдэг функц өөр функцийг хүлээн авч ажилладаг. Ийм функцуудыг Higher order function гэдэг.

AST

Аливаа кодийг compile хийхдээ эхлээд parse хийж, AST (Abstract Syntax Tree) болдог.

2 + 2 гэсэн код AST хэлбэрээр

2 + 2 буюу нэмэх үйлдэл BinaryExpression төрлийн Node болж, баруун болон зүүн талд 2 гэсэн Literal төрлийн дэд Node орно. https://astexplorer.net сайт руу орж код AST болдгийг туршаад үзээрэй.

jscodeshift

Энэ нь Facebook компаниас 2015 онд гаргасан ашиглахад хялбар, Javascript болон Typescript-ийн AST-г parse хийх, өөрчилдөг сан юм. Jscodeshift цаанаа AST өөрчлөхдөө recast, parse хийхдээ Esprima ашиглагддаг.

Ажилладаг зарчим

Хялбар codemod

Код бичиж эхлэхээс өмнө яаж ажилуулах талаар мэдэж авах нь зүйтэй байх. Хамгийн түрүүнд jscodeshift сангаа суулгах хэрэгтэй.

npm i -D jscodeshift

Ажилуулахдаа npx jscodeshift -t <codemod> <файлууд> -d -p гэсэн команд ашиглана. -d гэдэг нь dry , -p гэдэг нь print гэсэн үг юм. Өөрөөр хэлбэл, файлуудаа засахгүйгээр хэвлэнэ, test хийхдээ хэрэглэх чухал команд, учир нь jscodeshift файлуудаа шууд засаж явдаг юм.

Одоо console.log хасдэг codemod бичье.

src/index.js:

let x = 4;
if (x < 5) {
console.log(x);
x += 14;
}
console.log(x);

Codemod-доо зориулжcodemods/remove-console.js файл үүсгэе.

export default (fileInfo, { jscodeshift: j }) => {
return j(fileInfo.source)
.find(j.CallExpression, {
callee: {
type: 'MemberExpression',
object: {
type: 'Identifier',
name: 'console',
},
}
})
.remove()
.toSource();
};

Энэ нь AST-гээс CallExpression төрлийн Node хайж, тэр дотроо callee буду дуудагдаж байгаа зүйл нь MemberExpression төрлийн Node-ийн object -ийн нэр нь console бүх Node -уудаа устагана.

Энийг test хийсний дараа npx jscodeshift -t codemods/remove-console.js src/*.js гэж ажилуулна.

Codemod бол lint хийх, давтагддаг ажлуудаа автоматжуулахдаа хэрэглэхэд маш тохиромжтой зүйл юм. Эцэст нь хэлэхэд: асуух юм байвал comment хэсэгт асуугаарай, өөрийн олсон codemod-ын хэрэглэгээсээ хуваалцаарай гэж уриалмаар байна. Good luck 😉

P.S: Одоогоор миний бичсэн хамгийн том codemod 340 мөр кодтой, 150 мөрийн тесттэй, 3000 гарам мөр production code дээр өөрчлөлт оруулсан script байгаа :))

Codemod ажилуулсан commit-ийн статистик

--

--

Zolboobayar Gantumur

Born in Russia🇷🇺, living in Ulaanbaatar🇲🇳. Student at Kazan Federal University, DevSecOps engineer 👨‍💻