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

如何配置Rollup让动态导入指向.gz.js文件而非.js文件?

Rollup打包ES模块:让import指向.gz.js文件的解决方案

核心问题

当前配置会同时生成未压缩的.js和压缩后的.gz.js文件,但Rollup默认生成的import语句仍指向原.js文件,需要调整配置或通过插件修改引用路径。

具体解决方法

方法1:直接修改输出文件名规则(无需保留原.js文件)

如果不需要保留未压缩的.js文件,可以让Rollup直接生成带.gz.js后缀的主文件,这样import语句会自动指向正确路径:

output: {
    format: 'es',
    dir: `dist`,
    sourcemap: true,
    entryFileNames: '[name].gz.js',
    chunkFileNames: '[name]-[hash].gz.js'
},

此时gzip插件只需正常压缩生成对应文件即可,若不需要原.js文件,也可按需调整插件逻辑。

方法2:用替换插件批量修改import路径

使用@rollup/plugin-replace替换输出文件中所有import语句的.js后缀为.gz.js:

  1. 安装插件:
npm install @rollup/plugin-replace --save-dev
  1. 修改Rollup配置:
import replace from '@rollup/plugin-replace';

plugins: [
    // 其他已有插件...
    replace({
        preventAssignment: true,
        include: 'dist/**/*.js',
        values: {
            '.js': '.gz.js'
        }
    }),
    gzipPlugin({
        fileName: (fileName) => {
            const name = fileName.split('.');
            name.splice(-1, 0, 'gz');
            return name.join('.');
        },
    })
]

该插件会在打包阶段自动替换所有匹配的.js后缀,无论chunk是否带哈希值都能生效。

方法3:自定义插件灵活修改引用路径

如果替换插件的规则不够灵活,可编写自定义插件在bundle生成阶段修改代码:

const modifyImportsPlugin = () => ({
    name: 'modify-imports',
    generateBundle(options, bundle) {
        for (const fileName in bundle) {
            const chunk = bundle[fileName];
            if (chunk.type === 'chunk') {
                // 替换所有import语句中的.js为.gz.js
                chunk.code = chunk.code.replace(/from ['"](.*)\.js['"]/g, 'from "$1.gz.js"');
                // 若不需要sourcemap,可删除以下代码;若需要,建议让Rollup重新生成sourcemap
                if (chunk.map) delete chunk.map;
            }
        }
    }
});

// 在插件列表中添加该自定义插件
plugins: [
    // 其他已有插件...
    modifyImportsPlugin(),
    gzipPlugin({
        fileName: (fileName) => {
            const name = fileName.split('.');
            name.splice(-1, 0, 'gz');
            return name.join('.');
        },
    })
]

这个插件会遍历所有输出chunk,精准替换import语句中的文件后缀。

额外提示

如果需要同时保留.js和.gz.js文件供不同环境使用,更推荐通过服务器配置实现自动分发(比如Nginx的gzip_static模块),当客户端支持gzip时自动返回.gz.js,无需修改Rollup的import路径,这样更符合前端资源分发的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:23:25