如何提供 `babel-preset-react-app` 环境变量?

Posted

技术标签:

【中文标题】如何提供 `babel-preset-react-app` 环境变量?【英文标题】:How to provide `babel-preset-react-app` env variables? 【发布时间】:2018-10-16 01:57:27 【问题描述】:

我正在开发一个应用程序,它将 create-react-app 与快速服务器(使用服务器渲染)连接起来。我指的是this tutorial。要从服务器渲染文件,代码是

bootstrap.js

require('ignore-styles');
require('babel-register')(
ignore:[/(node-modules)/],
presets:['es2015','react-app']
);
require('./index');

index.js

import express from 'express';
// we'll talk about this in a minute:
import serverRenderer from './middleware/renderer';


const PORT = 3000;
const path = require('path');
// initialize the application and create the routes
const app = express();
const router = express.Router();
// root (/) should always serve our server rendered page
router.use('^/$', serverRenderer);
// other static resources should just be served as they are
router.use(express.static(
    path.resolve(__dirname, '..', 'build'),
     maxAge: '30d' ,
));
// tell the app to use the above rules
app.use(router);
// start the app
app.listen(PORT, (error) => 
    if (error) 
        return console.log('something bad happened', error);
    

    console.log("listening on " + PORT + "...");
);

运行命令时

node bootstrap.js

我收到错误提示

错误:使用babel-preset-react-app 需要您指定NODE_ENVBABEL_ENV 环境变量。有效值为“开发”、“测试”和“生产”。

【问题讨论】:

另见:babel-preset-react-app not picking up environment variables 【参考方案1】:

这里有几个选项。我将描述最简单的选项。

最简单的方法是像这样运行您的节点 bootstrap.js:

NODE_ENV=production BABEL_ENV=production node bootstrap.js

但这太长了,每次都记不住,所以你可以使用 package.json 脚本。

如果您打开 package.json 文件,您应该会看到脚本部分(如果没有,see the doc)。在该脚本部分,您可以创建自己的脚本。

我主要使用 2 个脚本,一个用于开发,一个用于生产。所以在你的情况下是这样的:

"scripts": 
   "start": "NODE_ENV=development BABEL_ENV=development node bootstrap.js",
   "serve": "NODE_ENV=production BABEL_ENV=production node bootstrap.js"

现在您可以像这样运行您的节点应用程序:

开发中

node run startnode start(因为 node start 是 node run start 的别名)

在生产中

node run serve(这里没有简写)

如果您仍然认为您的 package.json 变得太大,您可以将其抽象为一些 .js 文件。并相应地将您的脚本更改为:

"scripts": 
   "start": "node scripts/start.js"
   "serve": "node scripts/serve.js"

在这些脚本文件中,您可以在运行应用程序之前定义这两个环境变量。

【讨论】:

在这两种情况下,我都收到错误“NODE_ENV”不是内部或外部命令、可运行程序或批处理文件。 哦,我猜你用的是windows?然后,您应该首先为每个环境设置这些环境,例如SET NODE_ENV=development & BABEL_ENV=development,然后您应该能够运行node bootstrap.js。但最好的方法是将这些变量直接抽象到 start.js 文件中。通过手动或使用 dotenv 包进行。使用 dotenv 包,您可以创建一个 .env 文件来存储这些环境变量。但这不是 NODE_ENVBABEL_ENV 变量的最佳实践。 你认为最好的方法是什么?和 start.js 文件?你的意思是我将在哪里存储脚本? 是的。您创建一个 start.js 文件,在其中设置 NODE_ENV 和 BABEL_ENV 环境,接下来您需要在 start.js 中使用 require('./bootstrap.js') bootstrap.js。但是在需要 bootstrap.js 之前设置环境变量。您不将其添加到 bootstrap.js 的原因是 deveopmenttestproduction 状态。 React 将在生产模式下禁用调试等。 process.env.NODE_ENV = "开发"; process.env.BABEL_ENV="开发";需要('./bootstrap');

以上是关于如何提供 `babel-preset-react-app` 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

将 webpack 与 babel 和 babel-preset-react 和 babel-preset-es2015 一起使用

babel的插件

webpack react 错误整理

何为babel / gulp

webpack学习笔记五

Webpack + React 开发 01 HelloWorld