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) => {
parser.hooks.someHook.tap(/* ... */);
});
});compilerì ë§ì°¬ê°ì§ë¡, tapAsync ê·¸ë¦¬ê³ tapPromiseë í
íì
ì ë°ë¼ ì¬ì©í ì ììµëë¤.
ë¤ì ë¼ì´íì¬ì´í´ í
ì parserì ìí´ ë
¸ì¶ëë©° ì ê·¼í ì ììµëë¤.
SyncBailHook
ìì ë³ìì typeofë¡ êµ¬ì±ë ííìì íê°í ë í¸ë¦¬ê±° ë©ëë¤.
identifierexpressionparser.hooks.evaluateTypeof
.for('myIdentifier')
.tap('MyPlugin', (expression) => {
/* ... */
return expressionResult;
});ì´ê²ì evaluateTypeof í
ì í¸ë¦¬ê±° í©ëë¤.
const a = typeof myIdentifier;ë¤ìì í¸ë¦¬ê±° ëì§ ììµëë¤.
const myIdentifier = 0;
const b = typeof myIdentifier;SyncBailHook
ííìì íê°í ë í¸ì¶ë©ëë¤.
expressionTypeexpressionìì ì ëë¤.
index.js
const a = new String();MyPlugin.js
parser.hooks.evaluate.for('NewExpression').tap('MyPlugin', (expression) => {
/* ... */
return expressionResult;
});ííì íì ì ë¤ìê³¼ ê°ìµëë¤.
'ArrowFunctionExpression''AssignmentExpression''AwaitExpression''BinaryExpression''CallExpression''ClassExpression''ConditionalExpression''FunctionExpression''Identifier''LogicalExpression''MemberExpression''NewExpression''ObjectExpression''SequenceExpression''SpreadElement''TaggedTemplateExpression''TemplateLiteral''ThisExpression''UnaryExpression''UpdateExpression'SyncBailHook
ìì ë³ìì¸ ìë³ì를 íê°í ë í¸ì¶ë©ëë¤.
identifierexpressionSyncBailHook
ì ìë ë³ì ìë³ì를 íê°í ë í¸ì¶ë©ëë¤.
identifierexpressionSyncBailHook
ì±ê³µì ì¼ë¡ íê°ë ííìì ë©¤ë² í¨ìì ëí í¸ì¶ì íê°í ë í¸ì¶ë©ëë¤.
identifierexpression paramì´ ííìì ë¤ìì í ì í¸ë¦¬ê±° í©ëë¤.
index.js
const a = expression.myFunc();MyPlugin.js
parser.hooks.evaluateCallExpressionMember
.for('myFunc')
.tap('MyPlugin', (expression, param) => {
/* ... */
return expressionResult;
});SyncBailHook
ì½ë ì¡°ê°ìì íì±ë 모ë 구문ì ëí´ í¸ì¶ëë ë²ì©ì í ì ëë¤.
statementparser.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'SyncBailHook
if 구문ì íì±í ë í¸ì¶ë©ëë¤. statement í
ê³¼ ëì¼íì§ë§, statement.type == 'IfStatement'ì¸ ê²½ì°ìë§ í¸ë¦¬ê±° ë©ëë¤.
statementSyncBailHook
labelì´ ìë 구문ì íì±í ë í¸ì¶ë©ëë¤. ì´ë¬í 구문ìë statement.type === 'LabeledStatement'ê° ììµëë¤.
labelNamestatementSyncBailHook
ì½ë ì¡°ê°ì 모ë import 구문ì ëí´ í¸ì¶ë©ëë¤. source íë¼ë¯¸í°ìë ê°ì ¸ì¨ íì¼ì ì´ë¦ì´ í¬í¨ë©ëë¤.
statement sourceë¤ìì import 구문ì í ì í ë² í¸ë¦¬ê±° í©ëë¤.
index.js
import _ from 'lodash';MyPlugin.js
parser.hooks.import.tap('MyPlugin', (statement, source) => {
// source == 'lodash'
});SyncBailHook
모ë import 구문ì 모ë ì§ì ìì ëí´ í¸ì¶ë©ëë¤.
statement source exportName identifierNameë¤ìì 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'
*/
}
);SyncBailHook
ì½ë ì¡°ê°ì 모ë export 구문ì ëí´ í¸ì¶ë©ëë¤.
statementSyncBailHook
모ë export-import 구문ì ëí´ í¸ì¶ë©ëë¤. ì. export * from 'otherModule';.
statement sourceSyncBailHook
ì ì¸ì ë´ë³´ë´ë 모ë export 구문ì ëí´ í¸ì¶ë©ëë¤.
statement declarationì´ë¬í ë´ë³´ë´ê¸°ë ë¤ìì í ì í¸ë¦¬ê±° í©ëë¤.
export const myVar = 'hello'; // ëí var, let
export function FunctionName() {}
export class ClassName {}SyncBailHook
ííìì ë´ë³´ë´ë 모ë export 구문ì ëí´ í¸ì¶ë©ëë¤. ì. export default expression;.
statement declarationSyncBailHook
모ë export 구문ì 모ë ì§ì ìì ëí´ í¸ì¶ë©ëë¤.
statement identifierName exportName indexSyncBailHook
모ë export-import 구문ì 모ë ì§ì ìì ëí´ í¸ì¶ë©ëë¤.
statement source identifierName exportName indexSyncBailHook
ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
declarationSyncBailHook
letì ì¬ì©í´ ì ìë ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
declarationSyncBailHook
const를 ì¬ì©í´ ì ìë ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
declarationSyncBailHook
var를 ì¬ì©í´ ì ìë ë³ì ì ì¸ë¬¸ì íì±í ë í¸ì¶ë©ëë¤.
declarationSyncBailHook
ì´ë¦ ë³ê²½ì´ íì©ëëì§ íì¸í기 ìí´ ìë³ìì ì´ë¦ì ë³ê²½í기 ì ì í¸ë¦¬ê±° ë©ëë¤. ì¼ë°ì ì¼ë¡ rename í
ê³¼ í¨ê» ì¬ì©ë©ëë¤.
identifierexpressionvar a = b;
parser.hooks.canRename.for('b').tap('MyPlugin', (expression) => {
// true를 ë°ííë©´ ì´ë¦ì ë³ê²½í ì ììµëë¤.
return true;
});SyncBailHook
ì ìë³ì를 ê°ì ¸ì¤ê¸° ìí´ ì´ë¦ì ë°ê¿ ë í¸ë¦¬ê±° ë©ëë¤. ì´ í
ì canRenameì´ true를 ë°ííë ê²½ì°ì í¸ì¶ë©ëë¤.
identifierexpressionvar a = b;
parser.hooks.rename.for('b').tap('MyPlugin', (expression) => {});SyncBailHook
í ë¹ë ííìì íì±í기 ì ì AssignmentExpressionì íì±í ê²½ì°ì í¸ì¶ë©ëë¤.
identifierexpressiona += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// ì´ê²ì b를 íì±í기 ì ì í¸ì¶ë©ëë¤.
});SyncBailHook
í ë¹ ííìì íì±í기 ì ì AssignmentExpressionì íì±í ê²½ì°ì í¸ì¶ë©ëë¤.
identifierexpressiona += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// ì´ê²ì a를 íì±í기 ì ì í¸ì¶ë©ëë¤.
});SyncBailHook
ìë³ìì typeof를 íì±í ë í¸ë¦¬ê±° ë©ëë¤.
identifierexpressionSyncBailHook
í¨ì í¸ì¶ì íì±í ë í¸ì¶ë©ëë¤.
identifierexpressioneval(/* something */);
parser.hooks.call.for('eval').tap('MyPlugin', (expression) => {});SyncBailHook
ê°ì²´ì ë©¤ë² í¨ìì ëí í¸ì¶ì íì±í ê²½ì° í¸ë¦¬ê±° ë©ëë¤.
objectIdentifierexpression, propertiesmyObj.anyFunc();
parser.hooks.callMemberChain
.for('myObj')
.tap('MyPlugin', (expression, properties) => {});SyncBailHook
new ííìì íì±í ë í¸ì¶ë©ëë¤.
identifierexpressionnew MyClass();
parser.hooks.new.for('MyClass').tap('MyPlugin', (expression) => {});SyncBailHook
ííìì íì±í ë í¸ì¶ë©ëë¤.
identifierexpressionconst a = this;
parser.hooks.expression.for('this').tap('MyPlugin', (expression) => {});SyncBailHook
ConditionalExpressionì íì±í ë í¸ì¶ë©ëë¤. ì. condition ? a : b
expressionSyncBailHook
ì½ë ì¡°ê°ì ì¶ì 구문 í¸ë¦¬(AST)ì ì ê·¼í©ëë¤.
ast comments