PÔhjalik juhend Babeli pistikprogrammide arendamiseks JavaScripti koodi transformeerimiseks, hÔlmates AST-manipuleerimist, pistikprogrammi arhitektuuri ja praktilisi nÀiteid globaalsetele arendajatele.
JavaScripti koodi transformatsioon: Babeli pistikprogrammi arendusjuhend
JavaScript kui keel areneb pidevalt. Uusi funktsioone pakutakse vÀlja, standardiseeritakse ja lÔpuks rakendatakse brauserites ja Node.js-is. Kuid nende funktsioonide toetamine vanemates keskkondades vÔi kohandatud koodi transformatsioonide rakendamine nÔuab tööriistu, mis suudavad JavaScripti koodi manipuleerida. Siin Babel sÀrab ja teadmine, kuidas kirjutada oma Babeli pistikprogramme, avab maailma vÔimalusi.
Mis on Babel?
Babel on JavaScripti kompilaator, mis vĂ”imaldab arendajatel kasutada jĂ€rgmise pĂ”lvkonna JavaScripti sĂŒntaksit ja funktsioone juba tĂ€na. See transformeerib kaasaegse JavaScripti koodi tagasiĂŒhilduvaks versiooniks, mis töötab vanemates brauserites ja keskkondades. PĂ”himĂ”tteliselt parserdab Babel JavaScripti koodi abstraktseks sĂŒntaksipuuks (AST), manipuleerib AST-d vastavalt konfigureeritud transformatsioonidele ja genereerib seejĂ€rel transformeeritud JavaScripti koodi.
Miks kirjutada Babeli pistikprogramme?
Kuigi Babeliga on kaasas hulk eelmÀÀratletud transformatsioone, on stsenaariume, kus on vaja kohandatud transformatsioone. Siin on mÔned pÔhjused, miks vÔiksite kirjutada oma Babeli pistikprogrammi:
- Kohandatud sĂŒntaks: rakendage oma projektile vĂ”i domeenile spetsiifiliste kohandatud sĂŒntaksi laienduste tuge.
- Koodi optimeerimine: automatiseerige koodi optimeerimisi, mis ĂŒletavad Babeli sisseehitatud vĂ”imalusi.
- Lintimine ja koodistiili jÔustamine: jÔustage spetsiifilisi koodistiili reegleid vÔi tuvastage potentsiaalseid probleeme kompileerimisprotsessi kÀigus.
- Rahvusvahelistamine (i18n) ja lokaliseerimine (l10n): automatiseerige tÔlgitavate stringide vÀljavÔtmise protsessi oma koodibaasist. NÀiteks vÔiksite luua pistikprogrammi, mis asendab automaatselt kasutajale suunatud teksti vÔtmetega, mida kasutatakse tÔlgete otsimiseks vastavalt kasutaja lokaadile.
- Raamistikuspetsiifilised transformatsioonid: rakendage transformatsioone, mis on kohandatud konkreetsele raamistikule, nagu React, Vue.js vÔi Angular.
- Turvalisus: rakendage kohandatud turvakontrolle vÔi hÀgustamistehnikaid.
- Koodi genereerimine: genereerige koodi vastavalt konkreetsetele mustritele vÔi konfiguratsioonidele.
Abstraktse sĂŒntaksipuu (AST) mĂ”istmine
AST on teie JavaScripti koodi struktuuri puulaadne esitus. Iga sĂ”lm puus esindab koodi konstruktsiooni, nagu muutuja deklaratsioon, funktsioonikutse vĂ”i avaldis. AST-i mĂ”istmine on Babeli pistikprogrammide kirjutamiseks ĂŒlioluline, kuna te liigute lĂ€bi selle puu ja manipuleerite sellega koodi transformatsioonide tegemiseks.
Tööriistad nagu AST Explorer on hindamatud antud koodilÔigu AST-i visualiseerimiseks. Saate kasutada AST Explorerit, et katsetada erinevate koodi transformatsioonidega ja nÀha, kuidas need AST-d mÔjutavad.
Siin on lihtne nÀide selle kohta, kuidas JavaScripti koodi esitatakse AST-na:
JavaScripti kood:
const x = 1 + 2;
Lihtsustatud AST esitus:
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "BinaryExpression",
"operator": "+",
"left": {
"type": "NumericLiteral",
"value": 1
},
"right": {
"type": "NumericLiteral",
"value": 2
}
}
}
],
"kind": "const"
}
Nagu nĂ€ete, jagab AST koodi selle koostisosadeks, muutes selle analĂŒĂŒsimise ja manipuleerimise lihtsamaks.
Babeli pistikprogrammi arenduskeskkonna seadistamine
Enne pistikprogrammi kirjutamise alustamist peate seadistama oma arenduskeskkonna. Siin on pÔhiline seadistus:
- Node.js ja npm (vÔi yarn): veenduge, et teil on installitud Node.js ja npm (vÔi yarn).
- Looge projekti kataloog: looge oma pistikprogrammi jaoks uus kataloog.
- Initsialiseerige npm: kÀivitage oma projekti kataloogis
npm init -y
, et luua failpackage.json
. - Installige sÔltuvused: installige vajalikud Babeli sÔltuvused:
npm install @babel/core @babel/types @babel/template
@babel/core
: Babeli pÔhiteek.@babel/types
: utiliiditeek AST sÔlmede loomiseks ja kontrollimiseks.@babel/template
: utiliiditeek AST sÔlmede genereerimiseks mallstringidest.
Babeli pistikprogrammi anatoomia
Babeli pistikprogramm on sisuliselt JavaScripti funktsioon, mis tagastab objekti, millel on atribuut visitor
. Atribuut visitor
on objekt, mis mÀÀratleb funktsioonid, mida kĂ€ivitatakse, kui Babel kohtub AST lĂ€bimise ajal konkreetsete AST sĂ”lmetĂŒĂŒpidega.
Siin on Babeli pistikprogrammi pÔhiline struktuur:
module.exports = function(babel) {
const { types: t } = babel;
return {
name: "my-custom-plugin",
visitor: {
Identifier(path) {
// Kood Identifier sÔlmede transformeerimiseks
}
}
};
};
Jaotame peamised komponendid:
module.exports
: pistikprogramm eksporditakse moodulina, mis vÔimaldab Babelil seda laadida.babel
: objekt, mis sisaldab Babeli API-d, sealhulgas objektitypes
(aliasegat
), mis pakub utiliite AST sÔlmede loomiseks ja kontrollimiseks.name
: string, mis tuvastab teie pistikprogrammi. Kuigi see pole rangelt vajalik, on hea tava lisada kirjeldav nimi.visitor
: objekt, mis kaardistab AST sĂ”lmetĂŒĂŒbid funktsioonidele, mida kĂ€ivitatakse, kui neid sĂ”lmetĂŒĂŒpe AST lĂ€bimise ajal kohatakse.Identifier(path)
: kĂŒlastusfunktsioon, mida kutsutakse iga AST-i sĂ”lmeIdentifier
jaoks. Objektpath
pakub juurdepÀÀsu sĂ”lmele ja selle ĂŒmbritsevale kontekstile AST-s.
Objektiga path
töötamine
Objekt path
on AST-i manipuleerimise vÔti. See pakub meetodeid AST sÔlmedele juurdepÀÀsuks, nende muutmiseks ja asendamiseks. Siin on mÔned kÔige sagedamini kasutatavad path
meetodid:
path.node
: AST sÔlm ise.path.parent
: praeguse sÔlme vanemsÔlm.path.parentPath
: vanemsÔlme objektpath
.path.scope
: praeguse sÔlme skoobi objekt. See on kasulik muutuja viidete lahendamiseks.path.replaceWith(newNode)
: asendab praeguse sÔlme uue sÔlmega.path.replaceWithMultiple(newNodes)
: asendab praeguse sÔlme mitme uue sÔlmega.path.insertBefore(newNode)
: sisestab uue sÔlme enne praegust sÔlme.path.insertAfter(newNode)
: sisestab uue sÔlme pÀrast praegust sÔlme.path.remove()
: eemaldab praeguse sÔlme.path.skip()
: jÀtab praeguse sÔlme laste lÀbimise vahele.path.traverse(visitor)
: lĂ€bib praeguse sĂ”lme lapsi uue kĂŒlastaja abil.path.findParent(callback)
: leiab esimese vanemsÔlme, mis vastab antud tagasihelistamisfunktsioonile.
AST sÔlmede loomine ja kontrollimine abil @babel/types
Teek @babel/types
pakub funktsioonide komplekti AST sĂ”lmede loomiseks ja kontrollimiseks. Need funktsioonid on hĂ€davajalikud AST-i manipuleerimiseks tĂŒĂŒbikindlal viisil.
Siin on mÔned nÀited @babel/types
kasutamisest:
const { types: t } = babel;
// Loo Identifier sÔlm
const identifier = t.identifier("myVariable");
// Loo NumericLiteral sÔlm
const numericLiteral = t.numericLiteral(42);
// Loo BinaryExpression sÔlm
const binaryExpression = t.binaryExpression("+", t.identifier("x"), t.numericLiteral(1));
// Kontrolli, kas sÔlm on Identifier
if (t.isIdentifier(identifier)) {
console.log("SÔlm on Identifier");
}
@babel/types
pakub laia valikut funktsioone erinevat tĂŒĂŒpi AST sĂ”lmede loomiseks ja kontrollimiseks. TĂ€ieliku loendi leiate Babel Types dokumentatsioonist.
AST sÔlmede genereerimine mallstringidest abil @babel/template
Teek @babel/template
vÔimaldab teil genereerida AST sÔlmi mallstringidest, muutes keerukate AST struktuuride loomise lihtsamaks. See on eriti kasulik, kui peate genereerima koodilÔike, mis hÔlmavad mitut AST sÔlme.
Siin on nÀide @babel/template
kasutamisest:
const { template } = babel;
const buildRequire = template(`
var IMPORT_NAME = require(SOURCE);
`);
const requireStatement = buildRequire({
IMPORT_NAME: t.identifier("myModule"),
SOURCE: t.stringLiteral("my-module")
});
// requireStatement sisaldab nĂŒĂŒd AST-d: var myModule = require("my-module");
Funktsioon template
parserdab mallstringi ja tagastab funktsiooni, mida saab kasutada AST sÔlmede genereerimiseks, asendades kohatÀited pakutavate vÀÀrtustega.
NĂ€idis pistikprogramm: Identifierite asendamine
Loome lihtsa Babeli pistikprogrammi, mis asendab kÔik identifieri x
esinemised identifieriga y
.
module.exports = function(babel) {
const { types: t } = babel;
return {
name: "replace-identifier",
visitor: {
Identifier(path) {
if (path.node.name === "x") {
path.node.name = "y";
}
}
}
};
};
See pistikprogramm itereerib lÀbi kÔigi AST-i sÔlmede Identifier
. Kui identifieri atribuut name
on x
, asendab see selle vÀÀrtusega y
.
NĂ€idis pistikprogramm: Console Log avaldise lisamine
Siin on keerukam nÀide, mis lisab iga funktsiooni keha algusesse console.log
avaldise.
module.exports = function(babel) {
const { types: t } = babel;
return {
name: "add-console-log",
visitor: {
FunctionDeclaration(path) {
const functionName = path.node.id.name;
const consoleLogStatement = t.expressionStatement(
t.callExpression(
t.memberExpression(
t.identifier("console"),
t.identifier("log")
),
[t.stringLiteral(`Function ${functionName} called`)]
)
);
path.get("body").unshiftContainer("body", consoleLogStatement);
}
}
};
};
See pistikprogramm kĂŒlastab sĂ”lme FunctionDeclaration
. Iga funktsiooni jaoks loob see avaldise console.log
, mis logib funktsiooni nime. SeejÀrel sisestab see selle avaldise funktsiooni keha algusesse, kasutades path.get("body").unshiftContainer("body", consoleLogStatement)
.
Babeli pistikprogrammi testimine
On ĂŒlioluline testida oma Babeli pistikprogrammi pĂ”hjalikult, et veenduda, et see töötab ootuspĂ€raselt ja ei tekita ootamatut kĂ€itumist. Siin on, kuidas saate oma pistikprogrammi testida:
- Looge testfail: looge JavaScripti fail koodiga, mida soovite oma pistikprogrammi abil transformeerida.
- Installige
@babel/cli
: installige Babeli kÀsurea liides:npm install @babel/cli
- Konfigureerige Babel: looge oma projekti kataloogis fail
.babelrc
vÔibabel.config.js
, et konfigureerida Babel oma pistikprogrammi kasutama.NĂ€ide
.babelrc
:{ "plugins": ["./my-plugin.js"] }
- KÀivitage Babel: kÀivitage Babel kÀsurealt, et transformeerida oma testfail:
npx babel test.js -o output.js
- Kontrollige vÀljundit: kontrollige faili
output.js
, et veenduda, kas kood on Ôigesti transformeeritud.
babel-jest
vÔi @babel/register
.
Babeli pistikprogrammi avaldamine
Kui soovite oma Babeli pistikprogrammi maailmaga jagada, saate selle avaldada npm-is. Siin on, kuidas:
- Looge npm konto: kui teil pole veel kontot, looge konto npm-is.
- VĂ€rskendage
package.json
: vÀrskendage oma failipackage.json
vajaliku teabega, nagu paketi nimi, versioon, kirjeldus ja mÀrksÔnad. - Logige sisse npm-i: kÀivitage oma terminalis
npm login
ja sisestage oma npm-i mandaadid. - Avalda oma pistikprogramm: kÀivitage oma projekti kataloogis
npm publish
, et avaldada oma pistikprogramm npm-is.
Enne avaldamist veenduge, et teie pistikprogramm on hÀsti dokumenteeritud ja sisaldab README faili selgete juhistega selle installimise ja kasutamise kohta.
TĂ€iustatud pistikprogrammi arendustehnikad
Kui tunnete end Babeli pistikprogrammi arendusega mugavamalt, saate uurida tÀiustatumaid tehnikaid, nÀiteks:
- Pistikprogrammi valikud: lubage kasutajatel konfigureerida oma pistikprogrammi, kasutades Babeli konfiguratsioonis edastatud valikuid.
- Skoobi analĂŒĂŒs: analĂŒĂŒsige muutujate ulatust, et vĂ€ltida soovimatuid kĂ”rvaltoimeid.
- Koodi genereerimine: genereerige koodi dĂŒnaamiliselt, lĂ€htudes sisendkoodist.
- LÀhtekaardid: genereerige silumiskogemuse parandamiseks lÀhtekaarte.
- JÔudluse optimeerimine: optimeerige oma pistikprogrammi jÔudluse tagamiseks, et minimeerida kompileerimisajale avalduvat mÔju.
Globaalsed kaalutlused pistikprogrammi arendamisel
Babeli pistikprogrammide arendamisel ĂŒlemaailmsele publikule on oluline arvesse vĂ”tta jĂ€rgmist:
- Rahvusvahelistamine (i18n): veenduge, et teie pistikprogramm toetab erinevaid keeli ja tÀhemÀrgistikke. See on eriti oluline pistikprogrammide puhul, mis manipuleerivad stringiliteraalide vÔi kommentaaridega. NÀiteks kui teie pistikprogramm tugineb regulaaravaldistele, veenduge, et need regulaaravaldised saaksid Unicode'i mÀrke Ôigesti kÀsitleda.
- Lokaliseerimine (l10n): kohandage oma pistikprogramm erinevate piirkondlike seadete ja kultuurikonventsioonidega.
- Ajavööndid: olge kuupÀeva ja kellaaja vÀÀrtustega tegelemisel teadlik ajavöönditest. JavaScripti sisseehitatud Date objektiga vÔib erinevates ajavööndites olla keeruline töötada, seega kaaluge usaldusvÀÀrsema ajavööndite kÀsitlemise jaoks teegi Moment.js vÔi date-fns kasutamist.
- Valuutad: kÀsitlege erinevaid valuutasid ja numbrivorme asjakohaselt.
- Andmevormingud: olge teadlik erinevatest andmevormingutest, mida erinevates piirkondades kasutatakse. NÀiteks kuupÀevavormingud on kogu maailmas oluliselt erinevad.
- JuurdepÀÀsetavus: veenduge, et teie pistikprogramm ei tekitaks juurdepÀÀsetavuse probleeme.
- Litsentsimine: valige oma pistikprogrammi jaoks sobiv litsents, mis vÔimaldab teistel seda kasutada ja sellesse panustada. Populaarsed avatud lÀhtekoodiga litsentsid on MIT, Apache 2.0 ja GPL.
NÀiteks, kui arendate pistikprogrammi kuupÀevade vormindamiseks vastavalt lokaadile, peaksite kasutama JavaScripti Intl.DateTimeFormat
API-t, mis on mÔeldud just selleks otstarbeks. Kaaluge jÀrgmist koodilÔiku:
const { types: t } = babel;
module.exports = function(babel) {
return {
name: "format-date",
visitor: {
CallExpression(path) {
if (t.isIdentifier(path.node.callee, { name: 'formatDate' })) {
// Eeldades, et kasutatakse formatDate(date, locale)
const dateNode = path.node.arguments[0];
const localeNode = path.node.arguments[1];
// Genereeri AST:
// new Intl.DateTimeFormat(locale).format(date)
const newExpression = t.newExpression(
t.memberExpression(
t.identifier("Intl"),
t.identifier("DateTimeFormat")
),
[localeNode]
);
const formatCall = t.callExpression(
t.memberExpression(
newExpression,
t.identifier("format")
),
[dateNode]
);
path.replaceWith(formatCall);
}
}
}
};
};
See pistikprogramm asendab vĂ€ljakutsed hĂŒpoteetilisele funktsioonile formatDate(date, locale)
vastava Intl.DateTimeFormat
API vÀljakutsega, tagades lokaadispetsiifilise kuupÀeva vormindamise.
JĂ€reldus
Babeli pistikprogrammide arendamine on vĂ”imas viis laiendada JavaScripti vĂ”imalusi ja automatiseerida koodi transformatsioone. MĂ”istes AST-d, Babeli pistikprogrammi arhitektuuri ja saadaolevaid API-sid, saate luua kohandatud pistikprogramme, et lahendada mitmesuguseid probleeme. Pidage meeles, et peate oma pistikprogramme pĂ”hjalikult testima ja vĂ”tma arvesse globaalseid kaalutlusi, kui arendate mitmekesisele publikule. Harjutamise ja katsetamisega saate saada vilunud Babeli pistikprogrammi arendajaks ja panustada JavaScripti ökosĂŒsteemi arengusse.