JavascriptParserフック

コンパイラにある`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`によって公開され、次のようにアクセスできるライフサイクルフックを以下に示します。

evaluateTypeof

SyncBailHook

自由変数の`typeof`からなる式を評価する際にトリガーされます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression`
parser.hooks.evaluateTypeof
  .for('myIdentifier')
  .tap('MyPlugin', (expression) => {
    /* ... */
    return expressionResult;
  });

これにより、`evaluateTypeof`フックがトリガーされます。

const a = typeof myIdentifier;

これはトリガーされません。

const myIdentifier = 0;
const b = typeof myIdentifier;

evaluate

SyncBailHook

式を評価する際に呼び出されます。

  • フックパラメータ:`expressionType`
  • コールバックパラメータ:`expression`

例えば

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'

evaluateIdentifier

SyncBailHook

自由変数である識別子を評価する際に呼び出されます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression`

evaluateDefinedIdentifier

SyncBailHook

定義済みの変数である識別子を評価する際に呼び出されます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression`

evaluateCallExpressionMember

SyncBailHook

正常に評価された式のメンバ関数の呼び出しを評価する際に呼び出されます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression` `param`

この式により、フックがトリガーされます。

index.js

const a = expression.myFunc();

MyPlugin.js

parser.hooks.evaluateCallExpressionMember
  .for('myFunc')
  .tap('MyPlugin', (expression, param) => {
    /* ... */
    return 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

ラベル付きのステートメントを解析する際に呼び出されます。これらのステートメントは`statement.type === 'LabeledStatement'`です。

  • フックパラメータ:`labelName`
  • コールバックパラメータ:`statement`

import

SyncBailHook

コードフラグメントのすべてのimportステートメントに対して呼び出されます。`source`パラメータには、インポートされたファイルの名前が含まれています。

  • コールバックパラメータ:`statement` `source`

次のimportステートメントは、フックを1回トリガーします。

index.js

import _ from 'lodash';

MyPlugin.js

parser.hooks.import.tap('MyPlugin', (statement, source) => {
  // source == 'lodash'
});

importSpecifier

SyncBailHook

すべての`import`ステートメントのすべての指定子に対して呼び出されます。

  • コールバックパラメータ:`statement` `source` `exportName` `identifierName`

次の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'
  */
  }
);

export

SyncBailHook

コードフラグメントのすべての`export`ステートメントに対して呼び出されます。

  • コールバックパラメータ:`statement`

exportImport

SyncBailHook

すべての`export`-importステートメント(例:`export * from 'otherModule';`)に対して呼び出されます。

  • コールバックパラメータ:`statement` `source`

exportDeclaration

SyncBailHook

宣言をエクスポートするすべての`export`ステートメントに対して呼び出されます。

  • コールバックパラメータ:`statement` `declaration`

これらのエクスポートは、このフックをトリガーします。

export const myVar = 'hello'; // also var, let
export function FunctionName() {}
export class ClassName {}

exportExpression

SyncBailHook

式をエクスポートするすべての`export`ステートメント(例:`export default expression;`)に対して呼び出されます。

  • コールバックパラメータ:`statement` `declaration`

exportSpecifier

SyncBailHook

すべての`export`ステートメントのすべての指定子に対して呼び出されます。

  • コールバックパラメータ:`statement` `identifierName` `exportName` `index`

exportImportSpecifier

SyncBailHook

すべての`export`-importステートメントのすべての指定子に対して呼び出されます。

  • コールバックパラメータ:`statement` `source` `identifierName` `exportName` `index`

varDeclaration

SyncBailHook

変数宣言を解析する際に呼び出されます。

  • コールバックパラメータ:`declaration`

varDeclarationLet

SyncBailHook

`let`を使用して定義された変数宣言を解析する際に呼び出されます。

  • コールバックパラメータ:`declaration`

varDeclarationConst

SyncBailHook

`const`を使用して定義された変数宣言を解析する際に呼び出されます。

  • コールバックパラメータ:`declaration`

varDeclarationVar

SyncBailHook

`var`を使用して定義された変数宣言を解析する際に呼び出されます。

  • コールバックパラメータ:`declaration`

canRename

SyncBailHook

識別子の名前変更を許可するかどうかを決定するために、名前変更の前にトリガーされます。これは通常、`rename`フックと共に使用されます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression`
var a = b;

parser.hooks.canRename.for('b').tap('MyPlugin', (expression) => {
  // returning true allows renaming
  return true;
});

rename

SyncBailHook

`canRename`が`true`を返す場合にのみ呼び出される新しい識別子を取得する際にトリガーされます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression`
var a = b;

parser.hooks.rename.for('b').tap('MyPlugin', (expression) => {});

assigned

SyncBailHook

割り当てられた式を解析する前に、`AssignmentExpression`を解析する際に呼び出されます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression`
a += b;

parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
  // this is called before parsing b
});

assign

SyncBailHook

割り当て式を解析する前に、`AssignmentExpression`を解析する際に呼び出されます。

  • フックパラメータ:`identifier`
  • コールバックパラメータ:`expression`
a += b;

parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
  // this is called before parsing 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)にアクセスします。

  • パラメータ:`ast` `comments`

6 貢献者

byzykDeTeammisterdevEugeneHlushkochenxsansnitin315