コンパイラにある`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(/* ... */);
});
});
コンパイラと同様に、フックの種類によっては、`tapAsync`と`tapPromise`も使用できる場合があります。
`parser`によって公開され、次のようにアクセスできるライフサイクルフックを以下に示します。
SyncBailHook
自由変数の`typeof`からなる式を評価する際にトリガーされます。
parser.hooks.evaluateTypeof
.for('myIdentifier')
.tap('MyPlugin', (expression) => {
/* ... */
return expressionResult;
});
これにより、`evaluateTypeof`フックがトリガーされます。
const a = typeof myIdentifier;
これはトリガーされません。
const myIdentifier = 0;
const b = typeof myIdentifier;
SyncBailHook
式を評価する際に呼び出されます。
例えば
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
自由変数である識別子を評価する際に呼び出されます。
SyncBailHook
定義済みの変数である識別子を評価する際に呼び出されます。
SyncBailHook
正常に評価された式のメンバ関数の呼び出しを評価する際に呼び出されます。
この式により、フックがトリガーされます。
index.js
const a = expression.myFunc();
MyPlugin.js
parser.hooks.evaluateCallExpressionMember
.for('myFunc')
.tap('MyPlugin', (expression, param) => {
/* ... */
return expressionResult;
});
SyncBailHook
コードフラグメントで解析されたすべてのステートメントに対して呼び出される汎用フックです。
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'
SyncBailHook
if文の解析時に呼び出されます。`statement`フックと同じですが、`statement.type == 'IfStatement'`の場合にのみトリガーされます。
SyncBailHook
ラベル付きのステートメントを解析する際に呼び出されます。これらのステートメントは`statement.type === 'LabeledStatement'`です。
SyncBailHook
コードフラグメントのすべてのimportステートメントに対して呼び出されます。`source`パラメータには、インポートされたファイルの名前が含まれています。
次のimportステートメントは、フックを1回トリガーします。
index.js
import _ from 'lodash';
MyPlugin.js
parser.hooks.import.tap('MyPlugin', (statement, source) => {
// source == 'lodash'
});
SyncBailHook
すべての`import`ステートメントのすべての指定子に対して呼び出されます。
次のimportステートメントは、フックを2回トリガーします。
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`ステートメントに対して呼び出されます。
SyncBailHook
すべての`export`-importステートメント(例:`export * from 'otherModule';`)に対して呼び出されます。
SyncBailHook
宣言をエクスポートするすべての`export`ステートメントに対して呼び出されます。
これらのエクスポートは、このフックをトリガーします。
export const myVar = 'hello'; // also var, let
export function FunctionName() {}
export class ClassName {}
SyncBailHook
式をエクスポートするすべての`export`ステートメント(例:`export default expression;`)に対して呼び出されます。
SyncBailHook
すべての`export`ステートメントのすべての指定子に対して呼び出されます。
SyncBailHook
すべての`export`-importステートメントのすべての指定子に対して呼び出されます。
SyncBailHook
変数宣言を解析する際に呼び出されます。
SyncBailHook
`let`を使用して定義された変数宣言を解析する際に呼び出されます。
SyncBailHook
`const`を使用して定義された変数宣言を解析する際に呼び出されます。
SyncBailHook
`var`を使用して定義された変数宣言を解析する際に呼び出されます。
SyncBailHook
識別子の名前変更を許可するかどうかを決定するために、名前変更の前にトリガーされます。これは通常、`rename`フックと共に使用されます。
var a = b;
parser.hooks.canRename.for('b').tap('MyPlugin', (expression) => {
// returning true allows renaming
return true;
});
SyncBailHook
`canRename`が`true`を返す場合にのみ呼び出される新しい識別子を取得する際にトリガーされます。
var a = b;
parser.hooks.rename.for('b').tap('MyPlugin', (expression) => {});
SyncBailHook
割り当てられた式を解析する前に、`AssignmentExpression`を解析する際に呼び出されます。
a += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// this is called before parsing b
});
SyncBailHook
割り当て式を解析する前に、`AssignmentExpression`を解析する際に呼び出されます。
a += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// this is called before parsing a
});
SyncBailHook
識別子の`typeof`を解析する際にトリガーされます。
SyncBailHook
関数呼び出しを解析する際に呼び出されます。
eval(/* something */);
parser.hooks.call.for('eval').tap('MyPlugin', (expression) => {});
SyncBailHook
オブジェクトのメンバ関数の呼び出しを解析する際にトリガーされます。
myObj.anyFunc();
parser.hooks.callMemberChain
.for('myObj')
.tap('MyPlugin', (expression, properties) => {});
SyncBailHook
`new`式を解析する際に呼び出されます。
new MyClass();
parser.hooks.new.for('MyClass').tap('MyPlugin', (expression) => {});
SyncBailHook
式を解析する際に呼び出されます。
const a = this;
parser.hooks.expression.for('this').tap('MyPlugin', (expression) => {});
SyncBailHook
`ConditionalExpression` (例:`condition ? a : b`)を解析する際に呼び出されます。
SyncBailHook
コードフラグメントの抽象構文木(AST)にアクセスします。