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