W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
?parser
? 實(shí)例,在 ?compiler
? 中被發(fā)現(xiàn),是用來(lái)解析由 webpack 處理過(guò)的每個(gè)模塊。?parser
? 也是擴(kuò)展自 ?tapable
? 的 webpack 類 并且提供多種 ?tapable
? 鉤子,
以下示例中,?parser
? 位于 NormalModuleFactory 中,因此需要調(diào)用額外鉤子 來(lái)進(jìn)行獲取:
compiler.hooks.normalModuleFactory.tap('MyPlugin', (factory) => {
factory.hooks.parser
.for('javascript/auto')
.tap('MyPlugin', (parser, options) => {
parser.hooks.someHook.tap(/* ... */);
});
});
和 ?compiler
? 用法相同,取決于不同的鉤子類型, 也可以在某些鉤子上訪問(wèn) ?tapAsync
? 和 ?tapPromise
?。
以下生命周期鉤子函數(shù),是由 ?parser
? 暴露,可以通過(guò)如下方式訪問(wèn):
SyncBailHook
當(dāng)對(duì)自由變量使用 ?typeof
? 表達(dá)式進(jìn)行求值時(shí)觸發(fā)
identifier
?expression
?parser.hooks.evaluateTypeof
.for('myIdentifier')
.tap('MyPlugin', (expression) => {
/* ... */
return expressionResult;
});
這會(huì)觸發(fā) ?evaluateTypeof
? 鉤子的調(diào)用:
const a = typeof myIdentifier;
這不會(huì)觸發(fā):
const myIdentifier = 0;
const b = typeof myIdentifier;
SyncBailHook
在求值表達(dá)式時(shí)調(diào)用
expressionType
?expression
?示例:
index.js
const a = new String();
MyPlugin.js
parser.hooks.evaluate.for('NewExpression').tap('MyPlugin', (expression) => {
/* ... */
return expressionResult;
});
表達(dá)式的類型:
SyncBailHook
當(dāng)評(píng)估一個(gè)自由變量的標(biāo)識(shí)符時(shí)調(diào)用
identifier
?expression
?SyncBailHook
當(dāng)評(píng)估一個(gè)已定義變量的標(biāo)識(shí)符時(shí)調(diào)用
identifier
?expression
?SyncBailHook
當(dāng)對(duì)已成功求值的表達(dá)式調(diào)用成員函數(shù)時(shí)調(diào)
identifier
?expression
? ?param
?將會(huì)觸發(fā)鉤子的表達(dá)式:
index.js
const a = expression.myFunc();
MyPlugin.js
parser.hooks.evaluateCallExpressionMember
.for('myFunc')
.tap('MyPlugin', (expression, param) => {
/* ... */
return expressionResult;
});
SyncBailHook
用于在代碼片段中解析每個(gè)語(yǔ)句時(shí)調(diào)用的通用的鉤子
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 語(yǔ)句時(shí)調(diào)用。和 ?statement
? 鉤子相同,但僅在 ?statement.type == 'IfStatement'
? 時(shí)觸發(fā)
statement
?SyncBailHook
當(dāng)解析帶標(biāo)簽的語(yǔ)句時(shí)調(diào)用此鉤子。這些語(yǔ)句的類型為 ??statement.type === 'LabeledStatement'?
?
labelName
?statement
?SyncBailHook
在代碼片段中每個(gè)導(dǎo)入語(yǔ)句都會(huì)調(diào)用此鉤子。?source
? 參數(shù)包含所導(dǎo)入文件的名稱
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
對(duì)于每個(gè)?import
?語(yǔ)句中的每個(gè)指定符,都會(huì)調(diào)用此鉤子函數(shù)
statement
? ?source
? ?exportName
? ?identifierName
?以下 import 語(yǔ)句將會(huì)觸發(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
該鉤子函數(shù)會(huì)在代碼片段中的每個(gè) export 語(yǔ)句被解析時(shí)觸發(fā)
statement
?SyncBailHook
在代碼片段中的每個(gè)導(dǎo)出導(dǎo)入語(yǔ)句(例如:export * from 'otherModule';
)都會(huì)調(diào)用該鉤子
statement
? ?source
?SyncBailHook
每個(gè)導(dǎo)出聲明的導(dǎo)出語(yǔ)句都會(huì)調(diào)用此鉤子
statement
? ?declaration
?這些導(dǎo)出語(yǔ)句會(huì)觸發(fā)該鉤子函數(shù):
export const myVar = 'hello'; // also var, let
export function FunctionName() {}
export class ClassName {}
SyncBailHook
被用于解析并評(píng)估代碼中的導(dǎo)出表達(dá)式,例如 export default expression;
,在導(dǎo)出表達(dá)式時(shí)觸發(fā)此鉤子
statement
? ?declaration
?SyncBailHook
該鉤子會(huì)為每個(gè)導(dǎo)出語(yǔ)句的每個(gè)成員說(shuō)明符調(diào)用
statement
? ?identifierName
? ?exportName
? ?index
?SyncBailHook
該鉤子將在每個(gè)導(dǎo)出-導(dǎo)入語(yǔ)句的每個(gè)成員說(shuō)明符上觸發(fā)
statement
? ?source
? ?identifierName
? ?exportName
? ?index
?SyncBailHook
解析變量聲明時(shí)觸發(fā)
declaration
?SyncBailHook
在解析使用 ?let
? 定義的變量聲明時(shí)調(diào)用
declaration
?SyncBailHook
解析使用 const
定義的變量聲明時(shí)被調(diào)用
declaration
?SyncBailHook
當(dāng)解析使用 var
定義的變量聲明時(shí)調(diào)用
declaration
?SyncBailHook
當(dāng)解析使用 var
定義的變量聲明時(shí)調(diào)用
identifier
?expression
?var a = b;
parser.hooks.canRename.for('b').tap('MyPlugin', (expression) => {
// returning true allows renaming
return true;
});
SyncBailHook
在重命名標(biāo)識(shí)符之前觸發(fā)以確定是否允許重命名。通常與重命名鉤子一起使用
identifier
?expression
?var a = b;
parser.hooks.rename.for('b').tap('MyPlugin', (expression) => {});
SyncBailHook
會(huì)在解析 ?AssignmentExpression
? 時(shí),在解析被賦值的表達(dá)式之前觸發(fā)
identifier
?expression
?a += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// this is called before parsing b
});
SyncBailHook
會(huì)在解析 ?AssignmentExpression
? 時(shí),在解析賦值的表達(dá)式之前觸發(fā)
identifier
?expression
?a += b;
parser.hooks.assigned.for('a').tap('MyPlugin', (expression) => {
// this is called before parsing a
});
SyncBailHook
當(dāng)解析標(biāo)識(shí)符的? typeof
? 操作符時(shí)觸發(fā)
identifier
?expression
?SyncBailHook
在解析函數(shù)調(diào)用時(shí)被調(diào)用
identifier
?expression
?eval(/* something */);
parser.hooks.call.for('eval').tap('MyPlugin', (expression) => {});
SyncBailHook
當(dāng)解析對(duì)象的成員函數(shù)的調(diào)用時(shí)觸發(fā)
objectIdentifier
?expression
?? properties
?myObj.anyFunc();
parser.hooks.callMemberChain
.for('myObj')
.tap('MyPlugin', (expression, properties) => {});
SyncBailHook
該鉤子在解析 ?new
? 表達(dá)式時(shí)被調(diào)用
identifier
?expression
?new MyClass();
parser.hooks.new.for('MyClass').tap('MyPlugin', (expression) => {});
SyncBailHook
該鉤子會(huì)在解析表達(dá)式時(shí)被觸發(fā)
identifier
?expression
?const a = this;
parser.hooks.expression.for('this').tap('MyPlugin', (expression) => {});
SyncBailHook
在解析條件表達(dá)式(例如 condition ? a : b
)時(shí)調(diào)用
expression
?SyncBailHook
獲取代碼片段的抽象語(yǔ)法樹(shù)(AST)的訪問(wèn)權(quán)限
ast
? ?comments
?
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: