首页 > 其他分享 >动手实现一个webpack的loader和plugin

动手实现一个webpack的loader和plugin

时间:2024-03-07 14:22:05浏览次数:20  
标签:CustomWebpackPlugin plugin compilation module loader webpack compiler

目录

动手实现一个webpack的loader

// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            // 模块或路径
            loader: './css-loader.js',
            options: {aaa: 111}
          }
        ]
      }
    ]
  }
};
// css-loader.js
module.exports = function (source) {
  console.log(this.getOptions()) // { aaa: 111 }
  return `
const styleEl = document.createElement('style')
styleEl.innerText = ${JSON.stringify(source)}
document.head.appendChild(styleEl)
`
}

动手实现一个webpack的plugin

webpack 创建compiler对象,里面保存着webpack完整配置
    ↓
compiler
    ↓
compiler.run()
    ↓               创建compilation对象,包含一次资源完整构建过程
compiler.compilation()
    ↓
compiler.make()---------------→compilation
    |                               ↓
    |                          compilation.buildModule()
    |                               ↓
    |                          compilation.seal()
    |                               ↓
    |                          compilation.optimize()
    |                               ↓
    |                          compilation.reviveChunks()
    ↓                               ↓
compiler.afterCompile()←-------compilation.seal()
    ↓
compiler.emit()
    ↓
compiler.emitAssets() 最后将资源输出出去
const CustomWebpackPlugin = require('./custom-webpack-plugin')

module.exports = {
  plugins: [
    new CustomWebpackPlugin({bbb: 222})
  ]
};
class CustomWebpackPlugin {
  constructor(options) {
    this.options = options
  }

  /**
   * 函数或类的原型上定义一个apply方法
   * 注意:npm i -D @types/webpack
   * @param {Compiler} compiler
   */
  apply(compiler) {
    // 文档地址:https://www.webpackjs.com/api/compiler-hooks/
    // compiler.hooks.<钩子>.<钩子同步:tap;异步:tabAsync|tapPromise>
    // tabAsync('插件名',(...,callback)=>{callback()})
    // tapPromise('插件名',()=>{return Promise})
    // 异步串行:多个相同的钩子,钩子按顺序调用(emit)
    // 异步并行:多个相同的钩子,钩子无阻塞调用(make)
    compiler.hooks.make.tapAsync("CustomWebpackPlugin",
      /** @param {Compilation} compilation */
      (compilation, callback) => {
        compilation.hooks.seal.tap("CustomWebpackPlugin", () => {
        })
        callback()
      })
  }
}

module.exports = CustomWebpackPlugin

chrome浏览器调试nodejs代码

* 命令行执行:node --inspect-brk <filename>
* chrome浏览器F12打开控制台
* 点击控制台左上角nodejs图标

标签:CustomWebpackPlugin,plugin,compilation,module,loader,webpack,compiler
From: https://www.cnblogs.com/linding/p/18058812

相关文章

  • 简易版webpack的实现步骤
    目录简易版webpack的实现步骤1、npm的bin2、文件的读写3、webpack是如何做的4、模块遍历(图结构)5、模块脚本拼接简易版webpack的实现步骤1、npm的bin*npminit-y*package.json添加配置########{"bin":{"llpack":"bin/index.js"}}########入口文件头部添......
  • webpack打包怎么操作
    webpack是一个现代化的前端打包工具,它可以将多个模块打包成一个或多个静态资源文件。通过使用webpack,开发者可以更高效地管理和组织项目的代码,并且可以通过各种插件和加载器来优化和扩展项目的功能。 要使用webpack进行打包操作,首先需要安装webpack。可以通过npm(NodePackage......
  • ROS pluginlib使用教程
    pluginlib用法通俗一点说,plugin的用法就像是面向对象编程里面的多态。插件就是子类,插件实现父类的方法,那么系统调用父类方法时就是子类的方法,也就实现了替换。对应ROS里面只需要在launch文件中选择想要的插件,无需修改预案系统即可完成替换。这里实现一个常用的plugin场景。core......
  • 从源码看webpack3打包流程
    在javascript刚刚流行时,前端项目通常比较简单,不需要考虑项目的开发效率、性能和扩展性等。随着前端项目越来越复杂,需要更正式的软件开发实践,比如单元测试(unittesting)、代码检查(linting)、文件缩小(minification)、文件捆绑(bundling)和代码编译(compilation)等[1]。单元测......
  • maven 包管理平台-07-plugins 常见插件介绍
    拓展阅读maven包管理平台-01-maven入门介绍+Maven、Gradle、Ant、Ivy、Bazel和SBT的详细对比表格maven包管理平台-02-windows安装配置+mac安装配置maven包管理平台-03-mavenprojectmaven项目的创建入门maven包管理平台-04-mavenarchetype项目原型maven包......
  • Class.getResource() 和 ClassLoader.getResource()用法
    idea中项目目录结构 importcom.xpp.app.Dog;importjava.net.URL;publicclassMain{publicstaticvoidmain(String[]args){//当参数不带/会默认从该类所在的包下找URLurl1=Dog.class.getResource("");//file:/D:/idea_Java_......
  • 自定义 DataLoader 时应使用 Unix 系统
    自定义Dataset类PyTorch允许自定义Dataset类,并由此获得DataLoader,能方便训练时获得batch:fromtorch.utils.dataimportDataLoader,Datasetimporth5pyimportosclassRadarDataset(Dataset):def__init__(self,directory):...def__len__(s......
  • webpack5多入口的时候HtmlWebpackPlugin怎么处理多个html文件
    constHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={entry:{app1:'./src/app1.js',app2:'./src/app2.js'},output:{filename:'[name].bundle.js',path:path.resolve......
  • webpack-dev-server 插件问题 Content not from webpack is served from
    在安装了webpack-dev-server插件后启动然后一直报错 Contentnotfromwebpackisservedfrom XXXX在浏览器中访问 一直显示cannot  / 解决办法在wenbpack.config.js的配置文件中加入输出文件路径配置  devServer:{    static:{     ......
  • 解决uniapp项目中使用vant Weapp图标组件报错问题(Module build failed from ./node_mo
    解决uniapp项目中使用vantWeapp图标组件报错问题(Modulebuildfailedfrom./node_modules/postcss-loader/src/index):https://blog.csdn.net/it_cgq/article/details/111991644?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170909210216800225582870%2522%252C%252......