Javascript 在单独的文件中共享公共常量和日志函数

Javascript 在单独的文件中共享公共常量和日志函数,javascript,node.js,ecmascript-6,constants,Javascript,Node.js,Ecmascript 6,Constants,对于使用同一NodeJS项目在不同文件之间共享常量,我有哪些选项 我在跟踪, 更新,删除了其他详细信息,因为这不是我回答具体问题的好例子 而且呢,沿着这个路线, 我想使用这个软件包使用公共日志工具, 但是,我发现在index.js文件中初始化它并不足以让所有其他文件使用它 const brolog = require('brolog') const log = new brolog.Brolog() const logLevel = process.env['MY_LOG'] if (l

对于使用同一NodeJS项目在不同文件之间共享常量,我有哪些选项

我在跟踪,

更新,删除了其他详细信息,因为这不是我回答具体问题的好例子

而且呢,沿着这个路线,

我想使用这个软件包使用公共日志工具,

但是,我发现在
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项目中的不同文件之间共享公共常量和日志功能呢

另外,这只是一个小而简单的项目,我不想为了这个而引入/使用像commonJS这样的大型npm模块

您可以使用在整个NodeJS项目中共享对象和常量

constants.js
const brolog = require("brolog");
global.log = new brolog.Brolog();
global.logLevel = process.env['MY_LOG'];
require("./constants");
require("./other");
if (logLevel) {
    log.level(logLevel)
    log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}
index.js
const brolog = require("brolog");
global.log = new brolog.Brolog();
global.logLevel = process.env['MY_LOG'];
require("./constants");
require("./other");
if (logLevel) {
    log.level(logLevel)
    log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}
other.js
const brolog = require("brolog");
global.log = new brolog.Brolog();
global.logLevel = process.env['MY_LOG'];
require("./constants");
require("./other");
if (logLevel) {
    log.level(logLevel)
    log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}

脚注 这种方法可能会导致问题,因为它会污染全局命名空间。这是解决问题的最简单方法之一,但以这种方式尽可能少地创建全局常量是值得的。它使您的代码更难测试、维护、重用,并且通常更难推理。只要你知道你在做什么,你就会没事的

您可以使用在整个NodeJS项目中共享对象和常量

constants.js
const brolog = require("brolog");
global.log = new brolog.Brolog();
global.logLevel = process.env['MY_LOG'];
require("./constants");
require("./other");
if (logLevel) {
    log.level(logLevel)
    log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}
index.js
const brolog = require("brolog");
global.log = new brolog.Brolog();
global.logLevel = process.env['MY_LOG'];
require("./constants");
require("./other");
if (logLevel) {
    log.level(logLevel)
    log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}
other.js
const brolog = require("brolog");
global.log = new brolog.Brolog();
global.logLevel = process.env['MY_LOG'];
require("./constants");
require("./other");
if (logLevel) {
    log.level(logLevel)
    log.verbose('Config', 'Log Level set to %s', logLevel, log.level())
}

脚注
这种方法可能会导致问题,因为它会污染全局命名空间。这是解决问题的最简单方法之一,但以这种方式尽可能少地创建全局常量是值得的。它使您的代码更难测试、维护、重用,并且通常更难推理。只要你知道你在做什么,你就会没事的

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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}
然后,
需要
在需要使用公共常数和/或效用函数或类的任何地方使用它:

app.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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}

当然,您可以而且通常被鼓励简化实用程序功能,使其更易于使用(但不比必要的更简单):

更多定制的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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}
在app.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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}

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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}
然后,
需要
在需要使用公共常数和/或效用函数或类的任何地方使用它:

app.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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}

当然,您可以而且通常被鼓励简化实用程序功能,使其更易于使用(但不比必要的更简单):

更多定制的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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}
在app.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()
}
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())
}
'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
}
const common = require('common')

if (common.isLogging) {
  common.verbose('...')
  common.warn('...')
  common.error('...')
}


默认情况下,节点还不支持
导入
导出
语法(来自ES6模块)。如果您使用的是节点10,则可以重命名文件,使其扩展名为
mjs
,并通过
Node foobar.mjs--experimental modules
@Jankapunkt执行。否,操作正确。确定。让我从问题中删除ES6模块,因为我将重点放在JS上,然后。。。和更新了。@xpt是否可以为
brolog
使用单例?i、 e.有一个创建记录器实例的文件,然后将其导出,以便您可以在任何地方导入并使用它?默认情况下,节点不支持
import
export
语法(来自ES6模块)。如果您使用的是节点10,则可以重命名文件,使其扩展名为
mjs
,并通过
Node foobar.mjs--experimental modules
@Jankapunkt执行。否,操作正确。确定。让我从问题中删除ES6模块,因为我将重点放在JS上,然后。。。和更新了。@xpt是否可以为
brolog
使用单例?i、 e.有一个文件创建一个记录器实例,然后将其导出,以便您可以在任何地方导入并使用它?看起来不错,但您能否再提供一个示例代码,说明如何使用my
const log
请?当然,请稍等片刻!)完美的谢谢!当从
index.js
拆分到其他文件时,这需要对现有代码进行最小的更改。我知道全局名称空间污染问题,所以我只将其用于全局常量和统一日志记录。顺便说一下,您可以在早期版本的node中使用它。我已将链接更改为使用node 6>,但它可以一直运行到node的第一个版本(0.10)!日志记录正是@xpt使用它的目的。我同意(并且已经说过)这通常是一个糟糕的解决方案,但我强烈不同意你的主张,因为这一点,我们应该避免在这里教授它。我们应该在这里教授它,只要我们还警告问题(我相信我们是)。这看起来不错,但你能再给我一个关于如何使用我的
const log
的示例代码吗?当然,请稍等片刻!)完美的谢谢!当从
index.js
拆分到其他文件时,这需要对现有代码进行最小的更改。我知道全局名称空间污染问题,所以我只将其用于全局常量和统一日志记录。顺便说一下,您可以在早期版本的node中使用它。我已将链接更改为使用node 6>,但它可以一直运行到node的第一个版本(0.10)!日志记录正是@xpt使用它的目的。我同意(并且已经说过)这通常是一个糟糕的解决方案,但我强烈不同意你的主张,因为这一点,我们应该避免在这里教授它