Webpack:JavascriptParser Hooks

2023-05-11 11:04 更新

?parser? 實例,在 ?compiler? 中被發(fā)現,是用來解析由 webpack 處理過的每個模塊。?parser? 也是擴展自 ?tapable? 的 webpack 類 并且提供多種 ?tapable? 鉤子,

以下示例中,?parser? 位于 NormalModuleFactory 中,因此需要調用額外鉤子 來進行獲?。?/p>

compiler.hooks.normalModuleFactory.tap('MyPlugin', (factory) => {
  factory.hooks.parser
    .for('javascript/auto')
    .tap('MyPlugin', (parser, options) => {
      parser.hooks.someHook.tap(/* ... */);
    });
});

和 ?compiler? 用法相同,取決于不同的鉤子類型, 也可以在某些鉤子上訪問 ?tapAsync? 和 ?tapPromise?。

鉤子

以下生命周期鉤子函數,是由 ?parser? 暴露,可以通過如下方式訪問:

evaluateTypeof

SyncBailHook

當對自由變量使用 ?typeof? 表達式進行求值時觸發(fā)

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
parser.hooks.evaluateTypeof
  .for('myIdentifier')
  .tap('MyPlugin', (expression) => {
    /* ... */
    return expressionResult;
  });

這會觸發(fā) ?evaluateTypeof? 鉤子的調用:

const a = typeof myIdentifier;

這不會觸發(fā):

const myIdentifier = 0;
const b = typeof myIdentifier;

evaluate

SyncBailHook

在求值表達式時調用

  • Hook parameters: ?expressionType?
  • Callback parameters: ?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

當評估一個自由變量的標識符時調用

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?

evaluateDefinedIdentifier

SyncBailHook

當評估一個已定義變量的標識符時調用

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?

evaluateCallExpressionMember

SyncBailHook

當對已成功求值的表達式調用成員函數時調

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression? ?param?

將會觸發(fā)鉤子的表達式:

index.js

const a = expression.myFunc();

MyPlugin.js

parser.hooks.evaluateCallExpressionMember
  .for('myFunc')
  .tap('MyPlugin', (expression, param) => {
    /* ... */
    return expressionResult;
  });

statement

SyncBailHook

用于在代碼片段中解析每個語句時調用的通用的鉤子

  • Callback Parameters: ?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'? 時觸發(fā)

  • Callback Parameters: ?statement?

label

SyncBailHook

當解析帶標簽的語句時調用此鉤子。這些語句的類型為 ??statement.type === 'LabeledStatement'??

  • Hook Parameters: ?labelName?
  • Callback Parameters: ?statement?

import

SyncBailHook

在代碼片段中每個導入語句都會調用此鉤子。?source? 參數包含所導入文件的名稱

  • Callback Parameters: ?statement? ?source?

The following import statement will trigger the hook once:

index.js

import _ from 'lodash';

MyPlugin.js

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

importSpecifier

SyncBailHook

對于每個?import?語句中的每個指定符,都會調用此鉤子函數

  • Callback Parameters: ?statement? ?source? ?exportName? ?identifierName?

以下 import 語句將會觸發(fā)兩次鉤子:

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 語句被解析時觸發(fā)

  • Callback Parameters: ?statement?

exportImport

SyncBailHook

在代碼片段中的每個導出導入語句(例如:export * from 'otherModule';)都會調用該鉤子

  • Callback Parameters: ?statement? ?source?

exportDeclaration

SyncBailHook

每個導出聲明的導出語句都會調用此鉤子

  • Callback Parameters: ?statement? ?declaration?

這些導出語句會觸發(fā)該鉤子函數:

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

exportExpression

SyncBailHook

被用于解析并評估代碼中的導出表達式,例如 export default expression;,在導出表達式時觸發(fā)此鉤子

  • Callback Parameters: ?statement? ?declaration?

exportSpecifier

SyncBailHook

該鉤子會為每個導出語句的每個成員說明符調用

  • Callback Parameters: ?statement? ?identifierName? ?exportName? ?index?

exportImportSpecifier

SyncBailHook

該鉤子將在每個導出-導入語句的每個成員說明符上觸發(fā)

  • Callback Parameters: ?statement? ?source? ?identifierName? ?exportName? ?index?

varDeclaration

SyncBailHook

解析變量聲明時觸發(fā)

  • Callback Parameters: ?declaration?

varDeclarationLet

SyncBailHook

在解析使用 ?let? 定義的變量聲明時調用

  • Callback Parameters: ?declaration?

varDeclarationConst

SyncBailHook

解析使用 const 定義的變量聲明時被調用

  • Callback Parameters: ?declaration?

varDeclarationVar

SyncBailHook

當解析使用 var 定義的變量聲明時調用

  • Callback Parameters: ?declaration?

canRename

SyncBailHook

當解析使用 var 定義的變量聲明時調用

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
var a = b;

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

rename

SyncBailHook

在重命名標識符之前觸發(fā)以確定是否允許重命名。通常與重命名鉤子一起使用

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
var a = b;

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

assigned

SyncBailHook

會在解析 ?AssignmentExpression? 時,在解析被賦值的表達式之前觸發(fā)

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
a += b;

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

assign

SyncBailHook

會在解析 ?AssignmentExpression? 時,在解析賦值的表達式之前觸發(fā)

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
a += b;

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

typeof

SyncBailHook

當解析標識符的? typeof? 操作符時觸發(fā)

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?

call

SyncBailHook

在解析函數調用時被調用

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
eval(/* something */);

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

callMemberChain

SyncBailHook

當解析對象的成員函數的調用時觸發(fā)

  • Hook Parameters: ?objectIdentifier?
  • Callback Parameters: ?expression?? properties?
myObj.anyFunc();

parser.hooks.callMemberChain
  .for('myObj')
  .tap('MyPlugin', (expression, properties) => {});

new

SyncBailHook

該鉤子在解析 ?new? 表達式時被調用

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
new MyClass();

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

expression

SyncBailHook

該鉤子會在解析表達式時被觸發(fā)

  • Hook Parameters: ?identifier?
  • Callback Parameters: ?expression?
const a = this;

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

expressionConditionalOperator

SyncBailHook

在解析條件表達式(例如 condition ? a : b)時調用

  • Callback Parameters: ?expression?

program

SyncBailHook

獲取代碼片段的抽象語法樹(AST)的訪問權限

  • Parameters: ?ast? ?comments?


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號