javascript - Node 以编程方式设置导入模块不可用的进程环境变量

标签 javascript node.js import ecmascript-6 environment-variables

我是新人,希望这个问题的格式和表述正确。迫不及待地想看到您对这个问题的回答。让我们开始吧..

上下文

上周末,我试图在我的 create-react-app 配置文件中实现 es2015 语法支持,这很简单。我所要做的就是使用 babel-registerbabel-preset-env 让它工作。到目前为止,你可以说一切都很好,但它并不全是好的。经过几个小时的搜索,我发现 process.env 变量没有传递给导入的模块。下面的代码将演示我的问题。

代码

package.json

{
  ...
  "scripts": [
    "good": "NODE_ENV=development BABEL_ENV=development node -r babel-register scripts/start.js",
    "bad": "node -r babel-register scripts/start.js"
  ],
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-preset-env": "^1.7.0",
    "babel-register": "^6.26.0"
  }
  ...
}

.babelrc

{
  "presets": [ "env" ]
}

scripts/start.js

'use strict'

process.env.NODE_ENV = 'development';
process.env.BABEL_ENV = 'development';

// Always works
const a = require('../src/a');
// Only when environment variables are passed in via the CLI
import b from '../src/b';

console.log('Bye bye..');  

src/a.js

'use strict'

console.log('Module A:', process.env.NODE_ENV);

const a = { name: "Module A" };
export default a;

src/b.js

'use strict'

console.log('Module B:', process.env.NODE_ENV);

const b = { name: "Module B" };
export default b;

运行代码

下面您将看到两个 npm 脚本的输出:

npm run good
# Outputs:
Module B: development
Module A: development
Bye bye..

npm run bad
# Outputs:
Module B: undefined
Module A: development
Bye bye..

我的问题

  1. 为什么不以编程方式设置环境变量传递给导入的模块?
  2. 能否在保持 es2015 语法的同时解决这个问题? (例如使用 babel 插件?)

更多信息

只是将我的 process.env.NODE_PATH 移至 CLI 是行不通的,create-react-app 以编程方式在其配置的多个位置设置环境变量/脚本文件。我在下面列出了一些链接,指向 create-react-app 存储库和一些给我带来麻烦的文件。

备注

根据我目前的理解,create-react-app 与我遇到的问题几乎没有关系。我对为什么以编程方式设置的环境变量没有传递到导入的模块很感兴趣。

我的设置

  • 操作系统:Ubuntu 16.04
  • Node :v8.11.2
  • Npm:6.3

最佳答案

ES6 导入被提升。这意味着它们将在其余代码之前运行,而不管它们在源代码中的什么位置。结果是 b.js 将在您设置 process.env.NODE_ENV = 'development' 之前运行。

Babel 的输出将与此一致,并将通过将 b 的 require 语句移动到文件顶部来模拟提升导入。 Babel 将创建一个 start 文件,如下所示:

'use strict';

var _b = require('../src/b');

var _b2 = _interopRequireDefault(_b);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

process.env.NODE_ENV = 'development';
process.env.BABEL_ENV = 'development';

// Always works
var a = require('../src/a');
// Only when environment variables are passed in via the CLI

看看为什么这行不通应该很清楚。

[ 作为旁注,许多人强烈建议您不要在运行时设置 NODE_ENV ]

关于javascript - Node 以编程方式设置导入模块不可用的进程环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51729775/

相关文章:

javascript - 获得焦点时如何移动文本框视口(viewport)?

node.js - 隐藏相关模型的方法

node.js - 导航超时后关闭浏览器

database - 将 CSV 文件加载到数据库表 Wordpress

sql - 根据条件选择多个Hibernate import.sql

javascript - 在 reactjs 中使用 map 功能时,如何将 defaultChecked 设置为仅在单选按钮中的第一个输入

javascript - JEdi​​table,如何处理 JSON 响应?

javascript - 如何在函数之间共享解析的 D3.js CSV - 范围问题?

javascript - 如何在 webpack 上获取原始静态 html 文件

r - readxl(将excel文件导入R)错误