zhaobinglong / myBlog

https://zhaobinglong.github.io/myBlog/
MIT License
7 stars 0 forks source link

webpack高级进阶 #14

Open zhaobinglong opened 4 years ago

zhaobinglong commented 4 years ago

webpack的本质

一个打包器,根据文件的引用关系,结合loader和plugin,将源代码打包编译为目标代码

webpack3/4对比

webpack5

zhaobinglong commented 4 years ago

webpack 插件的构成

自定义一个webpack plugin

// 一个 JavaScript 命名函数。
function MyExampleWebpackPlugin() {};

// 在插件函数的 prototype 上定义一个 `apply` 方法。
MyExampleWebpackPlugin.prototype.apply = function(compiler) {
  // 指定一个挂载到 webpack 自身的事件钩子。
  compiler.plugin('webpacksEventHook', function(compilation /* 处理 webpack 内部实例的特定数据。*/, callback) {
    console.log("This is an example plugin!!!");

    // 功能完成后调用 webpack 提供的回调。
    callback();
  });
};

link:https://www.webpackjs.com/contribute/writing-a-plugin/

Compiler 和 Compilation

在插件开发中最重要的两个资源就是 compiler 和 compilation 对象。理解它们的角色是扩展 webpack 引擎重要的第一步。

compiler 对象代表了完整的 webpack 环境配置。这个对象在启动 webpack 时被一次性建立,并配置好所有可操作的设置,包括 options,loader 和 plugin。当在 webpack 环境中应用一个插件时,插件将收到此 compiler 对象的引用。可以使用它来访问 webpack 的主环境。

compilation 对象代表了一次资源版本构建。当运行 webpack 开发环境中间件时,每当检测到一个文件变化,就会创建一个新的 compilation,从而生成一组新的编译资源。一个 compilation 对象表现了当前的模块资源、编译生成资源、变化的文件、以及被跟踪依赖的状态信息。compilation 对象也提供了很多关键时机的回调,以供插件做自定义处理时选择使用。

zhaobinglong commented 4 years ago

自定义webpack loader

参考

团队内部使用的一个loader,可以在平台上的icon资源更新后,自动拉取icon资源到项目本地

rules: [
  {
    test: /\.js$/,
    loader: '@megvii-icons/pull-svg-icons',
    options: {
      requestUri: 'https://fe-cms.mcd.megvii-inc.com/v1/feicons/svg/pullSvgIcons',
      projects: 'megdesign'
    }
  }
]