W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
?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
? 暴露,可以通過如下方式訪問:
SyncBailHook
當對自由變量使用 ?typeof
? 表達式進行求值時觸發(fā)
identifier
?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;
SyncBailHook
在求值表達式時調用
expressionType
?expression
?示例:
index.js
const a = new String();
MyPlugin.js
parser.hooks.evaluate.for('NewExpression').tap('MyPlugin', (expression) => {
/* ... */
return expressionResult;
});
表達式的類型:
SyncBailHook
當評估一個自由變量的標識符時調用
identifier
?expression
?SyncBailHook
當評估一個已定義變量的標識符時調用
identifier
?expression
?SyncBailHook
當對已成功求值的表達式調用成員函數時調
identifier
?expression
? ?param
?將會觸發(fā)鉤子的表達式:
index.js
const a = expression.myFunc();
MyPlugin.js
parser.hooks.evaluateCallExpressionMember
.for('myFunc')
.tap('MyPlugin', (expression, param) => {
/* ... */
return expressionResult;
});
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'
?SyncBailHook
在解析 if 語句時調用。和 ?statement
? 鉤子相同,但僅在 ?statement.type == 'IfStatement'
? 時觸發(fā)
statement
?SyncBailHook
當解析帶標簽的語句時調用此鉤子。這些語句的類型為 ??statement.type === 'LabeledStatement'?
?
labelName
?statement
?SyncBailHook
在代碼片段中每個導入語句都會調用此鉤子。?source
? 參數包含所導入文件的名稱
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'
});
SyncBailHook
對于每個?import
?語句中的每個指定符,都會調用此鉤子函數
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'
*/
}
);
SyncBailHook
該鉤子函數會在代碼片段中的每個 export 語句被解析時觸發(fā)
statement
?SyncBailHook
在代碼片段中的每個導出導入語句(例如:export * from 'otherModule';
)都會調用該鉤子
statement
? ?source
?SyncBailHook
每個導出聲明的導出語句都會調用此鉤子
statement
? ?declaration
?這些導出語句會觸發(fā)該鉤子函數:
export const myVar = 'hello'; // also var, let
export function FunctionName() {}
export class ClassName {}
SyncBailHook
被用于解析并評估代碼中的導出表達式,例如 export default expression;
,在導出表達式時觸發(fā)此鉤子
statement
? ?declaration
?SyncBailHook
該鉤子會為每個導出語句的每個成員說明符調用
statement
? ?identifierName
? ?exportName
? ?index
?SyncBailHook
該鉤子將在每個導出-導入語句的每個成員說明符上觸發(fā)
statement
? ?source
? ?identifierName
? ?exportName
? ?index
?SyncBailHook
解析變量聲明時觸發(fā)
declaration
?SyncBailHook
在解析使用 ?let
? 定義的變量聲明時調用
declaration
?SyncBailHook
解析使用 const
定義的變量聲明時被調用
declaration
?SyncBailHook
當解析使用 var
定義的變量聲明時調用
declaration
?SyncBailHook
當解析使用 var
定義的變量聲明時調用
identifier
?expression
?var a = b;
parser.hooks.canRename.for('b').tap('MyPlugin', (expression) => {
// returning true allows renaming
return true;
});
SyncBailHook
在重命名標識符之前觸發(fā)以確定是否允許重命名。通常與重命名鉤子一起使用
identifier
?expression
?var a = b;
parser.hooks.rename.for('b').tap('MyPlugin', (expression) => {});
SyncBailHook
會在解析 ?AssignmentExpression
? 時,在解析被賦值的表達式之前觸發(fā)
identifier
?expression
?a += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// this is called before parsing b
});
SyncBailHook
會在解析 ?AssignmentExpression
? 時,在解析賦值的表達式之前觸發(fā)
identifier
?expression
?a += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// this is called before parsing a
});
SyncBailHook
當解析標識符的? typeof
? 操作符時觸發(fā)
identifier
?expression
?SyncBailHook
在解析函數調用時被調用
identifier
?expression
?eval(/* something */);
parser.hooks.call.for('eval').tap('MyPlugin', (expression) => {});
SyncBailHook
當解析對象的成員函數的調用時觸發(fā)
objectIdentifier
?expression
?? properties
?myObj.anyFunc();
parser.hooks.callMemberChain
.for('myObj')
.tap('MyPlugin', (expression, properties) => {});
SyncBailHook
該鉤子在解析 ?new
? 表達式時被調用
identifier
?expression
?new MyClass();
parser.hooks.new.for('MyClass').tap('MyPlugin', (expression) => {});
SyncBailHook
該鉤子會在解析表達式時被觸發(fā)
identifier
?expression
?const a = this;
parser.hooks.expression.for('this').tap('MyPlugin', (expression) => {});
SyncBailHook
在解析條件表達式(例如 condition ? a : b
)時調用
expression
?SyncBailHook
獲取代碼片段的抽象語法樹(AST)的訪問權限
ast
? ?comments
?
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: