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: expression param

هذا التعبير سيطلق 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: statement source

عبارة import التالية ستطلق hook مرة واحدة:

index.js

import _ from "lodash";

MyPlugin.js

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

importSpecifier

SyncBailHook

يُستدعى لكل specifier في كل عبارة import.

  • Callback Parameters: statement source exportName identifierName

عبارة 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: statement source

exportDeclaration

SyncBailHook

يُستدعى لكل عبارة export تصدّر declaration.

  • Callback Parameters: statement declaration

هذه exports ستطلق هذا hook:

export const myVar = "hello"; // وينطبق أيضًا على var وlet
export function FunctionName() {}
export class ClassName {}

exportExpression

SyncBailHook

يُستدعى لكل عبارة export تصدّر expression، مثل: export default expression;.

  • Callback Parameters: statement declaration

exportSpecifier

SyncBailHook

يُستدعى لكل specifier في كل عبارة export.

  • Callback Parameters: statement identifierName exportName index

exportImportSpecifier

SyncBailHook

يُستدعى لكل specifier في كل عبارة export مع import.

  • Callback Parameters: statement source identifierName exportName index

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: ast comments
·تعديل هذه الصفحة

1 مساهم

RlxChap2