webpack技術(shù)內(nèi)幕

babel解析

webpack內(nèi)部插件與鉤子的解析

1. 自己寫一個loader

來看markdownd的loader

const marked = require("marked");
//官方提供的一個工具庫
const loaderUtils = require("loader-utils");
module.exports = function (markdown) {
    // merge params and default config
    //獲得webpack.conifg.js的一些核心配置
    //this構(gòu)建上下文的信息
    const options = loaderUtils.getOptions(this);
    this.cacheable();
    //對已有的文件 正則匹配 要不就用AST
    marked.setOptions(options);
    return marked(markdown);
};

2. ast語法樹解析

const code = "const a = 1";
let acorn = require("acorn");
const walk = require("acorn-walk");
const result = acorn.parse(code);
console.log(result);
walk.simple(result,{
    Literal(node) {
        console.log(`Found a literal: ${node.value}`)
    }
});

ast解析,修改,整合

const esprima = require('esprima');
const estraverse = require("estraverse");
const escodegen = require("escodegen");
const code = `const view = {
    a:3,
    init:()=>{
        view.a = 4;
    },
    render: ()=> {
    }
}`;
const ast = esprima.parse(code);
// console.log(ast);
estraverse.traverse(ast, {
    enter: function (node, parent) {
        if(node.type =="VariableDeclaration"){
            console.log("??",node.kind)
            node.kind = "var";
        }
    }
});
const generated_code = escodegen.generate(ast);
console.log(JSON.stringify(generated_code,null,4));

3. plugin編寫

const pluginName = 'ConsoleLogOnBuildWebpackPlugin';
class ConsoleLogOnBuildWebpackPlugin {
    //webpack 調(diào)用apply=>compiler
    apply(compiler) {
        compiler.hooks.run.tap(pluginName, compilation => {
            console.log("webpack 構(gòu)建過程開始!");
        });
    }
}
// 1.類插件 apply方法
// 2.apply方法 compiler webpack-cli bin里運(yùn)行之后 馬上調(diào)度的第一個文件
// 3.webpack編譯過程 大權(quán) Compiler
// 4.Compiler->Compilation extends (Tapable)
// 5.為了在關(guān)鍵的時間節(jié)點(diǎn)可以觸發(fā)訂閱的的結(jié)構(gòu)
// 6.compilation->new SyncHook
// 7.webpack 運(yùn)行的時候 就把你的業(yè)務(wù)邏輯就給初期掛載了 compilation.call()
// 8.compilation掛載到了HTML-WEBPACK-PLUGIN call && tap 合適的實(shí)時機(jī)觸發(fā)插件
class HtmlAfterWebpackPlugin {
    apply(compiler) {
        compiler.hooks.compilation.tap(pluginName, compilation => {
            compilation.hooks.htmlWebpackPluginAfterHtmlProcessing.tap(pluginName, htmlPluginData => {
            });
        });
    }
}
//https://alienzhou.github.io/webpack-internal-plugin-relation/
// https://webpack.docschina.org/contribute/writing-a-plugin/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容