自定义删除无依赖文件的webpack插件

插件原理

通过自定义webpack插件,利用执行完成编译的封存阶段后,产生的产物module.fileDependencies,生成依赖的文件组。通过读文件的方式,将待扫描的文件组和有依赖关系的文件进行对比。最终暴露出项目中,不存在依赖关系的文件,并可配置将其全部删除。

代码实现

1、自定义webpack插件,配置options。遍历stats.compilation.fileDependencies,存储依赖文件。
const fs = require('fs');
const path = require('path');class UnDependencClearPlugin {constructor(options = {}) {this.options = options;this.entry = options.entry || 'src'; // 入口this.include = options.include || ''; // 包含哪些文件'.vue|.js'this.exclude = options.exclude || ''; // 排除哪些文件夹 ['src/assets', 'src/views']this.isDelete = options.isDelete || false; // 是否主动删除文件this.originFile = []; // node读取的源文件目录 处理过include及exclude 后的数据 最全的数据this.dependenciesFile = []; // webpack依赖数据 处理过include及exclude 后的数据 依赖数据this.noUseFile = []; // 可删除的数据this.init(); // 初始化}apply(compiler) {compiler.hooks.done.tapAsync('UnDependencClearPlugin', (stats, cb) => {// 获取依赖let curFile = [];stats.compilation.fileDependencies.forEach((item) => {curFile.push(item);});// 排除node_modules和entrycurFile = curFile.filter((item) => {if (item.indexOf('node_modules') == -1 &&item.indexOf(this.resolve(this.entry)) > -1) {return item;}});// 处理includeconst includeFile = this.includeHandle(curFile);// 处理excludeconst excludeFile = this.excludeHandle(includeFile);this.dependenciesFile = excludeFile;// 从 originFile 及 dependenciesFile分析出未被使用的数据this.originFile.forEach((item) => {if (this.dependenciesFile.findIndex((el) => el == item) == -1) {this.noUseFile.push(item);}});// 处理资源 写入文件this.writeDirPathHandle();cb();});}// 初始化init() {}// 处理规则includeHandle(list) {return filterFile;}// 处理规则excludeHandle(list) {return filterFile;}// 写入文件writeDirPathHandle() {}// 删除文件deleteFileHandle() {}
}
module.exports = UnDependencClearPlugin;
2、通过配置的include文件类型,使用includeHandle方法进行文件类型筛选,
  // 处理规则includeHandle(list) {if (!this.include) {return list;}// 指定类型的文件const includeArr = this.include.split('|');const filterFile = list.filter((item) => {const index = includeArr.findIndex((el) => item.indexOf(el) > -1);if (index > -1) {return item;}});return filterFile;}
3、配置过滤规则
 // 处理规则excludeHandle(list) {if (!this.exclude) {return list;}// 过滤指定文件夹const excludeList = [];this.exclude.forEach((item) => {excludeList.push(this.resolve(item));});const filterFile = list.filter((item) => {const index = excludeList.findIndex((el) => item.indexOf(el) > -1);if (index == -1) {return item;}});return filterFile;}
4、将产物写入文件,用户可清晰看见被扫描的所有文件、存在依赖的文件、无用文件
  // 写入文件writeDirPathHandle() {let content = `所有文件-length[${this.originFile.length}]、依赖文件-length[${this.dependenciesFile.length}]、无用文件-length[${this.noUseFile.length}]`;content += `\r\n###所有文件-length[${this.originFile.length}]###\r\n${this.originFile.join('\n')}\r\n`;content += `\r\n###依赖文件-length[${this.dependenciesFile.length}]###\r\n${this.dependenciesFile.join('\n')}\r\n`;content += `\r\n###无用文件-length[${this.noUseFile.length}]####\r\n${this.noUseFile.join('\n')}\r\n`;fs.writeFile('dependency.txt', content, (err) => {if (err) {console.error(err);return;}// 判断是否执行删除if (this.isDelete) {this.deleteFileHandle();}});}
5、使用时,配置开关isDelete,开启后可自动删除无用文件
// 删除文件deleteFileHandle() {this.noUseFile.forEach((item) => {fs.unlink(item, (err) => {if (err) throw err;});});}

使用方法

1、在项目中添加undependencClearPlugin.js文件

2、在webpack.config.js文件中配置plugin

const undependencClearPlugin = require('./undependencClearPlugin');isEnvDevelopment &&new undependencClearPlugin({entry: '/src',include: '.js|.vue|.jpg',exclude: ['./node_modules'],isDelete: false,}),

3、对于想主动清理代码这个场景,只需在菜单中删除或注释菜单的引用文件

//路由
component: () => import('@/xxx/xxx/xxx.vue')
//或者
require(['./xxx/xxx.vue'], resolve)
// 或者引入的文件import xxx from './xxx/xxx/xxx'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios 之 数据库、地理位置、应用内跳转、推送、制作静态库、CoreData

第一节:数据库 常见的API SQLite提供了一系列的API函数,用于执行各种数据库相关的操作。以下是一些常用的SQLite API函数及其简要说明:1. sqlite3_initialize:- 初始化SQLite库。通常在开始使用SQLite之前调用,但如果没有调用&a…

“京东”数据包暴雷——李逵还是李鬼?

大家好,我是吴军,一家软件技术开发公司的产品经理。 前几个月市面上出现了一个京东数据包的项目,乍一听还蛮正规的,强子不卖货,去做数据服务了?他究竟是怎么一个盈利方式?到底是李逵还是李鬼&a…

【新资讯】《网络安全事件报告管理办法(征求意见稿)》正在公开征求意见

近年来网络安全事故频发,造成了不少损失和危害。为了减少网络安全事故的发生,规范网络安全事件的报告,国家互联网信息办公室根据《中华人民共和国网络安全法》等法律法规起草了《网络安全事件报告管理办法(征求意见稿)…

释放创意,点亮视频!红巨星Magic Bullet Looks带给您绚丽的色彩魔法

Red Giant Magic Bullet Looks 是一款适用于Mac的视频后期处理软件。它是由Red Giant公司开发的一款专业级颜色校正和调色工具,旨在帮助电影制作人、视频编辑和摄影师实现令人惊叹的视觉效果。 Magic Bullet Looks 提供了一个直观而强大的用户界面,使用…

Linux操作系统(Crontab计划任务+NTP时间同步服务器)

如何修改linux系统时间 与时间相关的命令,查看当前的时间 运行 date 即可 cal 查看当前月份的日历 运行 timedatectl 查看时间详细参数 ( NTP: network time protocol 网络时间协议 ) ( local time : 本地时间 &#x…

volatile关键字详解

volatile 关键字详解 介绍 Java中的volatile关键字是一个用于确保变量在多线程环境下的可见性和部分有序性的修饰符。当一个字段被声明为volatile时,它具有以下特性: 可见性:在多线程环境中,一个线程修改了一个volatile变量的值…

采用curl -w测试接口或域名访问速度

命令: curl -o /dev/null -H "Cache-Control: no-cache" -s -w time_namelookup:"\t"%{time_namelookup}"\n"time_connect:"\t\t"%{time_connect}"\n"time_pretransfer:"\t"%{time_pretransfer}&quo…

BP算法与淋浴器的温度调节

BP算法(反向传播算法)是一种用于神经网络训练的基本算法。它通过逐层迭代地调整神经网络的权重和偏置,以使网络的输出尽可能接近期望的输出。BP算法之所以能够训练神经网络,是因为它基于梯度下降的思想,通过最小化损失…

大创项目推荐 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 …

11-网络安全框架及模型-软件安全能力成熟度模型(SSCMM)

目录 软件安全能力成熟度模型 1 背景概述 2 主要内容 3 成熟度等级定义 4 关键过程和实践 5 评估方法 6 改进建议 7 持续改进 8 主要价值 9 应用场景 10 优势和局限性 备注 软件安全能力成熟度模型 1 背景概述 SSCMM模型是软件安全能力成熟度模型,它描…

智能优化算法应用:基于鱼鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于鱼鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鱼鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鱼鹰算法4.实验参数设定5.算法结果6.参考文献7.MA…

6、IDEA集成GitHub/码云

这里写目录标题 1、设置GitHub账号2、分享工程到GitHub3、Push推送本地库到远程库4、Pull拉取远程库到本地库5、Clone克隆远程库到本地6、码云简介 1、设置GitHub账号 可以采用两种登录方式:账户密码登入、口令登入。 2、分享工程到GitHub 先在GitHub中创建一个远…

【Hive_05】企业调优1(资源配置、explain、join优化)

1、 计算资源配置1.1 Yarn资源配置1.2 MapReduce资源配置 2、 Explain查看执行计划(重点)2.1 Explain执行计划概述2.2 基本语法2.3 案例实操 3、分组聚合优化3.1 优化说明(1)map-side 聚合相关的参数 3.2 优化案例 4、join优化4.1…

ARCGIS PRO SDK GeometryEngine处理独立几何图形的函数

1、面积类:pol为Polygon 1).Area:获取几何图形的面积。这是使用二维笛卡尔数学来计算面积的平面测量 double d GeometryEngine.Instance.Area(pol) 2).GeodesicArea:获取几何图形的椭球面积 …

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…

Python测试框架pytest核心库pluggy详解

代码案例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 import pluggy # HookspecMarker 和 HookimplMarker 实质上是一个装饰器带参数的装饰器类,作用是给函数增加额外的…

Django查询每月的最后一条数据

查询每月的最后一条数据 在这个示例中,我们将演示如何使用Django查询Book数据表中姓名为"张三"的每月的最后一条数据。 数据模型 首先,我们定义了一个Book模型,具有以下字段: from django.db import modelsclass Bo…

【vue滚动条插件vuescroll】【vue自定义滚动条】

文章目录 前言一、使用步骤1.下载2.引入库三、在组件中如何使用?四、跳转到顶部的方法scrollTo() 五、效果总结 前言 由于浏览器自带的滚动条比较不符合设计图,所以在大部分项目中,我们都会自定义滚动条的样式,来还原设计图&…

策略模式(组件协作)

策略模式(组件协作) 链接:策略模式实例代码 注解 目的 正常情况下,一个类/对象中会包含其所有可能会使用的内外方法,但是一般情况下,这些常使用的类都是由不同的父类继承、组合得来的,来实现…

鸿蒙项目二—— 注册和登录

此部分和上篇文章是连续剧 ,如果需要,请查看 一、注册 import http from ohos.net.http; Entry Component struct Reg {// 定义数据:State username: string "";State userpass: string "";State userpass2: string …