背景

  1. webpack的使用中我们会遇到各种各样的插件、loader。
  2. webpack的功力主要体现在能理解各个插件、loader的数量上。理解的越多功力越深

开始

https://webpack.docschina.org/api/compilation-hooks/

https://webpack.docschina.org/api/compiler-hooks/

http://www.icodebang.com/article/232889

  1. 开发一个自定义的插件HelloWordPlugin
//HelloWordPlugin.js
const { Compilation } = require("webpack");
class HelloWorldPlugin {
constructor() {}
apply(compiler) {
console.log(compiler);
let outputFileName = compiler.options.output.filename
compiler.hooks.thisCompilation.tap("HelloWorldPlugin", (compilation) => {
console.log(compilation);
// debugger compilation.hooks.processAssets.tap(
{
name: "HelloWorldPlugin",
stage: Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING,
additionalAssets: true,
},
(assets) => {
assets[outputFileName]._source._children.forEach((item, i) => {
if (
typeof item === "string" &&
item.indexOf("var __webpack_exports__") === 0
) {
assets[outputFileName]._source._children[i] = item +=
"var HelloInjectCode = {}; \n";
}
});
}
);
});
}
}
module.exports = HelloWorldPlugin;

//测试主文件,主要加载创建webpack 配置、实例、执行

//index.js
const webpack = require("webpack");
const path = require("path");
const HelloWorldPlugin = require("./HelloWorldPlugin");
const config = {
context: path.resolve(__dirname),
mode: "production",
optimization: {
minimize: false,
},
entry: "./main.js",
target: ["web", "es5"],
output: {
filename: "bundle.js",
path: path.resolve(__dirname,"dist"),
},
plugins: [new HelloWorldPlugin()],
}; const compiler = webpack(config);
compiler.run((err, stats) => {
console.log(err);
console.log(
stats.toJson({
files: true,
assets: true,
chunk: true,
module: true,
entries: true,
})
);
});
  1. 两个项目文件,基本还是之前的例子
//main.js
import { max, PI1,PI3 } from "../webpack-modules/index";
!(function () {
console.log(max(1, 2), PI1,PI3);
})();
//../webpack-modules/index
let PI1 = 3.1415926;
let PI2 = 3.1415926; function max(a, b) {
return a > b ? a : b;
}
console.log(PI2);
export { max, PI1 };
  1. 生成的文件
//dist/bundle.js
/******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
var __webpack_exports__ = {};
var HelloInjectCode = {}; // NAMESPACE OBJECT: ../webpack-modules/index.js
var webpack_modules_namespaceObject = {};
__webpack_require__.r(webpack_modules_namespaceObject);
__webpack_require__.d(webpack_modules_namespaceObject, {
"X": function() { return PI1; },
"F": function() { return max; }
}); ;// CONCATENATED MODULE: ../webpack-modules/index.js
let PI1 = 3.1415926;
let PI2 = 3.1415926; function max(a, b) {
return a > b ? a : b;
}
console.log(PI2); ;// CONCATENATED MODULE: ./main.js !(function () {
console.log(max(1, 2), PI1,webpack_modules_namespaceObject.PI3);
})(); /******/ })()
;

总结

  1. 使用compilation.hooks.processAssets可以处理生成的资源
  2. 多看文档
  3. 开发插件,相当于是开发一个nodejs的工程,文件入口(测试验证用)可以直接使用webpackAPI ,参考index.js
  4. compiler更多面向编译配置,compilation更多面向编译是的资源,更多体现在watch上,每次watch或生成一个compilation
  5. 该插件向入口代码中插入了自定义的代码。一行helloworld,千言万语尽在不言中

【前端必会】webpack 插件,前进路绕不过的障碍的更多相关文章

  1. 【前端必会】不知道webpack插件? webpack插件源码分析BannerPlugin

    背景 不知道webpack插件是怎么回事,除了官方的文档外,还有一个很直观的方式,就是看源码. 看源码是一个挖宝的行动,也是一次冒险,我们可以找一些代码量不是很大的源码 比如webpack插件,我们就 ...

  2. 大前端工程化之写一个简单的webpack插件

    今天写一个简单的webpack插件,来学习一下webpack插件 webpack插件机制可以使开发者在webpack构建过程中加入自己的行为,来针对自己项目中的一些需求做一些定制化 首先我们得知道一个 ...

  3. 前端必学内容:webpack3快速入门 1-23节内容参考

    前端必学内容:webpack(模块打包器) webpack3 学习内容,点击即可到达 (1).webpack快速入门——如何安装webpack及注意事项 (2).webpack快速入门——webpac ...

  4. 高性能流媒体服务器EasyDSS前端重构(三)- webpack + vue + AdminLTE 多页面引入 element-ui

    接上篇 接上篇<高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间> 本文围绕着实现EasyDSS高性能流 ...

  5. 【Web】阿里icon图标webpack插件(webpack-qc-iconfont-plugin)详解

    webpack-qc-iconfont-plugin webpack-qc-iconfont-plugin是一个webpack插件,可以轻松地帮你将阿里icon的图标项目下载至本地 开发初衷 之前已经 ...

  6. 【前端构建】WebPack实例与前端性能优化

    计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几 ...

  7. 前端模块化工具-webpack

    详解前端模块化工具-webpack webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不 ...

  8. Sublime Text 3前端开发常用优秀插件介绍

    . 首页 博客园 联系我 前言:关于Sublime Text 3. Package Control插件管理. Package Control使用方法/安装Emmet插件. Emmet插件. JsFor ...

  9. 探寻 webpack 插件机制

    webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...

随机推荐

  1. LAMP架构部署及配置

    httpd编译安装 1.关闭防火墙,将安装Apache所需软件包传到/opt目录下 systemctl stop firewalld systemctl disable firewalld seten ...

  2. 大数据--Hive的安装以及三种交互方式

    1.3 Hive的安装(前提是:mysql和hadoop必须已经成功启动了) 在之前博客中我有记录安装JDK和Hadoop和Mysql的过程,如果还没有安装,请先进行安装配置好,对应的随笔我也提供了百 ...

  3. django项目、vue项目部署云服务器

    目录 上线架构图 服务器购买与远程连接 安装git 安装mysql 安装redis(源码安装) 安装python3.8(源码安装) 安装uwsgi 安装虚拟环境 安装nginx(源码安装) vue项目 ...

  4. Linux(Centos7) 实例搭建 FTP 服务

    本文以 CentOS 7.2 64位系统为例,使用 vsftpd 作为 FTP 服务端,FileZilla 作为客户端.指导您如何在 Linux 云服务器上搭建 FTP 服务. 操作步骤 安装 vsf ...

  5. 在docker容器中如何自动生成配置文件(以nginx配置为例)

    应用场景类似于多个域名要起多个容器,有些参数有些域名需要,有些域名不需要,或者参数的值不太一样,需要去对应的配置文件修改,不太灵活,如果通过变量的方式直接定义在Dockerfile文件中,需要哪些参数 ...

  6. word count的reduce过程以及项目打包部署

    map过程已经写完了,上面那个流程我们涉及到了泛型以及序列化,我们要知道每个参数代表的含义,这样有助于我们理解整个流程. 下面我们开始reduce,这个过程我们要把map输出的键值对把key值相同的放 ...

  7. LeetCode题解-20.有效的括号

    题目 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 示例 ...

  8. ERROR: null value in column "name" of relation "res_company" violates not-null constraint

    1 # 创建res.company公司信息的时候,发现它执行了两次create()方法,并且第二次调用create,传了一个[{}]做为参数 2 # 原因是,你创建res.company的时候并没有指 ...

  9. 从函数计算到 Serverless 架构

    前言 随着 Serverless 架构的不断发展,各云厂商和开源社区都已经在布局 Serverless 领域,一方面表现在云厂商推出传统服务/业务的 Serverless 化版本,或者 Serverl ...

  10. HCIA-Datacom 3.4 实验四:实现VLAN间通信实验

    实验介绍: 划分VLAN后,不同VLAN的用户间不能二层互访,这样能起到隔离广播的作用.但实际应用中,不同VLAN的用户又常有互访的需求,此时就需要实现不同VLAN的用户互访,简称VLAN间互访.华为 ...