yang-xianzhu / astro-blog

🚀-基于Astro搭建的个人博客
https://yang-xianzhu.github.io/
5 stars 0 forks source link

面试官:说说loader 和 plugin #4

Open yang-xianzhu opened 1 year ago

yang-xianzhu commented 1 year ago

loader

1、介绍

官方介绍:loader用于对模块的源代码进行转换。loader可以使你在importload(加载)模块时预处理文件。因此,loader类似于其他构建工具中任务task,并提供了处理前端构建步骤的得力方式。loader可以将文件从不同的语言(如TypeScript)转换为JavaScript或将内联图像转换为data URL。loader甚至允许你直接在JavaScirpt模块中importCSS文件。

2、特性

可以通过loader的预处理函数,为JavaScript生态系统提供更多能力。用户现在可以更加灵活地引入细粒度逻辑,例如:压缩打包语言转换(或者编译)等。

plugin

插件 是 webpack 的 [支柱](https://github.com/webpack/tapable) 功能。Webpack 自身也是构建于你在 webpack 配置中用到的 相同的插件系统 之上!

插件(plugin)的目的在于解决loader无法实现的其他事。

webapck插件是一个具有apply方法的JavaScript对象。apply方法会被webpack compiler调用,并且在整个编译生命周期都可以访问compiler对象。

实现一个自己的plugin:

const pluginName = 'ConsoleLogOnBuildWebpackPlugin';

class ConsoleLogOnBuildWebpackPlugin {
  apply(compiler) {
    compiler.hooks.run.tap(pluginName, (compilation) => {
      console.log('webpack 构建正在启动!');
    });
  }
}

module.exports = ConsoleLogOnBuildWebpackPlugin;

compiler hook 的 tap 方法的第一个参数,应该是驼峰式命名的插件名称。建议为此使用一个常量,以便它可以在所有 hook 中重复使用。