Estoy usando Quasar v2 para el desarrollo de mi aplicación Electron.
En esta versión, los módulos de nodos nativos ya no funcionarán en los procesos del renderizador.
Para evitar esto, existe electron-preload.js donde podemos acceder a estos métodos de nodo y exponerlos a las otras partes de la aplicación.
Así que hice esto para exponer fs :
import { contextBridge } from 'electron' contextBridge.exposeInMainWorld('electronFs', require('fs'))Luego, en mis archivos Vue/js:
const fs = window.electronFs || require('fs') fs.lstatSync(somePath).isFile() Pero luego fs.lstatSync(...).isFile is not a function . ¿Alguna idea de cómo puedo hacer que esto funcione?
Esto es solo para una aplicación local (sin conectividad web).
¡Gracias!
Eso sucede porque, en Electron, el backend y la interfaz de usuario no comparten el mismo proceso (se ejecutan en diferentes subprocesos) porque si permite exponer las API de nodos nativos en el contexto del usuario (la interfaz de usuario que finalmente se ejecuta en Chromium), significa que cada vez que se carga javascript externo, pueden acceder a todas esas API nativas en la computadora del usuario.
Entonces, esas variables se transportan de un hilo a otro usando IPC (Comunicación entre procesos), son solo datos, deben ser primitivos, si no, al final se serializan en primitivos (tipos de variables sin métodos u objetos como cadena, números, fechas u objetos como cadena o binario), por lo que probablemente para enviar esos objetos desde el contexto principal al contexto de la interfaz de usuario, Electron probablemente elimine todas las propiedades no serializables (por lo que no hay funciones).
No hagas eso, es extremadamente inseguro, solo mueve datos de un lado a otro, lo cual es muy similar a usar WebSockets.
De forma predeterminada, el proceso Main no comparte el mismo contexto que el de Renderer . Y Preload se ejecuta en un contexto de Renderer pero aislado. En lugar de exponer las API nativas de Nodejs a Renderer de manera insegura, incluso si está creando una aplicación local, aún puede usar IPC para exponer interfaces limitadas al proceso de Preload de Renderer , luego use contextBridge para exponer las API a Renderer . Aquí hay algunos fragmentos de demostración.
/* Main.js */ const fs = require('fs'); const {ipcMain} = require('electron'); ipcMain.handle('isFile', (path) => fs.lstatSync(path).isFile() ) /* Preload.js */ import {ipcRenderer, contextBridge} from "electron"; contextBridge.exposeInMainWorld('myAPIs', { isFile: (path) => ipcRenderer.invoke('isFile') } /* index.vue */ myAPIs.isFile('path-to-file');