vue2,webpack 老项目清除无用的文件

清理无用文件肝的眼睛冒金星,不妨来试试webpack插件。

原理就是获取指定目录的全部文件,排除代码依赖的文件,就是不依赖的文件,也就是无用的文件,使用shelljs删除文件

插件仅限在webpack3、webpack4下使用

插件使用

javascript 复制代码
const UnusedFilesWebpackPlugin = require('./unused-files-webpack-plugin')

plugins: [
//...其他插件
    new UnusedFilesWebpackPlugin({
        root: './src', // 项目目录
        output: './unused-files.json', // 输出文件列表
        clean: true, // 是否删除文件,true,删除;false,不删除
        exclude: ['src/assets/font', 'src/assets/icon-font'], // 排除文件列表

    })
]

插件源码

ini 复制代码
const fs = require("fs");
const glob = require("glob");
const path = require("path");
const shelljs = require("shelljs");

class CleanUnusedFilesPlugin {
    constructor(options) {
        this.opts = options;
    }
    apply(compiler) {
        let _this = this;
        compiler.plugin("after-emit", function(compilation, done) {
            _this.findUnusedFiles(compilation, _this.opts);
            done();
        });
    }

    /**
     * 获取依赖的文件
     */
    getDependFiles(compilation) {
        return new Promise((resolve, reject) => {
            const dependedFiles = [...compilation.fileDependencies].reduce(
                (acc, usedFilepath) => {
                    if (!~usedFilepath.indexOf("node_modules")) {
                        acc.push(usedFilepath);
                    }
                    return acc;
                },
                []
            );
            resolve(dependedFiles);
        });
    }

    /**
     * 获取项目目录所有的文件
     */
    getAllFiles(pattern) {
        return new Promise((resolve, reject) => {
            glob(
                pattern,
                {
                    nodir: true
                },
                (err, files) => {
                    if (err) {
                        throw err;
                    }
                    const out = files.map(item => path.resolve(item));
                    resolve(out);
                }
            );
        });
    }

    dealExclude(path, unusedList) {
        let exclude = [];
        if (Array.isArray(path)) {
            // 兼容传入的是数组路径
            exclude = path;
        } else if (typeof path == "string") {
            try {
                // 读取文件里的数组字符串
                const file = fs.readFileSync(path, "utf-8");
                exclude = JSON.parse(file) || [];
            } catch (error) {
                console.log(error);
            }
        }
        console.log(exclude, "exclude");
        if (process.platform == "win32") {
            // windows 需要兼容路径 D:\\workspace\\src\\App.vue
            unusedList = unusedList.map(item => item.replace(/\\/g, "/"));
        }
        let result = unusedList.filter(unused => {
            return !exclude.some(item => ~unused.indexOf(item));
        });
        return result;
    }

    async findUnusedFiles(compilation, config = {}) {
        const {
            root = "./src",
            output = "./unused-files.json",
            clean = false,
            exclude = false
        } = config;
        const pattern = root + "/**/*";
        try {
            const allChunks = await this.getDependFiles(compilation);
            const allFiles = await this.getAllFiles(pattern);
            let unUsed = allFiles.filter(item => !~allChunks.indexOf(item));
            if (exclude) {
                unUsed = this.dealExclude(exclude, unUsed);
            }
            if (typeof output === "string") {
                fs.writeFileSync(output, JSON.stringify(unUsed, null, 4));
            } else if (typeof output === "function") {
                output(unUsed);
            }
            if (clean) {
                unUsed.forEach(file => {
                    shelljs.rm(file);
                    console.log(`remove file: ${file}`);
                });
            }
            return unUsed;
        } catch (err) {
            throw err;
        }
    }
}

module.exports = CleanUnusedFilesPlugin;
相关推荐
万少6 小时前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
橙序员小站8 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名10 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫11 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊11 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter11 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折11 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_11 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial11 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu12 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端