You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中Vite构建JS文件为空及禁用指定文件压缩的方法

Laravel Vite打包问题:list.js/filter.js构建为空且需禁用压缩并加入manifest.json

问题详情

我正在构建Laravel应用,使用Vite打包4个.js文件,当前vite.config.js配置如下:

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            input: [
                'resources/css/app.css',
                'resources/sass/style.scss',
                
                'resources/js/app.js',
                'resources/js/clipboard.js',
                'resources/js/list.js',
                'resources/js/filter.js',
            ],
            refresh: true,
        }),
    ],
});

运行npm run build后,app.js和clipboard.js能正常构建压缩,但list.js和filter.js虽存在于/public/build/assets目录中,文件内容却为空。将list.js内容替换为clipboard.js的内容后能正常构建,说明问题出在list.js原代码,但该代码运行正常无报错。list.js原代码如下:

function articlesList(favourites, route)
{
    return {
        favourites: favourites,
        favourite: function (id) {
            const data = {
                item_id: id
            };

            axios
                .post(route, data)
                .then((r) => {
                    const id = r.data.id;
                    const action = r.data.action;

                    if (action === 'remove') {
                        let favourites = [];
                        for (const key in this.favourites) {
                            if (this.favourites[key] !== id) {
                                favourites.push(this.favourites[key]);
                            }
                        }

                        this.favourites = favourites;
                    } else if (action === 'add') {
                        this.favourites.push(id);
                    }
                }).catch((e) => {
                    console.log(e);
                });
        }
    };
}

核心需求:不让list.js和filter.js被压缩,只需将它们加入manifest.json,确保用户设备能正确更新,同时解决构建为空的问题。

解决方案

1. 解决构建为空的问题

构建后文件为空是因为Vite的tree-shaking机制剔除了未被引用的代码——你的articlesList函数仅被定义但未在任何地方被调用或导出。要避免这个情况,只需将函数挂载到全局对象或导出:
在list.js和filter.js的末尾添加:

// 将函数挂载到window,阻止tree-shaking
window.articlesList = articlesList;

或者使用ES模块导出:

export default articlesList;

2. 禁用指定文件的压缩

在Vite配置中通过build.rollupOptions精准控制指定文件不被压缩:
首先安装依赖:

npm install rollup-plugin-terser --save-dev

然后修改vite.config.js:

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import terser from 'rollup-plugin-terser';

export default defineConfig({
    plugins: [
        laravel({
            input: [
                'resources/css/app.css',
                'resources/sass/style.scss',
                'resources/js/app.js',
                'resources/js/clipboard.js',
                'resources/js/list.js',
                'resources/js/filter.js',
            ],
            refresh: true,
        }),
    ],
    build: {
        rollupOptions: {
            output: {
                plugins: [
                    terser({
                        // 排除list.js和filter.js不压缩
                        exclude: ['**/list.js', '**/filter.js']
                    })
                ]
            }
        }
    }
});

3. 确保文件加入manifest.json

只要vite.config.js的input数组中包含list.js和filter.js,Laravel Vite插件就会自动将它们加入manifest.json。解决tree-shake问题后,构建完成就能在manifest.json中看到对应的条目。

内容的提问来源于stack exchange,提问作者Andrey Zagoruyko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:35:33