这个问题有两个方面:
1) winston 直接或间接依赖于 color.js,因此一旦 winston 存在,该依赖项就会自动包含。 在某些较旧的版本中,它包含了一个动态 require 语句,导致出现以下情况:
2) 一个依赖项具有 Webpack 无法处理的动态 require 语句;您可以配置 webpack 以忽略此特定情况,或升级 winston 到较新版本,以便选择没有该动态 require 的 color.js 变体(请参见https://github.com/winstonjs/winston/issues/984)。
要告诉 Webpack 处理动态 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': '{}'
},
为了在使用Electron的Angular 2应用程序中使用日志记录器,请创建一个logger.js文件,然后使用全局日志记录服务TypeScript文件(即logging.service.ts)对其进行包装。 logger.js文件使用所需的Winston配置设置创建logger变量。
var winston = require( 'winston' ),
fs = require( 'fs' ),
logDir = 'log',
env = process.env.NODE_ENV || 'development',
logger;
winston.setLevels( winston.config.npm.levels );
winston.addColors( winston.config.npm.colors );
if ( !fs.existsSync( logDir ) ) {
fs.mkdirSync( logDir );
}
logger = new( winston.Logger )( {
transports: [
new winston.transports.Console( {
level: 'warn',
colorize: true
} ),
new winston.transports.File( {
level: env === 'development' ? 'debug' : 'info',
filename: logDir + '/logs.log',
maxsize: 1024 * 1024 * 10
} )
],
exceptionHandlers: [
new winston.transports.File( {
filename: 'log/exceptions.log'
} )
]
} );
module.exports = logger;
日志服务.ts:
export var LoggerService = require('./logger.js');
现在日志服务可以在整个应用程序中使用。
示例:
import {LoggerService} from '<path>';
...
LoggerService.log('info', 'Login successful for user ' + this.user.email);