Estou criando um aplicativo Electron para meu próprio propósito. Meu problema é que quando estou usando funções de nó dentro da minha página HTML, ocorre um erro de:
'require ()' não está definido.
Existe alguma maneira de usar as funcionalidades do Node em todas as minhas páginas HTML? Se for possível, dê-me um exemplo de como fazer isso ou forneça um link. Aqui estão as variáveis que estou tentando usar na minha página HTML:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
e esses são os valores que estou usando em todas as minhas janelas HTML no Electron.
javascript
html
node.js
electron
Mari Selvan
fonte
fonte
Respostas:
A partir da versão 5, o padrão para
nodeIntegration
mudou de verdadeiro para falso. Você pode ativá-lo ao criar a janela do navegador:fonte
nodeIntegration: true
é um risco de segurança apenas quando você está executando algum código remoto não confiável em seu aplicativo. Por exemplo, suponha que seu aplicativo abra uma página da web de terceiros. Isso seria um risco de segurança porque a página da Web de terceiros terá acesso ao tempo de execução do nó e pode executar algum código malicioso no sistema de arquivos do usuário. Nesse caso, faz sentido definirnodeIntegration: false
. Se seu aplicativo não estiver exibindo nenhum conteúdo remoto ou exibindo apenas conteúdo confiável, a configuraçãonodeIntegration: true
está correta.Por motivos de segurança, você deve manter
nodeIntegration: false
e usar um script de pré-carregamento para expor apenas o que você precisa da API Node / Electron para o processo de renderização (visualização) por meio da variável de janela. Dos documentos do Electron :Exemplo
main.js
preload.js
renderer.js
fonte
<script src="./renderer.js"></script>
Espero que esta resposta receba alguma atenção, porque a grande maioria das respostas aqui deixa grandes brechas de segurança em seu aplicativo de elétrons. Na verdade, essa resposta é essencialmente o que você deve fazer para usar
require()
em seus aplicativos de elétrons. (Existe apenas uma nova API de elétrons que o torna um pouco mais limpo na v7).Eu escrevi uma explicação / solução detalhada no github usando as apis de elétrons mais atuais de como você pode fazer
require()
algo, mas vou explicar brevemente aqui porque você deve seguir uma abordagem usando um script de pré-carregamento, contextBridge e ipc.O problema
Aplicativos de elétrons são ótimos porque podemos usar o node, mas esse poder é uma faca de dois gumes. Se não tomarmos cuidado, damos a alguém acesso ao node por meio de nosso aplicativo, e com o node um malfeitor pode corromper sua máquina ou deletar seus arquivos de sistema operacional (entre outras coisas, imagino).
Como é o problema?
Este problema se manifesta quando você (qualquer um dos abaixo):
nodeIntegration:true
ativadoremote
móduloTodos esses problemas dão acesso ininterrupto ao nó do seu processo de renderização. Se o seu processo de renderização for sequestrado, você pode considerar que tudo está perdido.
Qual é a nossa solução
A solução é não dar ao renderizador acesso direto ao nó (isto é
require()
), mas dar ao nosso processo principal de elétrons acessorequire
, e a qualquer momento que nosso processo renderizador precisar usarrequire
, empacotar uma solicitação para o processo principal.A maneira como isso funciona nas versões mais recentes (7 +) do Electron é no lado do renderizador que configuramos os vínculos ipcRenderer e, no lado principal, configuramos os vínculos ipcMain . Nas ligações ipcMain, configuramos métodos de escuta que usam módulos nós
require()
. Isso é bom e bom porque nosso processo principal poderequire
tudo o que quiser.Usamos o contextBridge para passar as ligações ipcRenderer para o código do nosso aplicativo (para usar) e, portanto, quando nosso aplicativo precisa usar os
require
módulos d no principal, ele envia uma mensagem via IPC (comunicação entre processos) e o processo principal é executado algum código e, em seguida, enviamos uma mensagem de volta com nosso resultado.Aproximadamente , aqui está o que você deseja fazer.
main.js
preload.js
index.html
aviso Legal
Sou o autor de
secure-electron-template
, um modelo seguro para construir aplicativos de elétrons. Preocupo-me com este tópico e venho trabalhando nisso há algumas semanas (neste momento).fonte
nodeIntegration
evita que o usuário acidentalmente ou propositalmente causem danos a si mesmo ao usar o aplicativo e é uma proteção extra no caso de algum malware ser anexado ao seu processo eletrônico e ser capaz de executar XSS sabendo que este vetor estava aberto (incrivelmente raro, mas é para lá que meu cérebro foi)!Você está usando
nodeIntegration: false
durante a inicialização do BrowserWindow? Em caso afirmativo, defina-o comotrue
(o valor padrão étrue
).E inclua seus scripts externos no HTML como este (não como
<script> src="./index.js" </script>
):fonte
var pdfjsLib = require('pdfjs-dist')
e usá-lo desta forma.require
vez de<script src="..."></script>
? Isso também tem uma questão sem resposta aqui .Em primeiro lugar, a solução @Sathiraumesh deixa seu aplicativo eletrônico com um grande problema de segurança. Imagine que seu aplicativo está adicionando alguns recursos extras
messenger.com
, por exemplo, o ícone da barra de ferramentas muda ou pisca quando você tem uma mensagem não lida. Portanto, em seumain.js
arquivo, você cria uma nova BrowserWindow assim (observe que escrevi messenger.com de forma incorreta intencionalmente):E se
messengre.com
for um site malicioso, que quer danificar o seu computador. Se você definir quenodeIntegration: true
este site tem acesso ao seu sistema de arquivos local e pode executar isto:E seu diretório inicial sumiu.
Solução
Exponha apenas o que você precisa, em vez de tudo. Isso é conseguido através do pré-carregamento do código javascript com
require
instruções.Agora o terrível
messengre.com
não pode excluir todo o seu sistema de arquivos.fonte
Finalmente, fiz funcionar. Adicione este código ao elemento de script do documento HTML.
Desculpe pelo atraso Reply.I uso o código abaixo para fazer isso.
E use em
nodeRequire
vez de usarrequire
.Funciona bem.
fonte
Você deve habilitar o nodeIntegration em webPreferences para usá-lo. ver abaixo,
Houve uma quebra de alterações da API no elétron 5.0 ( Anúncio no Repositório ). Em versões recentes nodeIntegration é, por padrão, definido como false .
Mas se você deseja manter a capacidade de usar APIs Node.js e Electron, é necessário renomear os símbolos na página antes de incluir outras bibliotecas:
fonte