目前我正在做这个:

foo.js

const FOO = 5;

module.exports = {
    FOO: FOO
};

并在bar.js中使用它:

var foo = require('foo');
foo.FOO; // 5

还有更好的办法吗?在exports对象中声明常量会让人感到尴尬。


当前回答

作为一种替代方法,您可以将“常量”值分组在一个局部对象中,并导出一个返回该对象的浅克隆的函数。

var constants = { FOO: "foo" }

module.exports = function() {
  return Object.assign({}, constants)
}

然后,如果有人重新分配FOO就无关紧要了,因为它只会影响他们的本地副本。

其他回答

最后,我导出了一个带有匿名getter函数的冻结对象,而不是导出常量本身。这降低了由于简单的const名称输入错误而引入的严重错误的风险,因为在输入错误的情况下将抛出运行时错误。下面是一个完整的例子,它也使用ES6符号作为常量,确保唯一性,以及ES6箭头函数。如果在这种方法中有任何问题,将感激反馈。

'use strict';
const DIRECTORY = Symbol('the directory of all sheets');
const SHEET = Symbol('an individual sheet');
const COMPOSER = Symbol('the sheet composer');

module.exports = Object.freeze({
  getDirectory: () => DIRECTORY,
  getSheet: () => SHEET,
  getComposer: () => COMPOSER
});

导入和导出(2018年可能需要像Babel这样的东西才能使用导入)

types.js

export const BLUE = 'BLUE'
export const RED = 'RED'

myApp.js

import * as types from './types.js'

const MyApp = () => {
  let colour = types.RED
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

作为一种替代方法,您可以将“常量”值分组在一个局部对象中,并导出一个返回该对象的浅克隆的函数。

var constants = { FOO: "foo" }

module.exports = function() {
  return Object.assign({}, constants)
}

然后,如果有人重新分配FOO就无关紧要了,因为它只会影响他们的本地副本。

因为Node.js使用的是CommonJS模式,所以你只能在模块与模块之间共享变量。导出或者像在浏览器中那样设置全局变量,但你用的不是window而是global。Your_var = value;

我认为const解决了大多数人寻找这个答案的问题。如果你真的需要一个不可变的常数,看看其他的答案。 为了保持所有内容的组织,我将所有常量保存在一个文件夹中,然后需要整个文件夹。

src / main.js文件

const constants = require("./consts_folder");

src consts_folder / index . js

const deal = require("./deal.js")
const note = require("./note.js")


module.exports = {
  deal,
  note
}

Ps.这里的交易和注意将在main.js的第一层

src / consts_folder笔记js。

exports.obj = {
  type: "object",
  description: "I'm a note object"
}

Ps. obj将是main.js的第二级

src / consts_folder成交js。

exports.str = "I'm a deal string"

Ps. str将是main.js的第二级

main.js文件的最终结果:

console.log (constants.deal); 输出:

{交易:{str: '我是一个交易字符串'},

console.log (constants.note); 输出:

备注:{obj: {type: 'object', description: 'I\'m a note object'}}