Utilia

JavaScript AST Explorer

Поставете JavaScript код и разгледайте абстрактното му синтактично дърво (ESTree, парсер Acorn) във вашия браузър. Експортирайте AST като JSON.

Тип на кода
Възли
–
Максимална дълбочина
–
Оператори на най-горно ниво
–
Синтактично дърво

Щракнете върху възел, за да изберете кода му. Щракнете или преместете курсора в кода, за да намерите възела му.

    Избран възел

    Изберете възел в дървото или щракнете в кода.

    ESTree JSON

    Как да разгледате AST на JavaScript код

    1. Поставете кода си в полето JavaScript код или щракнете Зареди примера, за да започнете с малък модул.
    2. Изберете Тип на кода: Модул (import/export, строг режим) за ES модули или Скрипт (класически) за обикновени скриптове, които може да ползват възможности на нестрогия режим като with.
    3. Дървото се обновява малко след като спрете да пишете. Щракнете Анализирай, за да го изпълните веднага.
    4. В Синтактично дърво щракнете малката стрелка, за да разгънете или свиете възел. Щракнете върху името на възела, за да се избере съответният код в редактора. Панелът Избран възел показва типа му, свойството, към което принадлежи, диапазона от символи, реда и колоната, простите му свойства (име, оператор, суров низ на стойността…) и изходния му текст.
    5. Работи и в обратната посока: щракнете където и да е в кода, преместете курсора с клавиатурата или маркирайте част от кода – най-дълбокият възел, който го съдържа, се разгъва и се оцветява в дървото.
    6. Отворете ESTree JSON, за да видите цялото дърво като JSON – с или без Включи позиции (start, end, loc), след което го Копирай или Изтегли JSON.

    Броячите показват броя на Възли, Максимална дълбочина на дървото и броя на Оператори на най-горно ниво.

    Какво е абстрактно синтактично дърво?

    Преди JavaScript енджинът, линтерът или бандлерът да направят нещо с кода ви, те го разбират като дърво от възли. Всеки възел има type (VariableDeclaration, CallExpression, Identifier…) и дъщерни възли в именувани свойства. За total += size; се получава ExpressionStatement, чийто expression е AssignmentExpression с оператор +=, ляв идентификатор total и десен идентификатор size. Скобите, точките и запетаите и коментарите изчезват: дървото запазва само важната структура, затова се нарича „абстрактно“.

    Този инструмент използва Acorn – малкия и бърз парсер зад много JavaScript инструменти, с ecmaVersion: "latest". Резултатът следва ESTree – общия формат, който произвежда и Espree (ESLint) и който разбират повечето инструменти за трансформация на код. Познаването на точните типове възли е задължително, когато пишете правило за ESLint, codemod за Babel или jscodeshift, плъгин за Prettier или всеки скрипт, който анализира код.

    Позиции, диапазони и експорт в JSON

    Всеки възел има start и end – позициите на първия и на следващия след последния символ в изходния код, както и обект loc с редове (от 1) и колони. В JSON колоните започват от 0, както в изхода на Acorn. Панелът Избран възел ги показва от 1, както повечето редактори. Махнете отметката от Включи позиции (start, end, loc), за да получите по-лек JSON, който се сравнява по-лесно между две версии на кода.

    Някои стойности не могат да се запишат в JSON: литералите на регулярни изрази получават "value": null (свойството regex запазва шаблона и флаговете), а BigInt литералите се записват като низове, както препоръчва спецификацията ESTree.

    Ограничения и поверителност

    Кодът се анализира във вашия браузър и никога не се изпълнява, нито се изпраща някъде: парсерът само чете текста. Входът е ограничен до един милион символа. Много големите дървета се изчертават при поискване, по няколко дъщерни възела наведнъж, а JSON, който е твърде голям за преглед, може пак да се изтегли. JSX и TypeScript не са стандартен JavaScript, затова Acorn ги отчита като синтактични грешки.

    Често задавани въпроси

    Защо получавам „Синтактична грешка на ред 1, колона 1“?

    Кодът не е валиден JavaScript за избрания тип. Съобщението посочва реда, колоната и обяснението на Acorn. Честа причина е import или export при избран Скрипт (класически), както и TypeScript анотации и JSX, които Acorn не разбира.

    Каква е разликата между модул и скрипт?

    Модулите винаги са в строг режим, позволяват import, export и await на най-горно ниво и забраняват with и осмични литерали. Скриптовете са класическият режим на <script>. Изборът се записва и в свойството sourceType на възела Program.

    Изпълнява ли се кодът?

    Не. Анализът само превръща текста в структура от данни. Нищо не се оценява, никоя функция не се извиква и не се прави мрежова заявка, така че е безопасно да разглеждате чужд или дори злонамерен код.

    Показват ли се коментарите в дървото?

    Не. ESTree не прикрепя коментари към възлите, затова те не са част от дървото, но все пак се виждат в изходния текст на възела в панела Избран възел.

    Коя версия на JavaScript се поддържа?

    Acorn е настроен на последната версия на ECMAScript, която познава. Тя включва optional chaining, nullish coalescing, BigInt, полета на класове и частни методи, await на най-горно ниво, флагове на регулярни изрази като v и друг нов синтаксис.