loader与plugin的区别

loader的作用是将代码进行转换,比如less转成css,一个loader就是一个函数,接收的参数是上一个loader的返回值,loader进行一系列处理后 返回新的代码

plugin的作用是在webpack的编译流程中完成某些操作,比如当webpack编译启动时,控制台输出一句话表示webpack启动了,plugin是一个带有apply方法的对象,apply方法的参数是compiler,在apply中注册compiler对象的钩子函数,钩子函数在官网中有相应的描述。

loader

基本配置

module.exports = {
mode: "development",
module: {
rules: [
{
test: /\.css$/,
// 先执行 css-loader 再执行 style-loader
use: ["style-loader","css-loader"],
}
],
},
};

loaders处理流程

判断当前文件名是否满足module.rules.test的规则

满足规则,则根据loaders数组从最后一个loader依次执行到最前的一个loader;不满足规则,loaders数组为空,没有可执行的loader

最后返回loaders处理结果

loader的写法

css-loader:

module.exports = function (sourceCode) {
var code = `var style = document.createElement("style");
style.innerHTML = \`${sourceCode}\`;
document.head.appendChild(style);
module.exports = \`${sourceCode}\``;
return code;
}

plugin

loader的功能定位是转换代码,而一些其他的操作难以使用loader完成,比如:

  • 当webpack生成文件时,顺便多生成一个说明描述文件
  • 当webpack编译启动时,控制台输出一句话表示webpack启动了
  • 当xxxx时,xxxx

当我们需要把功能嵌入到webpack的编译流程中的时候,要借助于plugin

基本配置

module.exports = {
plugins:[
new MyPlugin()
]
}

plugin是一个带有apply方法的对象

var plugin = {
apply: function(compiler){ }
}

也可以使用class的写法

class MyPlugin{
apply(compiler){ }
} var plugin = new MyPlugin();

apply

apply方法会在初始化阶段,创建好Compiler对象后运行。

compiler对象是在初始化阶段构建的,整个webpack打包期间只有一个compiler对象,后续完成打包工作的是compiler对象内部创建的compilation

apply方法在一次打包过程中只执行一次,该方法接收一个compiler对象

compiler对象提供了大量的钩子函数(hooks,可以理解为事件),plugin的开发者可以注册这些钩子函数,参与webpack编译和生成。

你可以在apply方法中使用下面的代码注册钩子函数:

class MyPlugin{
apply(compiler){
compiler.hooks.事件名称.事件类型(name, function(compilation){
//事件处理函数
})
}
}

事件名称

即要监听的事件名,即钩子名,所有的钩子:https://www.webpackjs.com/api/compiler-hooks

事件类型

这一部分使用的是 Tapable API,这个小型的库是一个专门用于钩子函数监听的库。

它提供了一些事件类型:

  • tap:注册一个同步的钩子函数,函数运行完毕则表示事件处理结束
  • tapAsync:注册一个基于回调的异步的钩子函数,函数通过调用一个回调表示事件处理结束
  • tapPromise:注册一个基于Promise的异步的钩子函数,函数通过返回的Promise进入已决状态表示事件处理结束

处理函数

处理函数有一个事件参数compilation

webpack之loader与plugin的更多相关文章

  1. webpack之loader和plugin简介

    webpack之loader和plugin简介 webpack入门和实战(二):全面理解和运用loader和plugins webpack入门(四)——webpack loader 和plugin w ...

  2. webpack中loader和plugin的概念理解

    对于 loader ,它就是一个转换器,将A文件进行编译形成B文件,这里操作的是文件,比如将 A.scss 或 A.less 转变成 B.css,单纯的文件转换过程: 对于 plugin,它就是一个扩 ...

  3. webpack的loader和plugin的区别

    [Loader]:用于对模块源码的转换,loader描述了webpack如何处理非javascript模块,并且在buld中引入这些依赖.loader可以将文件从不同的语言(如TypeScript)转 ...

  4. webpack 中 loader 和 plugin 的区别

    通俗点讲loader是转换,plugin是执行比转换更复杂的任务,比如合并压缩等 loader:让webpack能够处理非js文件,然后你就可以利用 webpack 的打包能力,对它们进行处理. 例如 ...

  5. webpack常用loader和plugin及打包速度优化

    优化 或 也可以用: 备用: 慎用的配置,用的不好会增加打包时间: 代码丑化插件:

  6. webpack 中,loader、plugin 的区别

    loader 和 plugin 的主要区别: loader 用于加载某些资源文件. 因为 webpack 只能理解 JavaScript 和 JSON 文件,对于其他资源例如 css,图片,或者其他的 ...

  7. webpack的loader的原理和实现

    想要实现一个loader,需要首先了解loader的基本原理和用法. 1. 使用 loader是处理模块的解析器. module: { rules: [ { test: /\.css$/, use: ...

  8. webpack之loader实践

    初识前端模板概念的开发者,通常都使用过underscore的template方法,非常简单好用,支持赋值,条件判断,循环等,基本可以满足我们的需求. 在使用Webpack搭建开发环境的时候,如果要使用 ...

  9. webpack之Loader

    我们知道webpack的优点之一就是专注于处理模块化的项目,能做到开箱即用,但同时这也是webpack的缺点,只能用于模块化开发的项目,例如:Vue,React,Angular.Webpack在进行打 ...

  10. webpack入门(四)——webpack loader 和plugin

    什么是loader loaders是你用在app源码上的转换元件.他们是用node.js运行的,把源文件作为参数,返回新的资源的函数. 例如,你可以用loaders告诉webpack加载 coffee ...

随机推荐

  1. css背景颜色动态渐变实例

    1.https://www.imooc.com/article/27831 2.https://blog.csdn.net/lolgenius/article/details/70169493 3.h ...

  2. ABAP 动态内表 实例展示以及代码Demo

    因根据查询条件展示的报表列数不一定一致,因此采用动态内表的方式进行处理 这里写了一个简单的Demo记录一下 效果如下图: 一般来说通过选择屏幕来控制列的,我这里就简单处理,直接对内表赋予相关值,包括相 ...

  3. vue dialog弹窗

    <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" title=&quo ...

  4. laravel 邮件发送

    1.首先你要在qq悠闲中开启你的   SMPT(设置->账户)   获取到你的授权码 2.配置laravel MAIL_DRIVER=smtpMAIL_HOST=smtp.qq.comMAIL_ ...

  5. windows 批量杀进程

    1 import psutil 2 from subprocess import Popen, PIPE 3 4 process_name ="bsmr.exe,fxclient.exe,F ...

  6. ubuntu 系统增加源和删除源文件

    一.添加PPA源文件 语法格式:sudo add-apt-repository ppa:user/ppa-name 示例: sudo add-apt-repository ppa:sergiomeji ...

  7. linux下安装OpenJDK 1.8

    1. 使用yum查找jdk: yum search java|grep jdk [root@iasdasd jvm]# yum search java|grep jdk Repository extr ...

  8. vagrant用密码连接ssh

    1通过 ssh address连接 1:进去linux 2:修改配置文件信息 vi /etc/ssh/sshd_config 修改 passwordAuthentication no 改为 passw ...

  9. KinectFusion算法论文解读/代码解读随笔

    --2021.6.8 上图是kinectfusion的流程图,是整个系统的工作流.我们对上面的流程进行分析以及相关代码的解读,使用的代码库是pcl的Kinectfusion复现.(ps:因为我只在ub ...

  10. Dubbo Debug大全

    com.alibaba.dubbo.rpc.RpcException: No provider available from registry 120.25.85.89:2181 for servic ...