2016-06-15 23 views
8

Ich habe eine Elektronikanwendung, die node.js verwendet. Ich möchte Winston für die Anmeldung der Anwendung verwenden. Ich habe Winston zu meiner package.json Datei hinzugefügt, aber wenn ich den Build-Befehl für Webpack ausführe, erhalte ich einige Warnungen aus der Abhängigkeit colors.js in winston.Wie bekomme ich Winston zur Arbeit mit Webpack?

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

Es verweist dann Winston und colors.js. Das Ignorieren der Warnungen funktioniert nicht, da die Elektronenanwendung eine Ausnahme erhält, wenn sie versucht, einige Dateien von Winston zu laden.

Ich habe etwas über SO und die Github-Site gegraben und sie sagen, dass colors.js einige dynamische require-Anweisungen hat, mit denen webpack Probleme hat. Ich habe auch gesehen, dass andere Beispielprojekte Winston ohne Probleme in ihren Projekten laufen lassen. Kann jemand das Winston-Logging-Paket mit Webpack in einer Elektronen-App korrekt einbinden?

Antwort

12

Das Problem besteht darin, dass Webpack die dynamische require-Anweisung in colors.js nicht verarbeiten kann. Sie müssen also Webpack mitteilen, dass Winston eine externe Bibliothek ist.

Hier ist ein Beispiel aus meinem 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': '{}' 
}, 

an den Logger in einem Winkel 2 App Elektron zu machen, eine logger.js-Datei erstellen und es dann mit einem globalen Protokollierungsdienst wickelt TypeScript-Datei (zB logging.service.ts). Die Datei logger.js erstellt die Loggervariable mit den gewünschten Winston-Konfigurationseinstellungen.

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'); 

nun der Logging-Service ist für den Einsatz in der gesamten Anwendung zur Verfügung.

Beispiel:

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

Ich kann nicht diesen Ansatz verwenden, während ich Winkel-cli selbst statt webpack bin mit und haben Zugriff auf nicht webpack Config. – invisible

+1

@invisible Sie können Webpack überwinden, indem Sie einen ng eject ausführen, der die Datei webpack.conf.js generiert. Wenn ich dies mit der obigen Konfiguration tat, gab das Webpack Kompilierungsfehler, da es den Logger in der Datei logger.service.ts nicht finden konnte. – patz