javascript - Electron: Compartir archivo de constantes entre los procesos main/renderer con TypeScript
Electron con Typescript: Compartir un archivo constants.ts entre el proceso principal y el de renderizado.
Estructura de carpetas:
src/
principal
- principal.ts
renderizador
- renderer.ts
compartida
- constantes.ts
//constants.ts
export const constants= {
foo: '123'
bar: 'xyz'
}
//main.ts
import { constants} from '../shared/constants'
app.on("ready", async function () {
console.log(constants)
});
//renderer.ts
import { constants} from '../shared/constants'
console.log(constants)
IntelliSense lee/ve correctamente las constantes. y main.ts registra correctamente en la consola las constantes. Sin embargo, renderer.ts arroja un error: Uncaught Error: Cannot find module '../shared/constants' El archivo js de salida tiene exactamente la misma estructura que el código fuente, (dist/src/(main/shared/renderer)
Estoy utilizando la plantilla de inicio rápido de Electron con TypeScript: https://github.com/electron/electron-quick-start-typescript
Este es mi tsconfig
{
"compilerOptions": {
"module": "commonjs",
"noImplicitAny": true,
"sourceMap": true,
"outDir": "dist/src",
"baseUrl": ".",
"paths": {
"*": ["node_modules/*"]
}
},
"include": [
"src/**/*"
]
}
Una cosa a tener en cuenta es que estoy usando una versión antigua de Electron.
// versions
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.33.0",
"electron": "^12.0.0",
"eslint": "^7.32.0",
"typescript": "^4.7.2"
Encontré este proyecto que hace exactamente lo que quiero hacer con compartir un archivo de constantes entre ambos procesos, pero no logro replicarlo https://github.com/ci010/electron-vue-next
Yo estrictamente solo quiero compartir constantes, no variables/objetos mutables.
¿Alguna idea de qué estoy haciendo mal?
Respuesta #1
Encontré una solución simple aunque no elegante (porque en el lado del renderizador todas las constantes se colocan en el espacio de nombres global). Vea a continuación un ejemplo (todos los archivos en la misma carpeta):
const_shared.js
const APP_NAME = "Rocket Launcher";
// exports only if const_shared.js
// is required by 'main' process
if (typeof exports === 'object') {
exports.APP_NAME = APP_NAME
}
index.html
<script type="text/javascript"
src="const_shared.js"></script>
<script type="text/javascript"
src="renderer.js"></script>
renderer.js
// constant APP_NAME is in global
// namespace of 'renderer' process
// because of
// <script> with src=const_shared.js
console log(APP_NAME);
principal.js
// 'main' process
const { APP_NAME }
= require("const_shared.js");
console.log(APP_NAME);
