2016-06-15 53 views
8

Ho un'applicazione per elettroni che utilizza node.js. Vorrei usare Winston per accedere all'applicazione. Ho aggiunto winston al mio file package.json, ma quando eseguo il comando build per webpack ricevo alcuni avvisi dalla dipendenza colors.js in winston.Come posso far funzionare Winston con Webpack?

'...the request of a dependency is an expression...' 

Quindi fa riferimento a winston e colors.js. Ignorare gli avvertimenti non funziona, in quanto l'applicazione elettronica ottiene un'eccezione nel tentativo di caricare alcuni file da Winston.

Ho fatto un po 'di ricerche su SO e sul sito github e dicono che colors.js ha alcune istruzioni dinamiche che richiedono problemi con il webpack. Ho anche visto che altri progetti di esempio sembrano avere Winston installato e funzionante senza problemi nei loro progetti. Qualcuno sa come includere correttamente il pacchetto di registrazione winston con webpack in un'app di elettroni?

risposta

12

Il problema è che Webpack non è in grado di gestire l'istruzione require dinamico in colors.js. Quindi, devi dire a Webpack che Winston è una libreria esterna.

Ecco un esempio dal mio webpack.config.js:

externals: { 
    'electron': 'require("electron")', 
    'net': 'require("net")', 
    'remote': 'require("remote")', 
    'shell': 'require("shell")', 
    'app': 'require("app")', 
    'ipc': 'require("ipc")', 
    'fs': 'require("fs")', 
    'buffer': 'require("buffer")', 
    'winston': 'require("winston")', 
    'system': '{}', 
    'file': '{}' 
}, 

Per rendere il registratore disponibile in una angolare 2 applicazione utilizzando elettroni, creare un file logger.js e poi avvolgerlo con un servizio di registrazione globale File TypeScript (es. Logging.service.ts). Il file logger.js crea la variabile del logger con le impostazioni di configurazione di Winston desiderate.

logger.js:

var winston = require('winston'), 
    fs = require('fs'), 
    logDir = 'log', // Or read from a configuration 
    env = process.env.NODE_ENV || 'development', 
    logger; 
​ 


    winston.setLevels(winston.config.npm.levels); 
    winston.addColors(winston.config.npm.colors); 

    if (!fs.existsSync(logDir)) { 
     // Create the directory if it does not exist 
     fs.mkdirSync(logDir); 
    } 
    logger = new(winston.Logger)({ 
     transports: [ 
      new winston.transports.Console({ 
       level: 'warn', // Only write logs of warn level or higher 
       colorize: true 
      }), 
      new winston.transports.File({ 
       level: env === 'development' ? 'debug' : 'info', 
       filename: logDir + '/logs.log', 
       maxsize: 1024 * 1024 * 10 // 10MB 
      }) 
     ], 
     exceptionHandlers: [ 
      new winston.transports.File({ 
       filename: 'log/exceptions.log' 
      }) 
     ] 
    }); 
    ​ 
    module.exports = logger; 

logging.service.ts:

export var LoggerService = require('./logger.js'); 

Ora il servizio di registrazione è disponibile per l'uso in tutta l'applicazione.

Esempio:

import {LoggerService} from '<path>'; 
...  
LoggerService.log('info', 'Login successful for user ' + this.user.email); 
+0

non posso usare questo approccio mentre sto utilizzando angolare cli anziché webpack stessa e non hanno accesso a webpack config. – invisible

+1

@invisibile è possibile superare il webpack eseguendo un espulsione ng che genererà il file webpack.conf.js. Quando ho fatto questo con la configurazione di cui sopra, webpack ha dato errori di compilazione in quanto non era in grado di trovare il logger nel file logger.service.ts. – patz