美文网首页
webpack技术内幕

webpack技术内幕

作者: zxhnext | 来源:发表于2019-06-14 15:47 被阅读0次

babel解析

webpack内部插件与钩子的解析

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构建上下文的信息
    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 调用apply=>compiler
    apply(compiler) {
        compiler.hooks.run.tap(pluginName, compilation => {
            console.log("webpack 构建过程开始!");
        });
    }
}
// 1.类插件 apply方法
// 2.apply方法 compiler webpack-cli bin里运行之后 马上调度的第一个文件
// 3.webpack编译过程 大权 Compiler
// 4.Compiler->Compilation extends (Tapable)
// 5.为了在关键的时间节点可以触发订阅的的结构
// 6.compilation->new SyncHook
// 7.webpack 运行的时候 就把你的业务逻辑就给初期挂载了 compilation.call()
// 8.compilation挂载到了HTML-WEBPACK-PLUGIN call && tap 合适的实时机触发插件
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/

相关文章

  • webpack技术内幕

    webpack技术内幕 入口文件 对于多入口文件,如何巧妙地编写入口 Module浅析 开启对Webpack多核的...

  • webpack技术内幕

    babel解析 webpack内部插件与钩子的解析 1. 自己写一个loader 来看markdownd的load...

  • InnoDB存储引擎体系架构

    (本片博文是《MySQL技术内幕 InnoDB存储引擎第二版》的读书笔记)这是《MySQL技术内幕 InnoDB存...

  • 2017计划

    小鱼计划 读书 effective java,深入Java虚拟机,spring内幕,MySQL技术内幕, head...

  • 第一章 浏览器和浏览器内核

    webkit技术内幕 1. 技术内幕 渲染:根据描述或定义构建数学模型,通过模型生成图像的过程。 浏览器的渲染引擎...

  • 浏览器安全机制

    前言 此文章是我最近在看的【WebKit 技术内幕】一书的一些理解和做的笔记。 而【WebKit 技术内幕】是基于...

  • 数据库技术

    数据库技术 sschrodinger 2019/05/06 引用 MySQL 技术内幕 - InnoDB 存储引擎...

  • Jersey 学习总结 spring mvc对比

    功能特点 与spring mvc(后简称MVC)对比 技术内幕

  • Kafka技术内幕

    第一部分:初步了解Kafka Apache Kafka是一个分布式流媒体平台。这到底是什么意思?流媒体平台具有三个...

  • zookeeper技术内幕

    【简介】zookeeper是为分布式应用所设计的高可用、高性能且一致的开源协调服务,是大数据分布式集群的基础组件,...

网友评论

      本文标题:webpack技术内幕

      本文链接:https://www.haomeiwen.com/subject/hhhatctx.html