Javascript JS globals在评估时导致崩溃

Javascript JS globals在评估时导致崩溃,javascript,ecmascript-6,global-variables,Javascript,Ecmascript 6,Global Variables,我想设置全局环境变量,定义我的Web包ReactJS应用程序工作的当前环境(开发、生产、测试或部署)。然而,每当我试图访问我的环境变量\uuuu ENV\uuu时,就会出现这个非常奇怪的错误 以下类似的代码段均因相同错误而失败,uncaughtreferenceerror:deployment未定义,其中deployment是\uuuu ENV\uu的值,而不是它的ref name。无论我给它多大的价值,同样的事情也会发生。以下是三个样本: console.log(process.env.NOD

我想设置全局环境变量,定义我的Web包ReactJS应用程序工作的当前环境(开发、生产、测试或部署)。然而,每当我试图访问我的环境变量
\uuuu ENV\uuu
时,就会出现这个非常奇怪的错误

以下类似的代码段均因相同错误而失败,
uncaughtreferenceerror:deployment未定义
,其中deployment是
\uuuu ENV\uu的值,而不是它的ref name。无论我给它多大的价值,同样的事情也会发生。以下是三个样本:

console.log(process.env.NODE_ENV);
global.__ENV__ = process.env.NODE_ENV || 'development';
console.log(__ENV__); // crashes here otherwise crashes at next line
global.__PROD__ = __ENV__ == 'production';
global.__DEPLOY__ = __ENV__ == 'deployment';
global.__DEV__ = __ENV__ == 'development';
global.__TEST__ = __ENV__ == 'test';

console.log(process.env.NODE_ENV);
window.__ENV__ = process.env.NODE_ENV || 'development';
console.log(__ENV__); // crashes here otherwise crashes at next line
window.__PROD__ = __ENV__ == 'production';
window.__DEPLOY__ = __ENV__ == 'deployment';
window.__DEV__ = __ENV__ == 'development';
window.__TEST__ = __ENV__ == 'test';

console.log(process.env.NODE_ENV);
window.__ENV__ = process.env.NODE_ENV || 'development';
console.log(`${__ENV__}`); // crashes here otherwise crashes at next line
window.__PROD__ = `${__ENV__}` == 'production';
window.__DEPLOY__ = `${__ENV__}` == 'deployment';
window.__DEV__ = `${__ENV__}` == 'development';
window.__TEST__ = `${__ENV__}` == 'test';
更奇怪的是,这种方法反而有效:

const __ENV__ = process.env.NODE_ENV || 'development';
console.log(__ENV__);
global.__PROD__ = __ENV__ === 'production';
global.__DEPLOY__ = __ENV__ === 'deployment';
global.__DEV__ = __ENV__ === 'development';
global.__TEST__ = __ENV__ === 'test';
我的网页包配置包括以下内容:

config.globals = {
  'process.env': {
    'NODE_ENV': JSON.stringify(config.env)
  },
  '__ENV__': config.env,
  '__DEPLOY__': config.env === '"deployment"',
  '__DEV__': config.env === '"development"',
  '__PROD__': config.env === '"production"',
  '__TEST__': config.env === '"test"'
};

webpack_config.plugins.push(
  new webpack.DefinePlugin(config.globals)
);
知道为什么会这样吗


如果这有什么帮助的话,我的代码库是从ES2015传输的,启用了stage-0提案,然后使用Webpack作为单个捆绑包发送的。

发生这种情况的唯一原因是,如果您配置了构建工具,将对
\uu ENV\uu的全局引用替换为其他内容

因此,构建工具将取代

console.log(__ENV__);

这在严格模式下失败,因为未定义变量
development

您没有展示如何配置构建工具,而是做了如下操作

replace('__ENV__', 'development')
应该是

replace('__ENV__' , '"development"')
因此,构建工具会在代码中插入字符串文字(而不是变量名)


(如果值来自一个变量,请首先通过
JSON.stringify
传递它,这将添加引号)

发生这种情况的唯一原因是,如果您配置了构建工具,将对
\uuu ENV\uu的全局引用替换为其他内容

因此,构建工具将取代

console.log(__ENV__);

这在严格模式下失败,因为未定义变量
development

您没有展示如何配置构建工具,而是做了如下操作

replace('__ENV__', 'development')
应该是

replace('__ENV__' , '"development"')
因此,构建工具会在代码中插入字符串文字(而不是变量名)


(如果值来自一个变量,请首先通过
JSON.stringify
传递它,这将添加引号)

您的前7行代码在nodejs v6.9.2中运行良好。当您得到所描述的错误时,您在运行什么?这是在最新版本的Chrome atm(58.0.3029.81(64位))中运行的。您的前7行代码在nodejs v6.9.2中运行良好。当你得到你描述的错误时,你在运行什么?这是在最新版本的Chrome atm(58.0.3029.81(64位))(用Webpack config更新OP)中运行的。事实上,这似乎是错误的根源——在每个变量周围添加JSON.stringify(…)似乎可以关闭错误。但是,在第三个示例的第一行之前添加
\uuuu ENV\uuu
变量的打印将打印未定义的内容。有什么想法吗?(用Webpack config更新了OP)确实,这似乎是错误的根源-在每个变量周围添加JSON.stringify(…)似乎可以关闭错误。但是,在第三个示例的第一行之前添加
\uuuu ENV\uuu
变量的打印将打印未定义的内容。有什么想法吗?