2016-04-16 33 views
6

Sono molto nuovo al tema del angolare, Javascript eccElectron, Angular2, "FS"

provo a scrivere un (dattiloscritto) applicazione Angular2-Electron che dovrebbe accedere al file-system. Tutti dicono solo di richiedere il modulo "fs" e tutto va bene, ma questo non funziona per me ....

Se faccio qualcosa di simile: var fs = require('fs');

Vedo che la mia app tenta di caricare quel modulo "fs" dalla mia cartella principale app: ..myapp/dist/fs Net :: ERR_FILE_NOT_FOUND

Tutti i miei altri moduli esterni si fa riferimento nel index.html:

<!-- build:js app/scripts/combined.js --> 
 
    <script src="../node_modules/jquery/dist/jquery.js"></script> 
 
    <script src="../node_modules/angular2/bundles/angular2-polyfills.js"></script> 
 
    <script src="../node_modules/systemjs/dist/system.js"></script> 
 
    <script src="../node_modules/angular2/bundles/angular2.dev.js"></script> 
 
    <script src="../node_modules/angular2/bundles/http.js"></script> 
 
    <script src="../node_modules/angular2/bundles/router.js"></script> 
 
    <script src="../node_modules/rxjs/bundles/Rx.js"></script> 
 
    <script src="../node_modules/bootstrap/dist/js/bootstrap.js"></script> 
 
    <script src="../node_modules/pdfjs-dist/build/pdf.combined.js"></script> 
 
    <script src="boot.js" type="text/javascript"></script> 
 
    <!-- endbuild -->

E quindi penso che potrebbero essere trovati, ma "fs" appartiene a node.js che è presente nell'elettrone? O ho fatto dei grossi errori nei miei pensieri?

Grazie mille,
Chris

+0

Quando dici che non funziona cosa succede? Quando provi ad accedere a localhost nel browser (supponendo che stai servendo a localhost) cosa succede esattamente? –

+0

L'app funziona correttamente se utilizzo un server (e non uso alcun Include per "fs"), ma compilo la mia app angolare con l'elettrone per creare un'applicazione desktop. Ho pensato che in un'app di elettroni i moduli di nodo sono già "presenti" ma che non sembrano funzionare. L'applicazione tenta di caricare il modulo "fs" dalla mia cartella dell'applicazione come sopra menzionato. Devo installare npm su eventuali depedenze aggiuntive per utilizzare i moduli nodo all'interno della mia app di elettroni? –

+0

Hhhhhmmmm, ho trovato una domanda che potrebbe essere correlata plausibilmente al problema. Le risposte a http://stackoverflow.com/questions/30664111/how-to-use-node-modules-within-electron-formerly-atom-shell ti aiutano affatto? –

risposta

4

I problemi sembra essere che io uso SystemJS nella mia applicazione angolare. SystemJS prova a caricare i moduli dalla mia applicazione.

mi hanno ora aggiungere questo quindi il mio index.html che sembra funzionare:

<script> 
    if (require) { 
     window.$ = window.jQuery = require('./app/assets/js/jquery.min.js'); 
     window.fs = require('fs'); 
     window.path = require('path'); 
    } 
</script> 
+1

Questo funziona, anche se sembra strano aggiungere qualsiasi modulo alla finestra per poterlo usare. Sembra che ci debba essere un'altra soluzione ... – mvermand

+0

@mvermand Ho avuto la stessa sensazione e mi è venuta in mente un approccio migliore. Vedi la mia risposta. – Monsignor

2

Cito il meltedspark's answer a una domanda simile:

System.js override Node.js s' require metodo e usa il proprio meccanismo di risoluzione.

Qui è la mia soluzione a questo problema:

  1. Crea riesportazioni per ogni modulo Node.js che si desidera utilizzare:

    // scripts/node-re-exports/fs.ts 
    declare const System: any; 
    const fs = System._nodeRequire('fs'); 
    export = fs; 
    
    // scripts/node-re-exports/electron.ts 
    declare const System: any; 
    const electron = System._nodeRequire('electron'); 
    export = electron; 
    
  2. Let systemjs.config.js sapere dove cercare questi riesportazioni.

    map: { 
        ... 
    
        // Re-exports of Node.js modules. 
        fs: 'compiled/node-re-exports/fs.js', 
        electron: 'compiled/node-re-exports/electron.js' 
    } 
    
  3. Import questi moduli in componenti Angular2, come al solito:

    import { Component } from '@angular/core'; 
    import { clipboard } from 'electron'; 
    import { existsSync } from 'fs'; 
    
    @Component({ 
        selector: 'my-app', 
        template: `<h1>Hello {{name}}</h1>`, 
    }) 
    export class AppComponent { 
        name = 'Angular'; 
    
        constructor() { 
         const text = existsSync("c:\\boot.txt") ? "exists" : "does not exist"; 
         clipboard.write({ text: text }); 
        }; 
    } 
    
1

Uso "fs": "@ node/fs" nelle systemjs mappa si può risolvere completamente il problema . Quindi è possibile importare come al solito i moduli del nodo nativo:

importare {existsSync} da 'fs';

3

C'è un githubproject riesco, che copre ancora di più di una semplice Angular 2 e electron (che coinvolge anche le librerie native).
Ho riscontrato un sacco di problemi simili ai vostri, in particolare il problema dell'accesso ai moduli node.js dall'applicazione electron.
Probabilmente vale la pena utilizzarlo come punto di partenza, anziché cercare di scrivere tutto da zero.

Per quanto riguarda il tuo problema, è necessario utilizzare System._nodeRequire('fs') invece di require('fs') come SystemJS meccanismo di ricerca è un po 'diverso da quello node s' uno.

Problemi correlati