fix(cli): export ZenModulesClient component from client manifest to ensure side-effects execute in browser
- update `renderClientManifest` to export a `ZenModulesClient` React component instead of `export {}`
- update docs to explain why rendering the component is required under Next.js 15+/Turbopack and add usage example in `app/layout.js`
This commit is contained in:
+17
-11
@@ -60,10 +60,14 @@ function renderServerManifest(names) {
|
||||
}
|
||||
|
||||
function renderClientManifest(clientNames) {
|
||||
// Doit être un Client Component pour que les side-effects (registerPage, etc.)
|
||||
// s\'exécutent dans le bundle browser au moment de l\'hydratation. app/layout.js
|
||||
// (Server Component) importe ce fichier ; Next.js bascule sur le bundle client
|
||||
// et exécute les imports `@zen/module-X/client` lors du chargement de la page.
|
||||
// Exporte un Component React `ZenModulesClient` que le layout consommateur doit
|
||||
// RENDRE dans son tree (`<ZenModulesClient />`). C'est le seul moyen fiable
|
||||
// sous Next.js 15+/Turbopack pour garantir que les side-effects top-level
|
||||
// (registerPage, registerWidget) s'exécutent côté browser. Un simple
|
||||
// `import './.zen/modules.client.js'` dans un Server Component met bien le
|
||||
// fichier dans le bundle client mais n'en exécute jamais le code top-level
|
||||
// — la transformation 'use client' s'applique aux Components, pas aux
|
||||
// side-effect imports orphelins.
|
||||
//
|
||||
// Importe `@zen/module-X/client` (sous-entrée 'use client') et NON le main
|
||||
// entry du module — le main entry tire createTables/registerApiRoutes/etc.
|
||||
@@ -74,15 +78,17 @@ function renderClientManifest(clientNames) {
|
||||
'',
|
||||
].join('\n');
|
||||
|
||||
if (clientNames.length === 0) {
|
||||
return header + '\nexport {};\n';
|
||||
}
|
||||
const body = [
|
||||
'export default function ZenModulesClient() {',
|
||||
' return null;',
|
||||
'}',
|
||||
'',
|
||||
].join('\n');
|
||||
|
||||
const imports = clientNames
|
||||
.map(name => `import '${name}/client';`)
|
||||
.join('\n');
|
||||
if (clientNames.length === 0) return header + '\n' + body;
|
||||
|
||||
return [header, imports, '', 'export {};', ''].join('\n');
|
||||
const imports = clientNames.map(name => `import '${name}/client';`).join('\n');
|
||||
return [header, imports, '', body].join('\n');
|
||||
}
|
||||
|
||||
async function readIfExists(path) {
|
||||
|
||||
Reference in New Issue
Block a user