問題描述
我有一個使用 node.js 的電子應用程序.我想使用 Winston 登錄應用程序.我已將 winston 添加到我的 package.json 文件中,但是當我為 webpack 運行構建命令時,我收到了來自 winston 中的 colors.js 依賴項的一些警告.
I have an electron application which is using node.js. I would like to use Winston for logging in the application. I've added winston to my package.json file, but when I run the build command for webpack I'm getting some warnings from the colors.js dependency in winston.
'...the request of a dependency is an expression...'
然后它引用winston 和colors.js.忽略警告不起作用,因為電子應用程序在嘗試從 winston 加載一些文件時遇到異常.
It then references winston and colors.js. Ignoring the warnings doesn't work, as the electron application gets an exception trying to load some files from winston.
我在 SO 和 github 站點上進行了一些挖掘,他們說 colors.js 有一些動態(tài)的 require 語句,webpack 有問題.我還看到其他示例項目似乎已經啟動并運行了winston,并且在他們的項目中沒有任何問題.有誰知道如何在電子應用程序中正確包含帶有 webpack 的 winston 日志記錄包?
I did some digging on SO and the github site and they say that colors.js has some dynamic require statements that webpack is having issues with. I've also seen that other sample projects seem to have winston up and running without any issues in their projects. Does anyone know how to correctly include the winston logging package with webpack in an electron app?
推薦答案
這個問題有兩個方面:
1) winston 直接或間接依賴于 color.js,因此一旦 winston 存在,依賴項就會自動包含在內.在它的一些舊版本中,它包含一個動態(tài)的 require 語句,這導致:
1) winston directly or indirectly depends on color.js, so that dependency automatically gets included, once winston is there. In some older versions of it, it included a dynamic require statement, which leads to this:
2) 一個依賴有動態(tài)的 require 語句,Webpack 無法處理;您可以配置 webpack 以便它可以忽略此特定情況,或者也可以將 winston 升級到更新版本,因此 color.js 將在沒有動態(tài)要求的變體中被選擇(參見 https://github.com/winstonjs/winston/issues/984).
2) a dependency has a dynamic require statement that Webpack cannot handle; you can either configure webpack so it can ignore this specific case, or also upgrade winston to a newer version, so color.js will be picked in a variant without that dynamic require (see https://github.com/winstonjs/winston/issues/984).
要告訴 Webpack 與動態(tài) require 相處,你需要告訴 Webpack Winston 是一個外部庫.
To tell Webpack to get along with the dynamic require, you need to tell Webpack that Winston is an external library.
這是我的 webpack.config.js 中的一個示例:
Here's an example from my 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': '{}'
},
要使用電子使記錄器在 Angular 2 應用程序中可用,請創(chuàng)建一個 logger.js 文件,然后用全局日志記錄服務 TypeScript 文件(即 logging.service.ts)包裝它.logger.js 文件使用所需的 Winston 配置設置創(chuàng)建 logger 變量.
To make the logger available in an angular 2 app using electron, create a logger.js file and then wrap it with a global logging service TypeScript file (i.e. logging.service.ts). The logger.js file creates the logger variable with the desired Winston configuration settings.
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:
logging.service.ts:
export var LoggerService = require('./logger.js');
現在日志服務可以在整個應用程序中使用.
Now the logging service is available for use throughout the application.
例子:
import {LoggerService} from '<path>';
...
LoggerService.log('info', 'Login successful for user ' + this.user.email);
這篇關于如何讓 Winston 使用 Webpack?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!