Ghost fallback chunks / import: false behaviour with large transitive dep trees — Re.Pack MF
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 55/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- javascript, react, react-native, typescript
- Ambito
- build-system, mobile
Direzione di ricerca
Inizia con host/webpack.config.mjs, app1/webpack.config.mjs e app1/src/App.tsx, quindi riproduci il problema con i comandi bundle elencati. Ispeziona i file app1/build/ios/*.chunk.bundle generati e confronta i conteggi di grep e le dimensioni con i risultati previsti: moment non dovrebbe comparire nel chunk esposto, che dovrebbe rimanere di circa 50 KB.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Environment
Re.Pack: @callstack/repack 4.4.1
webpack: 5.107.2
Platform: Android
Description
I've been working through the optimal shared config for a production React Native app with Module Federation and have a few questions based on testing against your example at repack-examples/module-federation/app1/webpack.config.mjs.
Observation 1 : Official example only shares react + react-native, The example only declares react and react-native as shared. In a real app with large SDKs (tracking, UI component libraries, animation, totalling ~80 MB
bundled), should these also be declared as shared singletons? If not, are two instances of a tracking SDK acceptable in a host+remote setup?
Observation 2 : eager: STANDALONE produces ~78 MB ghost fallback chunks for large packages
When I apply eager: STANDALONE (i.e. eager: false in APK builds) to a package with a large transitive dep tree (e.g. @shared/trackingsdk, whose tree totals ~78 MB), webpack generates ghost fallback chunks of ~78 MB.
This happens even after declaring all of the package's direct deps as shared — the
bloat comes from deeper transitive deps not in the shared scope. I found that eager: true eliminates the ghost chunks (code goes into the container instead), but multiplies APK size when adding more remotes (each container duplicates the ~80 MB).
Observation 3 : import: false doesn't suppress transitive bundling, I tried { singleton: true, eager: false, import: false } to avoid both the ghost chunk and the container copy — expecting webpack to generate only a
consume-shared stub. The container correctly shrank to ~50 KB, but the exposed module chunk (App_SRP_js.chunk.bundle) absorbed the full ~79 MB dep tree instead. The bytes moved files, not disappeared.
Questions:
- Is import: false supported in Re.Pack's ModuleFederationPlugin? The behaviour differs from webpack 5's documented spec.
- For packages with large transitive dep trees, what is the recommended approach to avoid both ghost chunks AND container bloat when the host always provides these deps?
- The comment in your example says "to be figured out" on the eager: STANDALONE line : is there an updated recommendation for production setups?
Reproducible Demo
Base repo: callstack/repack-examples (module-federation example)
Branch to fork: main
Step 1 — Add moment as a test package moment is used as the probe, 392 KB bundled, easy to detect with grep, no native deps.
cd module-federation
yarn add moment
Step 2 — Modify host webpack config, In host/webpack.config.mjs, add moment to the shared config so the host provides it:
shared: {
react: { singleton: true, eager: true },
'react-native': { singleton: true, eager: true },
moment: { singleton: true, eager: true }, // ← add this
},
Step 3 — Modify app1 (remote) webpack config, In app1/webpack.config.mjs, add moment with import: false:
shared: {
react: { singleton: true, eager: STANDALONE },
'react-native': { singleton: true, eager: STANDALONE },
moment: { singleton: true, eager: false, import: false }, // ← add this
},
Step 4 — Import moment in the exposed component, In app1/src/App.tsx, add a direct import:
import moment from 'moment';
// use it anywhere so webpack doesn't tree-shake it
console.log(moment().format('YYYY'));
Step 5 — Build and inspect
Build host (provides moment to shared scope)
cd host && yarn bundle:ios # or android
Build remote
cd app1 && yarn bundle:ios
Step 6 — Check remote output
Should print 0 — moment must NOT be in the exposed chunk
grep -c "isMoment|_isUTC|proto.format" app1/build/ios/*.chunk.bundle
Check bundle sizes
ls -lh app1/build/ios/*.bundle
Expected result
grep output
0 ← moment is consumed from shared scope, not bundled
Exposed module chunk
app1_src_App_tsx.chunk.bundle ~50 KB (just App.tsx, no moment)
Actual result
grep output
14 ← moment IS in the exposed module chunk
Exposed module chunk
app1_src_App_tsx.chunk.bundle ~450 KB (App.tsx + full moment library)
With import: false, webpack 5 MF spec says no local fallback should be generated — the module is consumed exclusively from the shared scope. However, Re.Pack's ModuleFederationPlugin compiles the package into the exposed module chunk instead. The bytes change location but are never absent.
- Lingua principale
- Java
- Stelle
- 69
- Fork
- 23
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di callstack/repack-examples
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 25/100
callstack/repack-examples#12 · 2 commenti ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 25/100
callstack/repack-examples#11 · 1 commento · 1 reazione ·
-
question
Difficoltà 3/5 1-2 giorni Idoneità per principianti 25/100
callstack/repack-examples#10 · 4 commenti ·
-
Sharing module from host Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
callstack/repack-examples#7 · 4 commenti ·
Tutte le issue di callstack/repack-examples
Issue simili
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
apache/cloudstack#14222 ·
-
[BUG]茶杯方块在取茶时会引发崩溃 Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
-
Cannot differ own consent and managed consents in My Consents view and detailed consent view. Aperta1.0.0-alpha2 Type/Improvement
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
wso2/dpdp-accelerator#272 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
infinispan/infinispan#18150 ·
-
area/frontend
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100