loader和plugin有什么区别呢?什么是loader,什么是plugin。

当我们在源代码里面去引入一个新的js文件或者一个其他格式的文件的时候,这个时候,我们可以借助loader去帮我们处理引用的文件,这是loader的一个作用

当我们在做打包的时候,在某一些具体时刻上,比如打包结束后,我要自动生成一个html文件,这个时候就可以使用一个htmlwebpackplugin的插件, 比如在打包之前,要把dist目录清空,这个时候可以使用clearwebpackplugin。

首先新建一个项目plugin
npm init -y
npm install webpack webpack-cli --save-dev
新建文件夹src,index.js
index.js
console.log('hello world');

webpack.config.js

const path = require('path');

module.exports = {
  mode: 'development',
  entry: {
    main: './src/index.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
  }
}

package.json

"scripts": {
  "build": "webpack"
}

运行npm run build,运行完成。生成main.js。输出hello world。

我现在要做这样一个功能,打包完后在dist下面帮我自动生成一个版权信息的js。在根目录下新建一个文件夹叫做plugins。在新建一个js叫做copyright-webpack-plugin.js。插件的定义跟loader不一定,loader是一个函数,插件是一个类
copyright-webpack-plugin.js
class CopyrightWebpackPlugin {
  constructor(){
    console.log('插件被使用了')
  }
  apply(compiler) {
  }
}
module.exports = CopyrightWebpackPlugin;

格式大概长成这个样子,所以每次定义一个插件的时候,都长这个样子。

接着我们要使用他,在webpack.config.js里面去使用他
const CopyRightWebpackPlugin = require('./plugins/copyright-webpack-plugin');
module.exports = {
  plugins: [
    /**
    * 所以知道为什么插件要一个new,因为是一个类,用的时候需要new一下。
    * new这个插件的时候,就使用了这个插件
    */
    new CopyRightWebpackPlugin()
  ],
}

然后运行npm run build。发现控制台打印出了'插件被使用了'。确实使用了,但是什么没干。

这个时候在new 的时候传入参数。插件里面constructor就可以获取到了。
copyright-webpack-plugin.js
class CopyrightWebpackPlugin {
  /**
  * compiler是webpack的一个实例,这个实例存储了webpack各种信息,所有打包信息
  * https://webpack.js.org/api/compiler-hooks
  * 官网里面介绍了compiler里面有个hooks这样的概念
  * hooks是钩子的意思,里面定义了时刻值
  */
  apply(compiler) {
  /**
  * 用到了hooks,emit这个时刻,在输出资源之前,这里官网告诉我们是一个异步函数
  * compilation是这一次的打包信息,所以跟compiler是不一样的
  * tapAsync接受两个参数,第一个是名字,
  */
  compiler.hooks.emit.tapAsync('CopyrightWebpackPlugin',(compilation, cb)=>{
    debugger;
    compilation.assets['copyright.txt'] = {
      source: function(){
        return 'copyright by q'
      },
      size: function() {
        return 15
      }
    };
    // 最后一定要调用cb
    cb();
  })
  /**
  * 同步的时刻跟同步的时刻写代码的方式不一样
  * 同步的时刻,后面只要一个参数就可以了
  */
  compiler.hooks.compile.tap('CopyrightWebpackPlugin',(compilation) => {
    console.log('compiler');
  })
  }
}
module.exports = CopyrightWebpackPlugin;

然后运行,dist下就生成了一个copyright.txt。里面是copyright by q。

这里有个疑问,我怎么知道compilation有assert这样的东西,这里有个debugger。
"scripts": {
  "debug": "node --inspect --inspect-brk node_modules/webpack/bin/webpack.js",
  "build": "webpack"
},

运行debug,就可以对插件进行调试,能够可视化对看见compilation下所有的信息。debug跟build是同样的一个东西,只不过debug可以在里面传入参数,比如--inspect表示打开调试

webpack中如何编写一个plugin的更多相关文章

  1. webpack编写一个plugin插件

    插件向第三方开发者提供了 webpack 引擎中完整的能力.使用阶段式的构建回调,开发者可以引入它们自己的行为到 webpack 构建流程中.创建插件比创建 loader 更加高级,因为你将需要理解一 ...

  2. webpack 中,loader、plugin 的区别

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

  3. 有多个正整数存放在数组中,编写一个函数要求偶数在左边由小到大顺序放置,奇数在右边,也是由小到大顺序放置,Java实现

    思路: * 1.首先分左右 * 2.分好再排序(左边和右边都单独排序) 第一步:分左右 可得注意了: 大体思路最先是从两头出发分成4种情况讨论(左or右,奇数or偶数)循环处理,出口是双层的嵌套循环( ...

  4. 实验9-1 编写一个存储过程proc_test_func

    在TestDB数据库中,编写一个存储过程proc_test_func,要求如下: 1)输入参数 一个整型的输入参数 @value 2)要求在一个select语句返回: @value的绝对值, 此绝对值 ...

  5. 如何编写一个WebPack的插件原理及实践

    _ 阅读目录 一:webpack插件的基本原理 二:理解 Compiler对象 和 Compilation 对象 三:插件中常用的API 四:编写插件实战 回到顶部 一:webpack插件的基本原理 ...

  6. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  7. Java基础-接口中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,

    36.中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产.请编写一个java应用程序描述上述的体制现象. 要求如下: (1)该应用程序中有一个“党中央”接口 ...

  8. 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...

  9. 在ubuntu linux 中编写一个自己的python脚本

    在ubuntu linux 中编写一个自己的简单的bash脚本. 实现功能:终端中输入简单的命令(以pmpy为例(play music python),为了区别之前说的bash脚本添加了py后缀),来 ...

随机推荐

  1. LODOP中设置设置图片平铺水印,超文本透明

    之前的博文:LODOP中平铺图片 文本项Repeat. 该博文中是平铺的图片,上面是文本.如果是图片add_print_image和add_print_text纯文本,这两个打印项设计的,可以直接通过 ...

  2. Data - 数据思维 - 下篇

    9 - 数据解读与表达 数据解读 数据解读需要选择一个基点.一个参照系,单独的一个数值往往不具备价值,它只是数字. 注意点: 关注异常值,并深究WHY? 相互验证.大胆假设.多方验证. 把握趋势或者规 ...

  3. 利用Nginx限制静态页面的访问权限(防盗链、禁止爬虫)

    1.限制爬虫配置 if ($http_user_agent ~* "spider|crapy|Sogou web spider|Baiduspider|Googlebot|Bingbot|3 ...

  4. 【神经网络与深度学习】【计算机视觉】RCNN- 将CNN引入目标检测的开山之作

    转自:https://zhuanlan.zhihu.com/p/23006190?refer=xiaoleimlnote 前面一直在写传统机器学习.从本篇开始写一写 深度学习的内容. 可能需要一定的神 ...

  5. 高级UI-沉浸式设计

    关于沉浸式设计,在国内指的是Toolbar和系统状态栏相统一,而谷歌官方给出的沉浸式则是指整个界面为UI所用,而这里所说的沉浸式则是指的前者,涉及4.4和5.0及以上,4.4以下的Android做不出 ...

  6. 使用派生镜像(qcow2)

    当创建的虚拟机越来越多,并且你发现好多虚拟机都是同一个操作系统,它们的区别就是安装的软件不大一样,那么你肯定会希望把他们公共的部分提取出来,只保存那些与公共部分不同的东西,这样镜像大小下去了,空间变多 ...

  7. P1993 小K的农场(差分约束)

    小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了 ...

  8. [转帖]MySQL语句大全

    MySQL语句大全 https://www.cnblogs.com/jicki/p/5548676.html 一.连接mysql. 格式: mysql -h主机地址 -u用户名 -p用户密码 二.修改 ...

  9. Spring之25:SingletonBeanRegistry&DefaultSingletonBeanRegistry

    此接口是针对Spring中的单例Bean设计的.提供了统一访问单例Bean的功能,BeanFactory可实现此接口以提供访问内部单例Bean的能力. //将对象(singletonObject)注册 ...

  10. MATLAB 求一个点周围 voronoi 边的顶点的坐标

    本代码在[MATLAB 2015b] 下编写运行成功,不保证所有版本适用. x=[0 -.5 1 1 -1]; y=[0 -1 -.5 1 1]; voronoi(x,y);axis([-2 2 -2 ...