Codemod гэж юу вэ?
Маш их хэмжээний код дээр засвар оруулах хамгийн үр дүнтэй аргуудын нэг бол 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 буюу нэмэх үйлдэл 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 байгаа :))