目前我正在做这个:

foo.js

const FOO = 5;

module.exports = {
    FOO: FOO
};

并在bar.js中使用它:

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

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


当前回答

我建议使用webpack(假设你正在使用webpack)。

定义常量就像设置webpack配置文件一样简单:

var webpack = require('webpack');
module.exports = {
    plugins: [
        new webpack.DefinePlugin({
            'APP_ENV': '"dev"',
            'process.env': {
                'NODE_ENV': '"development"'
            }
        })
    ],    
};

通过这种方式,您可以在源代码之外定义它们,并且它们将在您的所有文件中可用。

其他回答

您可以使用global显式地将其导出到全局作用域。Foo = 5。然后,您只需请求该文件,甚至不保存返回值。

但说真的,你不应该这么做。保持适当的封装是一件好事。你已经有了正确的想法,所以继续做你正在做的事情。

我发现Dominic建议的解决方案是最好的,但它仍然缺少“const”声明的一个特性。当你在JS中使用"const"关键字声明一个常量时,常量的存在是在解析时检查的,而不是在运行时。因此,如果你在后面的代码中拼写错了常量的名字,当你尝试启动node.js程序时,你会得到一个错误。这是一个更好的拼写错误检查。

如果您像Dominic建议的那样使用define()函数定义常量,那么即使拼写错误也不会得到错误,并且拼写错误的常量的值将是未定义的(这可能导致调试头痛)。

但我想这是我们能得到的最好的了。

此外,在constans.js中,这是对Dominic函数的改进:

global.define = function ( name, value, exportsObject )
{
    if ( !exportsObject )
    {
        if ( exports.exportsObject )
            exportsObject = exports.exportsObject;
        else 
            exportsObject = exports;        
    }

    Object.defineProperty( exportsObject, name, {
        'value': value,
        'enumerable': true,
        'writable': false,
    });
}

exports.exportObject = null;

通过这种方式,你可以在其他模块中使用define()函数,它允许你在constants.js模块中定义常量,也允许你在调用该函数的模块中定义常量。声明模块常量有两种方式(在script.js中)。

第一:

require( './constants.js' );

define( 'SOME_LOCAL_CONSTANT', "const value 1", this ); // constant in script.js
define( 'SOME_OTHER_LOCAL_CONSTANT', "const value 2", this ); // constant in script.js

define( 'CONSTANT_IN_CONSTANTS_MODULE', "const value x" ); // this is a constant in constants.js module

第二:

constants = require( './constants.js' );

// More convenient for setting a lot of constants inside the module
constants.exportsObject = this;
define( 'SOME_CONSTANT', "const value 1" ); // constant in script.js
define( 'SOME_OTHER_CONSTANT', "const value 2" ); // constant in script.js

同样,如果你想要define()函数只从constants模块调用(而不是膨胀全局对象),你可以在constants.js中这样定义它:

exports.define = function ( name, value, exportsObject )

并在script.js中像这样使用它:

constants.define( 'SOME_CONSTANT', "const value 1" );

我建议使用webpack(假设你正在使用webpack)。

定义常量就像设置webpack配置文件一样简单:

var webpack = require('webpack');
module.exports = {
    plugins: [
        new webpack.DefinePlugin({
            'APP_ENV': '"dev"',
            'process.env': {
                'NODE_ENV': '"development"'
            }
        })
    ],    
};

通过这种方式,您可以在源代码之外定义它们,并且它们将在您的所有文件中可用。

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

var constants = { FOO: "foo" }

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

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

导入和导出(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