Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Let’s try to hack AST of JavaScript
Search
sota ohara
July 06, 2019
1.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Let’s try to hack AST of JavaScript
sota ohara
July 06, 2019
More Decks by sota ohara
See All by sota ohara
Re-Architecture of ReactNative
sottar
0
310
Implement prerendering w/ puppeteer
sottar
1
340
create own CMS from scratch
sottar
2
9.2k
フロントエンドエンジニアが伝えたい最近の事情
sottar
27
18k
複数人で高速に開発するためのnpmモジュール
sottar
5
2.7k
new version of context in React 16.3
sottar
3
1.9k
2ヶ月半でサービスをリリースした話し
sottar
2
2.3k
Redux のディレクトリ構成を考える
sottar
2
15k
モダンなJavaScriptアプリケーションでモダンにスタイリングする方法
sottar
9
5.1k
Featured
See All Featured
Game over? The fight for quality and originality in the time of robots
wayneb77
1
260
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Agile that works and the tools we love
rasmusluckow
331
22k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
Google's AI Overviews - The New Search
badams
0
1.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
590
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
Transcript
1 Let’s try to hack AST of JavaScript Sota Ohara
2019.7.4 Battle Conference U30
2 Tech Lead @ Mercari inc. Twitter: @sottar_ GitHub: @sottar
Sota Ohara
3 - Introduce the AST - Create babel plugin Index
4 What’s an AST
5 Abstract Syntax Tree (抽象構文木)
6 What’s an AST An AST is the result of
parsing source code. A tree data structure which extracted necessary information from the source code DOM Tree is one of them Used for analysis and processing the source code It’s using by the compiler and interpreter
7 It seems difficult...
8 JavaScript AST
9 JavaScript AST is not difficult We can use AST
easily in JavaScript What’s a JavaScript AST?
10 Just a JavaScript Object which displays an architecture of
code What’s a JavaScript AST?
11 ESTree de facto standard Parser Acorn Esprima Babylon: used
by Babel, Acorn based Espree: used by ESLint, Acorn based What’s a JavaScript AST?
12 AST Flow Source Code AST New AST New Source
Code parser traverser generator
13 Useful Tool AST Explorer
14 Let’s create a babel plugin
15 Create a babel plugin transform function take care the
parser, traverser and generator. $ npm i -S @babel/core const { transform } = require("babel-core"); index.js
16 Replace var with const
17 Create a babel plugin index.js const { transform }
= require("babel-core"); const src = "var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo'
18 That’s all
19 const { transform } = require("babel-core"); const src =
"var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Create babel plugin index.js Original source code Generated source code
20 const { transform } = require("babel-core"); const src =
"var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Create babel plugin index.js Call transform function with src and defined plugin
21 const { transform } = require("babel-core"); const src =
"var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Create babel plugin index.js Kind of visitor pattern
22 Create babel plugin index.js const { transform } =
require("babel-core"); const src = "var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Kind of visitor pattern This function will be fired when this label is found in the AST
23 Understand, but how to write it?
24 Useful Tools AST Explorer
25 Create babel plugin
26 Create babel plugin var foo = 'foooooo'
27 Create babel plugin var foo = 'foooooo'
28 Create babel plugin index.js const { transform } =
require("babel-core"); const src = "var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo'
29 If you have any question or feedback, please get
in touch with twitter (@sottar_) Thank you~
30 AST Explorer https://astexplorer.net/ Acorn https://github.com/acornjs/acorn Esprima https://github.com/jquery/esprima Babylon https://github.com/babel/babel/tree/master/packages/babel-parser
Espree https://github.com/eslint/espree Appendix