javascript - 如何让 Winston 与 Webpack 一起工作?

标签 javascript angular webpack electron winston

我有一个使用 node.js 的 Electron 应用程序。我想使用 Winston 登录应用程序。我已将 winston 添加到我的 package.json 文件中,但是当我运行 webpack 的构建命令时,我从 winston 中的 colors.js 依赖项中收到一些警告。

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

然后它引用 winston 和 colors.js。忽略警告不起作用,因为 Electron 应用程序在尝试从 winston 加载某些文件时遇到异常。

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

最佳答案

这个问题有两个方面:

1) winston 直接或间接依赖于 color.js,因此一旦 winston 存在,该依赖项就会自动包含在内。在它的一些旧版本中,它包含一个动态的 require 语句,这导致了这个:

2) 一个依赖有一个 Webpack 无法处理的动态 require 语句;您可以配置 webpack 以便它可以忽略这种特定情况,或者也可以将 winston 升级到更新的版本,这样 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) package 它。 logger.js 文件使用所需的 Winston 配置设置创建记录器变量。

记录器.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;

日志记录服务.ts:

export var LoggerService = require('./logger.js');

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

例子:

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

关于javascript - 如何让 Winston 与 Webpack 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37840566/

相关文章:

javascript - 表单输入指令与隔离范围的两种方式绑定(bind)

node.js - 使用分离的客户端和服务器进行身份验证

Angular 2 类型错误 : Cannot read property 'toUpperCase' of undefined

angular - 错误 TypeError : this. 验证器不是 FormArray 函数

webpack - 最简单的 cytoscape.js 构建系统?

javascript - 获取输出,但在 AJAX 中首先获取未定义

javascript - 在客户端下载本地html文件

javascript - 无法加载 <资源> : No 'Access-Control-Allow-Origin' header is present on the requested resource

docker - Docker从文件撰写构建时间参数

javascript - Webpack 无法解析 html-loader