JavascriptParser Hooks
compilerì ìë, parser ì¸ì¤í´ì¤ë, webpackìì ì²ë¦¬ ì¤ì¸ ê° ëª¨ëì íì±íë ë° ì¬ì©í©ëë¤.
parserë tapableì íì¥íê³ íë¬ê·¸ì¸ ìì±ìê° íì± íë¡ì¸ì¤ë¥¼ 커ì¤í°ë§ì´ì§ íëë° ì¬ì©í ì ìë ë¤ìí tapable í
ì ì ê³µíë ë ë¤ë¥¸ webpack í´ëì¤ì
ëë¤.
parserë NormalModuleFactoryìì ë³¼ ì ììµëë¤.
compiler.hooks.normalModuleFactory.tap("MyPlugin", (factory) => {
factory.hooks.parser
.for("javascript/auto")
.tap("MyPlugin", (parser, options) => {
// The `parser` provides many hooks, which are explained in detail below.
// Here is a practical example using the `call` hook to detect and warn
// about a deprecated API function when a developer calls it
// (e.g., `myCustomApiFunction()`):
parser.hooks.call
.for("myCustomApiFunction")
.tap("MyPlugin", (expression) => {
console.warn(
`Warning: 'myCustomApiFunction' is deprecated. Found call at line ${expression.loc.start.line}.`,
);
});
});
});compilerì ë§ì°¬ê°ì§ë¡, tapAsync ê·¸ë¦¬ê³ tapPromiseë í
íì
ì ë°ë¼ ì¬ì©í ì ììµëë¤.
Hooks
ë¤ì ë¼ì´íì¬ì´í´ í
ì parserì ìí´ ë
¸ì¶ëë©° ì ê·¼í ì ììµëë¤.
evaluateTypeof
SyncBailHook
ìì ë³ìì typeofë¡ êµ¬ì±ë ííìì íê°í ë í¸ë¦¬ê±° ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
parser.hooks.evaluateTypeof.for("myIdentifier").tap(
"MyPlugin",
(expression) =>
/* ... */
expressionResult,
);ì´ê²ì evaluateTypeof í
ì í¸ë¦¬ê±° í©ëë¤.
const a = typeof myIdentifier;ë¤ìì í¸ë¦¬ê±° ëì§ ììµëë¤.
const myIdentifier = 0;
const b = typeof myIdentifier;evaluate
SyncBailHook
ííìì íê°í ë í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
expressionType - ì½ë°± íë¼ë¯¸í°:
expression
ìì ì ëë¤.
index.js
const a = new MyClass();MyPlugin.js
parser.hooks.evaluate.for("NewExpression").tap(
"MyPlugin",
(expression) =>
/* ... */
expressionResult,
);ííì íì ì ë¤ìê³¼ ê°ìµëë¤.
'ArrowFunctionExpression''AssignmentExpression''AwaitExpression''BinaryExpression''CallExpression''ClassExpression''ConditionalExpression''FunctionExpression''Identifier''LogicalExpression''MemberExpression''NewExpression''ObjectExpression''SequenceExpression''SpreadElement''TaggedTemplateExpression''TemplateLiteral''ThisExpression''UnaryExpression''UpdateExpression'
evaluateIdentifier
SyncBailHook
ìì ë³ìì¸ ìë³ì를 íê°í ë í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
evaluateDefinedIdentifier
SyncBailHook
ì ìë ë³ì ìë³ì를 íê°í ë í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
evaluateCallExpressionMember
SyncBailHook
ì±ê³µì ì¼ë¡ íê°ë ííìì ë©¤ë² í¨ìì ëí í¸ì¶ì íê°í ë í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expressionparam
ì´ ííìì ë¤ìì í ì í¸ë¦¬ê±° í©ëë¤.
index.js
const a = expression.myFunc();MyPlugin.js
parser.hooks.evaluateCallExpressionMember.for("myFunc").tap(
"MyPlugin",
(expression, param) =>
/* ... */
expressionResult,
);statement
SyncBailHook
ì½ë ì¡°ê°ìì íì±ë 모ë 구문ì ëí´ í¸ì¶ëë ë²ì©ì í ì ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statement
parser.hooks.statement.tap("MyPlugin", (statement) => {
/* ... */
});statement.typeì ë¤ìê³¼ ê°ì ì ììµëë¤.
'BlockStatement''VariableDeclaration''FunctionDeclaration''ReturnStatement''ClassDeclaration''ExpressionStatement''ImportDeclaration''ExportAllDeclaration''ExportDefaultDeclaration''ExportNamedDeclaration''IfStatement''SwitchStatement''ForInStatement''ForOfStatement''ForStatement''WhileStatement''DoWhileStatement''ThrowStatement''TryStatement''LabeledStatement''WithStatement'
statementIf
SyncBailHook
if 구문ì íì±í ë í¸ì¶ë©ëë¤. statement í
ê³¼ ëì¼íì§ë§, statement.type == 'IfStatement'ì¸ ê²½ì°ìë§ í¸ë¦¬ê±° ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statement
label
SyncBailHook
labelì´ ìë 구문ì íì±í ë í¸ì¶ë©ëë¤. ì´ë¬í 구문ìë statement.type === 'LabeledStatement'ê° ììµëë¤.
- í
íë¼ë¯¸í°:
labelName - ì½ë°± íë¼ë¯¸í°:
statement
import
SyncBailHook
ì½ë ì¡°ê°ì 모ë import 구문ì ëí´ í¸ì¶ë©ëë¤. source íë¼ë¯¸í°ìë ê°ì ¸ì¨ íì¼ì ì´ë¦ì´ í¬í¨ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statementsource
ë¤ìì import 구문ì í ì í ë² í¸ë¦¬ê±° í©ëë¤.
index.js
import _ from "lodash";MyPlugin.js
parser.hooks.import.tap("MyPlugin", (statement, source) => {
// source == 'lodash'
});importSpecifier
SyncBailHook
모ë import 구문ì 모ë ì§ì ìì ëí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statementsourceexportNameidentifierName
ë¤ìì import 구문ì í ì ë ë² í¸ë¦¬ê±° í©ëë¤.
index.js
import _, { has } from "lodash";MyPlugin.js
parser.hooks.importSpecifier.tap(
"MyPlugin",
(statement, source, exportName, identifierName) => {
/* First call
source == 'lodash'
exportName == 'default'
identifierName == '_'
*/
/* Second call
source == 'lodash'
exportName == 'has'
identifierName == 'has'
*/
},
);export
SyncBailHook
ì½ë ì¡°ê°ì 모ë export 구문ì ëí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statement
exportImport
SyncBailHook
모ë export-import 구문ì ëí´ í¸ì¶ë©ëë¤. ì. export * from 'otherModule';.
- ì½ë°± íë¼ë¯¸í°:
statementsource
exportDeclaration
SyncBailHook
ì ì¸ì ë´ë³´ë´ë 모ë export 구문ì ëí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statementdeclaration
ì´ë¬í ë´ë³´ë´ê¸°ë ë¤ìì í ì í¸ë¦¬ê±° í©ëë¤.
export const myVar = "hello"; // ëí var, let
export function FunctionName() {}
export class ClassName {}exportExpression
SyncBailHook
ííìì ë´ë³´ë´ë 모ë export 구문ì ëí´ í¸ì¶ë©ëë¤. ì. export default expression;.
- ì½ë°± íë¼ë¯¸í°:
statementdeclaration
exportSpecifier
SyncBailHook
모ë export 구문ì 모ë ì§ì ìì ëí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statementidentifierNameexportNameindex
exportImportSpecifier
SyncBailHook
모ë export-import 구문ì 모ë ì§ì ìì ëí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statementsourceidentifierNameexportNameindex
varDeclaration
SyncBailHook
ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
declaration
varDeclarationLet
SyncBailHook
letì ì¬ì©í´ ì ìë ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
declaration
varDeclarationConst
SyncBailHook
const를 ì¬ì©í´ ì ìë ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
declaration
varDeclarationVar
SyncBailHook
var를 ì¬ì©í´ ì ìë ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
declaration
canRename
SyncBailHook
ì´ë¦ ë³ê²½ì´ íì©ëëì§ íì¸í기 ìí´ ìë³ìì ì´ë¦ì ë³ê²½í기 ì ì í¸ë¦¬ê±° ë©ëë¤. ì¼ë°ì ì¼ë¡ rename í
ê³¼ í¨ê» ì¬ì©ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
const a = b;
parser.hooks.canRename.for("b").tap(
"MyPlugin",
(expression) =>
// true를 ë°ííë©´ ì´ë¦ì ë³ê²½í ì ììµëë¤.
true,
);rename
SyncBailHook
ì ìë³ì를 ê°ì ¸ì¤ê¸° ìí´ ì´ë¦ì ë°ê¿ ë í¸ë¦¬ê±° ë©ëë¤. ì´ í
ì canRenameì´ true를 ë°ííë ê²½ì°ì í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
const a = b;
parser.hooks.rename.for("b").tap("MyPlugin", (expression) => {});assign (before parsing assigned expression)
SyncBailHook
í ë¹ë ííìì íì±í기 ì ì AssignmentExpressionì íì±í ê²½ì°ì í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
a += b;
parser.hooks.assign.for("a").tap("MyPlugin", (expression) => {
// ì´ê²ì b를 íì±í기 ì ì í¸ì¶ë©ëë¤.
});assign (before parsing target)
SyncBailHook
í ë¹ ííìì íì±í기 ì ì AssignmentExpressionì íì±í ê²½ì°ì í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
a += b;
parser.hooks.assign.for("a").tap("MyPlugin", (expression) => {
// ì´ê²ì a를 íì±í기 ì ì í¸ì¶ë©ëë¤.
});typeof
SyncBailHook
ìë³ìì typeof를 íì±í ë í¸ë¦¬ê±° ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
call
SyncBailHook
í¨ì í¸ì¶ì íì±í ë í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
eval(/* something */);
parser.hooks.call.for("eval").tap("MyPlugin", (expression) => {});callMemberChain
SyncBailHook
ê°ì²´ì ë©¤ë² í¨ìì ëí í¸ì¶ì íì±í ê²½ì° í¸ë¦¬ê±° ë©ëë¤.
- í
íë¼ë¯¸í°:
objectIdentifier - ì½ë°± íë¼ë¯¸í°:
expression, properties
myObj.anyFunc();
parser.hooks.callMemberChain
.for("myObj")
.tap("MyPlugin", (expression, properties) => {});new
SyncBailHook
new ííìì íì±í ë í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
new MyClass();
parser.hooks.new.for("MyClass").tap("MyPlugin", (expression) => {});expression
SyncBailHook
ííìì íì±í ë í¸ì¶ë©ëë¤.
- í
íë¼ë¯¸í°:
identifier - ì½ë°± íë¼ë¯¸í°:
expression
const a = this;
parser.hooks.expression.for("this").tap("MyPlugin", (expression) => {});expressionConditionalOperator
SyncBailHook
ConditionalExpressionì íì±í ë í¸ì¶ë©ëë¤. ì. condition ? a : b
- ì½ë°± íë¼ë¯¸í°:
expression
program
SyncBailHook
ì½ë ì¡°ê°ì ì¶ì 구문 í¸ë¦¬(AST)ì ì ê·¼í©ëë¤.
- íë¼ë¯¸í°:
astcomments



