JavascriptParser Hooks
تُستخدم instance المسماة parser، والموجودة داخل compiler، لتحليل كل module يعالجه webpack. ويُعد parser صنفًا آخر من أصناف webpack التي ترث من tapable، ويوفر مجموعة متنوعة من tapable hooks يستطيع مؤلفو plugins استخدامها لتخصيص عملية parsing.
يوجد parser داخل NormalModuleFactory، لذلك يحتاج الوصول إليه إلى خطوة إضافية بسيطة:
compiler.hooks.normalModuleFactory.tap("MyPlugin", (factory) => {
factory.hooks.parser
.for("javascript/auto")
.tap("MyPlugin", (parser, options) => {
// يوفر `parser` عدة hooks، وسيتم شرحها بالتفصيل أدناه.
// هذا مثال عملي يستخدم hook المسمى `call` لاكتشاف دالة API قديمة
// وتحذير المطور عند استدعائها
// مثل: `myCustomApiFunction()`
parser.hooks.call
.for("myCustomApiFunction")
.tap("MyPlugin", (expression) => {
console.warn(
`Warning: 'myCustomApiFunction' is deprecated. Found call at line ${expression.loc.start.line}.`,
);
});
});
});كما هو الحال مع compiler، قد تكون tapAsync وtapPromise متاحتين أيضًا بحسب نوع hook.
Hooks
يعرض parser hooks التالية ضمن دورة حياته، ويمكن الوصول إليها بهذا الشكل:
evaluateTypeof
SyncBailHook
يُطلق عند تقييم expression مكوّن من typeof لمتغير حر.
- Hook Parameters:
identifier - Callback Parameters:
expression
parser.hooks.evaluateTypeof.for("myIdentifier").tap(
"MyPlugin",
(expression) =>
/* ... */
expressionResult,
);هذا الكود سيطلق hook المسمى evaluateTypeof:
const a = typeof myIdentifier;وهذا الكود لن يطلقه:
const myIdentifier = 0;
const b = typeof myIdentifier;evaluate
SyncBailHook
يُستدعى عند تقييم expression.
- Hook parameters:
expressionType - Callback parameters:
expression
مثال:
index.js
const a = new MyClass();MyPlugin.js
parser.hooks.evaluate.for("NewExpression").tap(
"MyPlugin",
(expression) =>
/* ... */
expressionResult,
);أنواع expressions الممكنة هي:
'ArrowFunctionExpression''AssignmentExpression''AwaitExpression''BinaryExpression''CallExpression''ClassExpression''ConditionalExpression''FunctionExpression''Identifier''LogicalExpression''MemberExpression''NewExpression''ObjectExpression''SequenceExpression''SpreadElement''TaggedTemplateExpression''TemplateLiteral''ThisExpression''UnaryExpression''UpdateExpression'
evaluateIdentifier
SyncBailHook
يُستدعى عند تقييم identifier يمثل متغيرًا حرًا.
- Hook Parameters:
identifier - Callback Parameters:
expression
evaluateDefinedIdentifier
SyncBailHook
يُستدعى عند تقييم identifier يمثل متغيرًا معرّفًا.
- Hook Parameters:
identifier - Callback Parameters:
expression
evaluateCallExpressionMember
SyncBailHook
يُستدعى عند تقييم استدعاء دالة عضو ضمن expression تم تقييمه بنجاح.
- Hook Parameters:
identifier - Callback Parameters:
expressionparam
هذا التعبير سيطلق hook:
index.js
const a = expression.myFunc();MyPlugin.js
parser.hooks.evaluateCallExpressionMember.for("myFunc").tap(
"MyPlugin",
(expression, param) =>
/* ... */
expressionResult,
);statement
SyncBailHook
Hook عام يُستدعى لكل statement يتم تحليلها داخل جزء من الكود.
- 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. يشبه hook المسمى statement، لكنه لا يُطلق إلا عندما تكون statement.type == 'IfStatement'.
- Callback Parameters:
statement
label
SyncBailHook
يُستدعى عند تحليل statements التي تحتوي على label. هذه statements تكون لديها statement.type === 'LabeledStatement'.
- Hook Parameters:
labelName - Callback Parameters:
statement
import
SyncBailHook
يُستدعى لكل عبارة import داخل جزء من الكود. يحتوي parameter المسمى source على اسم الملف المستورد.
- Callback Parameters:
statementsource
عبارة import التالية ستطلق hook مرة واحدة:
index.js
import _ from "lodash";MyPlugin.js
parser.hooks.import.tap("MyPlugin", (statement, source) => {
// source == 'lodash'
});importSpecifier
SyncBailHook
يُستدعى لكل specifier في كل عبارة import.
- Callback Parameters:
statementsourceexportNameidentifierName
عبارة import التالية ستطلق hook مرتين:
index.js
import _, { has } from "lodash";MyPlugin.js
parser.hooks.importSpecifier.tap(
"MyPlugin",
(statement, source, exportName, identifierName) => {
/* الاستدعاء الأول
source == 'lodash'
exportName == 'default'
identifierName == '_'
*/
/* الاستدعاء الثاني
source == 'lodash'
exportName == 'has'
identifierName == 'has'
*/
},
);export
SyncBailHook
يُستدعى لكل عبارة export داخل جزء من الكود.
- Callback Parameters:
statement
exportImport
SyncBailHook
يُستدعى لكل عبارة export مع import، مثل: export * from 'otherModule';.
- Callback Parameters:
statementsource
exportDeclaration
SyncBailHook
يُستدعى لكل عبارة export تصدّر declaration.
- Callback Parameters:
statementdeclaration
هذه exports ستطلق هذا hook:
export const myVar = "hello"; // وينطبق أيضًا على var وlet
export function FunctionName() {}
export class ClassName {}exportExpression
SyncBailHook
يُستدعى لكل عبارة export تصدّر expression، مثل: export default expression;.
- Callback Parameters:
statementdeclaration
exportSpecifier
SyncBailHook
يُستدعى لكل specifier في كل عبارة export.
- Callback Parameters:
statementidentifierNameexportNameindex
exportImportSpecifier
SyncBailHook
يُستدعى لكل specifier في كل عبارة export مع import.
- Callback Parameters:
statementsourceidentifierNameexportNameindex
varDeclaration
SyncBailHook
يُستدعى عند تحليل variable declaration.
- Callback Parameters:
declaration
varDeclarationLet
SyncBailHook
يُستدعى عند تحليل variable declaration مُعرّفة باستخدام let.
- Callback Parameters:
declaration
varDeclarationConst
SyncBailHook
يُستدعى عند تحليل variable declaration مُعرّفة باستخدام const.
- Callback Parameters:
declaration
varDeclarationVar
SyncBailHook
يُستدعى عند تحليل variable declaration مُعرّفة باستخدام var.
- Callback Parameters:
declaration
canRename
SyncBailHook
يُطلق قبل إعادة تسمية identifier لتحديد ما إذا كانت إعادة التسمية مسموحة. يُستخدم غالبًا مع hook المسمى rename.
- Hook Parameters:
identifier - Callback Parameters:
expression
const a = b;
parser.hooks.canRename.for("b").tap(
"MyPlugin",
(expression) =>
// إرجاع true يسمح بإعادة التسمية
true,
);rename
SyncBailHook
يُطلق عند إعادة التسمية للحصول على identifier الجديد. لا يُستدعى هذا hook إلا إذا أرجع canRename القيمة true.
- Hook Parameters:
identifier - Callback Parameters:
expression
const a = b;
parser.hooks.rename.for("b").tap("MyPlugin", (expression) => {});assign (قبل parsing التعبير المسند)
SyncBailHook
يُستدعى عند تحليل AssignmentExpression قبل تحليل expression المسندة.
- Hook Parameters:
identifier - Callback Parameters:
expression
a += b;
parser.hooks.assign.for("a").tap("MyPlugin", (expression) => {
// يُستدعى هذا قبل تحليل b
});assign (قبل parsing الهدف)
SyncBailHook
يُستدعى عند تحليل AssignmentExpression قبل تحليل expression الهدف.
- Hook Parameters:
identifier - Callback Parameters:
expression
a += b;
parser.hooks.assign.for("a").tap("MyPlugin", (expression) => {
// يُستدعى هذا قبل تحليل a
});typeof
SyncBailHook
يُطلق عند تحليل typeof الخاص بـ identifier.
- 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
يُطلق عند تحليل استدعاء دالة عضو من كائن.
- Hook Parameters:
objectIdentifier - Callback Parameters:
expression, properties
myObj.anyFunc();
parser.hooks.callMemberChain
.for("myObj")
.tap("MyPlugin", (expression, properties) => {});new
SyncBailHook
يُستدعى عند تحليل expression من نوع new.
- Hook Parameters:
identifier - Callback Parameters:
expression
new MyClass();
parser.hooks.new.for("MyClass").tap("MyPlugin", (expression) => {});expression
SyncBailHook
يُستدعى عند تحليل expression.
- Hook Parameters:
identifier - Callback Parameters:
expression
const a = this;
parser.hooks.expression.for("this").tap("MyPlugin", (expression) => {});expressionConditionalOperator
SyncBailHook
يُستدعى عند تحليل ConditionalExpression مثل: condition ? a : b.
- Callback Parameters:
expression
program
SyncBailHook
يتيح الوصول إلى abstract syntax tree (AST) الخاص بجزء من الكود.
- Parameters:
astcomments



