在同一NodeJS项目的不同文件之间共享常量的选项有哪些?
我正在关注, https://www.reddit.com/r/javascript/comments/3bo42p/sharing_constants_in_es6_modules/
$ cat constants.js
const ALABAMA = 1;
const ALASKA = 3;
const ARIZONA =4;
更新,其他详细信息已删除,因为这不是我可以针对自己的特定问题进行跟踪的好例子。
同样,
我想使用此软件包使用通用日志工具, https://www.npmjs.com/package/brolog
但是,我发现在index.js
文件中对其进行初始化不足以让所有其他文件使用它。
const brolog = require('brolog')
const log = new brolog.Brolog()
const logLevel = process.env['MY_LOG']
if (logLevel) {
log.level(logLevel)
log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}
我不想在所有NodeJS文件中重复以上所有设置。
那么,如何在同一个NodeJS项目中的不同文件之间共享公共常数和日志功能?
PS。这只是一个小而简单的项目,我不想为此而引入/使用像commonJS这样的大型npm模块。
答案 0 :(得分:6)
Node.js中应用程序级常量和实用程序函数的常见模式是为它们创建一个模块,实例化/设置所需的任何位置,并在需要的地方使用该模块,例如:
common.js :
'use strict'
module.exports = {
/**
* The const of Alabama.
*
* @const {number}
*/
ALABAMA: 1,
/**
* The const of Alaska.
*
* @const {number}
*/
ALASKA: 3,
/**
* The const of Arizona.
*
* @const {number}
*/
ARIZONA: 4,
logLevel: process.env['MY_LOG'],
log: new brolog.Brolog()
}
然后require
在需要使用通用常量和/或实用程序函数或类的任何地方:
app.js :
const common = require('common')
if (common.logLevel) {
common.log.level(common.logLevel)
common.log.verbose('Config', 'Log Level set to %s', common.logLevel, common.log.level())
}
当然可以,并且通常会鼓励您简化实用程序功能,使它们更易于使用(但没有必要的简单):
更多自定义的 common.js :
'use strict'
const logger = new brolog.Brolog()
module.exports = {
/*
... constants ...
*/
// more describing
isLogging: process.env['MY_LOG'],
// shorthand for leveling
level: common.log.level,
// shorthand for verbose logging
verbose: common.log.verbose,
// shorthand for warn logging
warn: common.log.warn,
// shorthand for error logging
error: common.log.error
}
在 app.js 中使用:
const common = require('common')
if (common.isLogging) {
common.verbose('...')
common.warn('...')
common.error('...')
}
答案 1 :(得分:2)
您可以使用globals在整个NodeJS项目中共享对象和常量。
constants.js
const brolog = require("brolog");
global.log = new brolog.Brolog();
global.logLevel = process.env['MY_LOG'];
index.js
require("./constants");
require("./other");
other.js
if (logLevel) {
log.level(logLevel)
log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}
此方法可能会导致问题,因为它会污染全局名称空间。它是解决问题的最简单方法之一,但是值得以这种方式创建全局常量,以尽可能地省事。它使您的代码更难测试,维护,重用以及一般进行推理。只要您知道自己在做什么,就可以了!