2016-06-15 62 views
8

我有一个使用node.js的电子应用程序。我想用Winston登录应用程序。我已经将winston添加到了我的package.json文件中,但是当我运行webpack的build命令时,我从winston中的colors.js依赖项中获得了一些警告。如何让Winston使用Webpack?

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

然后引用winston和colors.js。忽略警告不起作用,因为电子应用程序尝试从winston加载某些文件时出现异常。

我在SO和github网站上做了一些挖掘,他们说colors.js有一些动态的require语句,webpack遇到了问题。我也看到,其他示例项目似乎已经在winston运行,并且在项目中没有任何问题。有谁知道如何在电子应用程序中正确包含带有webpack的winston logging程序包?

回答

12

问题是Webpack无法处理colors.js中的动态require语句。所以,你需要告诉Webpack Winston是一个外部库。

下面是从我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': '{}' 
}, 

要使用电子使记录器提供的角2个应用程序,创建一个logger.js文件,然后用一个全球性的日志服务包起来TypeScript文件(即logging.service.ts)。 logger.js文件使用所需的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'); 

现在日志服务可用于整个应用程序中使用。

例子:

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

而我使用的角CLI而不是本身的WebPack我不能使用这种方法并不能访问的WebPack配置。 – invisible

+1

@invisible你可以通过执行一个ng eject来产生webpack.conf.js文件来克服webpack。 当我这样做了上述配置,webpack给编译错误,因为它无法找到logger.service.ts文件中的记录器。 – patz