2016-06-15 10 views
8

Mam aplikację elektronów, który używa node.js. Chciałbym użyć Winstona do zalogowania się w aplikacji. Dodałem winston do mojego pliku package.json, ale kiedy uruchomię polecenie budowania dla webpacka, otrzymuję ostrzeżenia z zależności colors.js w winston.Jak mogę przekonać Winstona do współpracy z Webpack?

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

Następnie odnosi się do winston i colors.js. Ignorowanie ostrzeżeń nie działa, ponieważ aplikacja elektronowa otrzymuje wyjątek próbujący załadować niektóre pliki z winston.

Zrobiłem trochę kopania na SO i stronie github i mówią, że colors.js ma pewne dynamiczne instrukcje wymagające, z którymi problem ma problem. Widziałem także, że inne przykładowe projekty wydają się działać bez problemów w swoich projektach. Czy ktoś wie, jak poprawnie dołączyć pakiet logowania Winston z Webpack w aplikacji elektron?

Odpowiedz

12

Problem polega na tym, że pakiet Webpack nie obsługuje instrukcji dynamicznej require w pliku colors.js. Musisz więc powiedzieć Webpackowi, że Winston jest biblioteką zewnętrzną.

Oto przykład z moich 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': '{}' 
}, 

Aby rejestrator dostępny w 2 kątowym aplikacji za pomocą elektronów, utwórz plik logger.js a następnie owinąć go z globalną usługę rejestrowania Plik TypeScript (tj. Logging.service.ts). Plik logger.js tworzy zmienną rejestratora z żądanymi ustawieniami konfiguracyjnymi Winston.

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

Teraz usługa rejestrowania dostępne do użytku w całej aplikacji jest.

przykład:

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

nie może używać tej metody, a ja za pomocą skośnych cli zamiast WebPacka sama w sobie i nie dostęp do WebPACK konfiguracji. – invisible

+1

@invisible można przezwyciężyć pakiet internetowy, wykonując polecenie wysunięcia, które wygeneruje plik webpack.conf.js. Kiedy zrobiłem to przy powyższej konfiguracji, webpack dał błędy kompilacji, ponieważ nie był w stanie znaleźć rejestratora w pliku logger.service.ts. – patz

Powiązane problemy