Empacotamento da aplicação
Para proteger os recursos e o código fonte da sua aplicação você pode optar por empacotar a sua aplicação em um arquivo asar, isto é possível com poucas alterações em seu código.
Gerando um arquivo asar
Um arquivo [asar][asar] é um formato parecido com tar ou zip bem simples que concatena arquivos em um único arquivo. O Electron pode ler arquivos arbitrários a partir dele sem descompacatar o arquivo inteiro.
Passos para empacotar a sua aplicação em um arquivo asar
:
1. Instale o utilitário asar
$ npm install -g asar
2. Empacote a sua aplicação
$ asar pack your-app app.asar
Usando arquivos asar
No Electron existem dois conjuntos de APIs: Node APIs fornecidas pelo Node.js e Web
APIs fornecidas pelo Chromium. Ambas as APIs suportam a leitura de arquivos asar
.
Node API
As API's do Node como fs.readFile
e require
tratam os pacotes asar
como diretórios virtuais e os arquivos dentro dele como arquivos normais.
Por exemplo, temos um arquivo example.asar
sob /path/to
:
$ asar list /path/to/example.asar
/app.js
/file.txt
/dir/module.js
/static/index.html
/static/main.css
/static/jquery.min.js
Lendo um arquivo em pacote asar
:
var fs = require('fs');
fs.readFileSync('/path/to/example.asar/file.txt');
Listando todos os arquivos a partir da raiz:
var fs = require('fs');
fs.readdirSync('/path/to/example.asar');
Utilizando um módulo dentro do pacote asar
:
require('/path/to/example.asar/dir/module.js');
Você também pode renderizar uma página web apartir de um arquivo asar
utilizando o módulo BrowserWindow
:
var BrowserWindow = require('browser-window');
var win = new BrowserWindow({width: 800, height: 600});
win.loadURL('file:///path/to/example.asar/static/index.html');
API Web
Em uma página web, arquivos em um pacote asar
pode ser solicitado com o protocolo file:
.
Como a API Node, arquivos asar
são tratadas como diretórios.
Por exemplo, para obter um arquivo com $ .get
:
<script>
var $ = require('./jquery.min.js');
$.get('file:///path/to/example.asar/file.txt', function(data) {
console.log(data);
});
</script>
Tratando um pacote asar
como um arquivo normal
Para alguns casos, precisamos verificar o checksum de um pacote asar
, para fazer isto, precisamos ler
o arquivo asar
como um arquivo normal. Para isto, você pode usar o built-in
original-fs
que fornece a API fs
, sem apoio a arquivos asar`:
var originalFs = require('original-fs');
originalFs.readFileSync('/path/to/example.asar');
Limitaçõs na API Node
Mesmo fazendo grandes esforços para pacotes asar
ser tratado no Node como diretórios,
ainda existem limitações devido a natureza de baixo nível do Node
Arquivos asar
são somente leitura
Os arquivos asar
não podem ser modificados.
Diretório de trabalho não pode ser comportar como diretório de arquivos
Embora pacotes asar
são tratadas como diretórios, não há
diretórios reais no sistema de arquivos, assim você nunca pode definir o diretório de trabalho para
diretórios em pacotes asar
, passando-os como a opção cwd
de algumas APIs
também irá causar erros.
Descompactação extra em algumas APIs
A maioria das APIs fs
pode ler um arquivo ou obter informações de um arquivo a partir de pacotes asar
sem descompacta-lo, mas para algumas APIs da rota real o Electron irá extrair o arquivo necessário para um
arquivo temporário e passar o caminho do arquivo temporário para as APIs,
isso adiciona um pouco de sobrecarga para essas APIs.
APIs que requer descompactação extras são:
child_process.execFile
fs.open
fs.openSync
process.dlopen
- Usado porrequire
em módulos nativos
Falsas informações de status do módulo fs.stat
O objeto Stats
retornado porfs.stat
e outras funções relacionadas não são informações confiáveis,
você não deve confiar no objeto Stats
exceto para obter o
tamanho do arquivo e verificação de tipo de arquivo.
Adicionando arquivos em um pacote asar
Como dito acima, algumas APIs deo Node irá descompactar o arquivo para quando o filesystem requsistar, além dos problemas de desempenho, ele também pode levar a falsos alertas de vírus.
Para contornar isso, você pode descompactar alguns arquivos usando a
opção --unpack
, um exemplo de exclusão de bibliotecas compartilhadas de módulos nativos
é:
$ asar pack app app.asar --unpack *.node
Depois de executar o comando, além do app.asar
, há também
app.asar.unpacked
pasta gerada que contém os arquivos descompactados, você
deve copiá-lo juntamente com app.asar
quando enviá-lo para os usuários.
Mais informações no repositório asar