Skip to content

[Bug]: output.iife: false option may result in duplicate inline data. #12212

@micooz

Description

@micooz

System Info

System:
OS: macOS 26.1
CPU: (12) arm64 Apple M4 Pro
Memory: 264.17 MB / 24.00 GB
Shell: 5.9 - /bin/zsh
Binaries:
Node: 22.18.0 - /Users/micooz/.local/state/fnm_multishells/67176_1763266678252/bin/node
Yarn: 1.22.22 - /opt/homebrew/bin/yarn
npm: 10.9.3 - /Users/micooz/.local/state/fnm_multishells/67176_1763266678252/bin/npm
pnpm: 10.20.0 - /opt/homebrew/bin/pnpm
Browsers:
Chrome: 142.0.7444.162
Safari: 26.1
npmPackages:
@rspack/cli: ^1.6.3 => 1.6.3

Details

output.iife: false 选项可能导致内联重复数据

Reproduce link

https://github.com/micooz/rspack-repro-12212

Reproduce Steps

package.json

{
  "dependencies": {
    "@rspack/cli": "^1.6.3"
  }
}

rspack.config.ts

import { defineConfig } from '@rspack/cli';

export default defineConfig({
  output: { iife: false },
});

源文件

// src/index.js
const SOME_BASE64_DATA = 'aiVBORw0KGgoA...';

atob(SOME_BASE64_DATA);
// atob(SOME_BASE64_DATA);

构建产物

var __webpack_modules__ = {},
  __webpack_module_cache__ = {};
function __webpack_require__(_) {
  var e = __webpack_module_cache__[_];
  if (void 0 !== e) return e.exports;
  var r = (__webpack_module_cache__[_] = { exports: {} });
  return __webpack_modules__[_](r, r.exports, __webpack_require__), r.exports;
}
(__webpack_require__.rv = () => '1.6.3'),
  (__webpack_require__.ruid = '[email protected]');
const SOME_BASE64_DATA = 'aiVBORw0KGgoA...';
atob('aiVBORw0KGgoA...');
//# sourceMappingURL=main.js.map

可以看到 SOME_BASE64_DATA 的值被内联到 atob 函数中,并且 SOME_BASE64_DATA 被保留且未被引用,出现了两份相同的数据。SOME_BASE64_DATA 的数据量可能很大,会对产物体积造成一定影响。

然而,如果设置 iife: true,或者再引用一次 SOME_BASE64_DATA,此问题会消失:

源文件

// src/index.js
const SOME_BASE64_DATA = 'aiVBORw0KGgoA...';

atob(SOME_BASE64_DATA);
atob(SOME_BASE64_DATA); // 再引用一次

构建产物

var __webpack_modules__ = {},
  __webpack_module_cache__ = {};
function __webpack_require__(_) {
  var e = __webpack_module_cache__[_];
  if (void 0 !== e) return e.exports;
  var r = (__webpack_module_cache__[_] = { exports: {} });
  return __webpack_modules__[_](r, r.exports, __webpack_require__), r.exports;
}
(__webpack_require__.rv = () => '1.6.3'),
  (__webpack_require__.ruid = '[email protected]');
const SOME_BASE64_DATA = 'aiVBORw0KGgoA...';
atob(SOME_BASE64_DATA), atob(SOME_BASE64_DATA);
//# sourceMappingURL=main.js.map

这个行为非常令人困惑,是 by design 还是 bug 呢,希望得到解答。

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions