简单webpack plugin 开发
重要是学习下怎么开发webpack plugin,同时记录下
插件模型
webpack 是一个插件,可以是javascript class ,或者具名 class
- 定义apply 方法
 - 指定一个绑定到webpack 自身的事件钩子
 - 使用webpack提供的plugin api 操作构建结果 
参考格式 
class MyExampleWebpackPlugin {
  // 定义 `apply` 方法
  apply(compiler) {
    // 指定要追加的事件钩子函数
    compiler.hooks.compile.tapAsync(
      'afterCompile',
      (compilation, callback) => {
        console.log('This is an example plugin!');
        console.log('Here’s the `compilation` object which represents a single build of assets:', compilation);
        // 使用 webpack 提供的 plugin API 操作构建结果
        compilation.addModule(/* ... */);
        callback();
      }
    );
  }
}
开发一个简单的plugin
项目使用lerna 进行包管理
- 项目结构
 
├── README.md
├── lerna.json
├── package.json
└── packages
    ├── app
    │ ├── README.md
    │ ├── file.js
    │ ├── lib
    │ │ └── app.js
    │ ├── package.json
    │ └── webpack.config.js
    └── console-webpack
        ├── README.md
        ├── lib
        │ └── console-webpack.js
        └── package.json
- 项目结构说明 
app/lib/app.js 
'use strict';
module.exports = app;
function app() {
    return {
        name:"dalongdemoapp",
        version:"firt",
        age:33
    }
}
app/lib/webpack.config.js
const path = require('path');
const console_webpack = require("console-webpack")
module.exports = {
  entry: './lib/app.js',
  output: {
    filename: 'my-first-webpack.bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  plugins: [
    // 使用插件
    new console_webpack({
      name:"dalong demo plugin",
      version: "v1.0.0"
    })
  ]
};
app/package.json
{
  "name": "app",
  "version": "0.0.0",
  "description": "demo webpack plugin",
  "author": "dalongrong <1141591465@qq.com>",
  "license": "ISC",
  "main": "lib/app.js",
  "directories": {
    "lib": "lib"
  },
  "files": [
    "lib"
  ],
  "publishConfig": {
    "registry": "https://registry.npm.taobao.org"
  },
  "scripts": {
    "build": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.29.3",
    "webpack-cli": "^3.2.3",
    "console-webpack":"0.0.0"
  }
}
- 插件代码 
packages/console-webpack/lib/console-webpack.js 
class HelloWorldPlugin {
  constructor(options) {
    this.options = options;
  }
  apply(compiler) {
    compiler.hooks.done.tap('HelloWorldPlugin', () => {
      console.log('Hello World!');
      console.log(this.options);
    });
  }
}
module.exports = HelloWorldPlugin;
lerna 项目创建步骤
- 初始化lerna 项目
 
lerna init
- 创建webpack plugin 插件package
 
lerna create console-webpack
按照提示操作即可,同时添加插件代码
- 创建app webpack 项目调用plugin
 
lerna create app
按照提示输入信息
- 添加lerna webpack plugin
 
cd packages/app
lerna add console-webpack // 会自动查找需要的包
使用插件
注意使用了lerna 自带的run 命令,很方便我们可以直接查找包里面包含需要的npm script
lerna run build // 根目录
说明
插件开发两个比较重要的东西compiler 和 compilation
compiler 对象代表了完整的 webpack 环境配置。这个对象在启动 webpack 时被一次性建立,并配置好所有可操作的设置,
包括 options,loader 和 plugin。当在 webpack 环境中应用一个插件时,插件将收到此 compiler 对象的引用。可以使用
compiler 来访问 webpack 的主环境。compilation 对象代表了一次资源版本构建。当运行 webpack 开发环境中间件时,每当检测到一个文件变化,就会创建一个
新的 compilation,从而生成一组新的编译资源。一个 compilation 对象表现了当前的模块资源、编译生成资源、变化的文件、以
及被跟踪依赖的状态信息。compilation 对象也提供了很多关键时机的回调,以供插件做自定义处理时选择使用。
参考资料
https://webpack.docschina.org/contribute/writing-a-plugin/ 
https://github.com/rongfengliang/webpack-plugin-demo
简单webpack plugin 开发的更多相关文章
- YYDS: Webpack Plugin开发
		
目录 导读 一.cdn常规使用 二.开发一个webpack plugin 三.cdn优化插件实现 1.创建一个具名 JavaScript 函数(使用ES6的class实现) 2.在它的原型上定义 ap ...
 - 简单 babel plugin 开发-使用lerna 工具
		
babel在现在的web 应用开发上具有很重要的作用,帮助我们做了好多事情,同时又有 比较多的babel plugin 可以解决我们实际开发上的问题. 以下只是学习下如果编写一个简单的babel pl ...
 - 如何开发webpack plugin
		
继上回介绍了如何开发webpack loader 之后.趁热打铁,来继续看下webpack另一个核心组成:plugin. 下面也和loader一样,让我们一起从基本的官方文档着手看起. loader和 ...
 - 揭秘webpack plugin
		
前言 Plugin(插件) 是 webpack 生态的的一个关键部分.它为社区提供了一种强大的方法来扩展 webpack 和开发 webpack 的编译过程.这篇文章将尝试探索 webpack plu ...
 - MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)
		
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
 - MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
		
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
 - Flutter Plugin开发流程
		
这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...
 - Xamarin+Prism开发详解七:Plugin开发与打包测试
		
有了上章[Xamarin+Prism开发详解六:DependencyService与IPlatformInitializer的关系]的基础,现在来理解Plugin开发就简单了. 本文实例代码地址:ht ...
 - QCAD Plugin 开发
		
QCAD Plugin 开发 eryar@163.com Abstract. QCAD是基于GPL协议的开源CAD软件,核心功能基于Qt使用C++开发,界面及其交互使用Javascript脚本进行开发 ...
 
随机推荐
- 关于js的对象原型继承(二)
			
本章讨论使用new一个构造函数来创建一个对象. 前期知识点说明: 1.prototype是函数的一个属性,每个函数都有一个prototype属性.这个属性是一个指针,指向一个对象.它是显示修改对象的原 ...
 - springMVC操作cookie和session
			
cookie相关说明: 1.cookie由服务器端创建,然后添加到HttpServletResponse中发送给客户端(浏览器). 2.可以添加多个cookie键值对. 3.cookie由键值名和键值 ...
 - Linux系统管理常用命令用法总结(2)
			
1.free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等. 语法:free [-bkmotV][-s <间隔秒数>] 参数说明: - ...
 - java中String的equals()和 ==
			
String a=new String("java"); String b=new String("java"); System.out.println(a.e ...
 - 查看电脑安装的JDK版本
			
1.输入java -d32 -version,若出现如下界面则是32位 2.java -d64 -version,因为是32位的,所以结果如下
 - Convert the AScii to SAC file
			
readtable *.txt w sac filename.sac ch delta dela0 w over
 - HTML5中的data-*属性和jQuery中的.data()方法使用
			
原文地址链接:http://blog.csdn.net/fly_zxy/article/details/50687691: HTML5中的data-*属性 我们往往会根据需要在HTML标记上添加自定义 ...
 - MVC扩展之HtmlHelper辅助方法
			
1.什么是HtmlHelper辅助方法?其实就是HtmlHelper类的扩展方法,如下所示: namespace System.Web.Mvc.Html { public static class F ...
 - git中工作区,缓存区,本地库,远程库的简要区别
			
git中工作区,缓存区,本地库,远程库的简要区别 实际上前三个名词对应到实体,都是你从远程仓库克隆下来的那个项目目录!只不过工作区就是你实际看到的目录和目录里的内容,当你修改/添加/删除了从远程仓库c ...
 - C# EditPlus环境设置
			
C# EditPlus环境设置 先要设置环境变量 5.0的 C:\Program Files\MSBuild\12.0\Bin 6.0的 C:\Windows\Microsoft.NET\Fra ...