首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用webpack DefinePlugin从React应用程序的dockerfile中访问环境变量

无法使用webpack DefinePlugin从React应用程序的dockerfile中访问环境变量
EN

Stack Overflow用户
提问于 2019-10-21 18:42:30
回答 1查看 400关注 0票数 1

我不确定我做错了什么。console.log打印undefinedMakefileconfig.envwebpack.config.jspackage.json都位于项目的根目录中。

Makefile:

代码语言:javascript
复制
docker-run: docker
    docker run -it --env-file config.env -p "80:80" app

config.env

代码语言:javascript
复制
API_KEY=https://test.com

webpack.config.js

代码语言:javascript
复制
plugins: [
        new webpack.DefinePlugin({
            BASE_URL: JSON.stringify('https://myapp.firebaseio.com'),
            'process.env.API_KEY': JSON.stringify(process.env.API_KEY)
        })
    ]

App.js

代码语言:javascript
复制
const App = () => {
    useEffect(() => {
        console.log(process.env.API_KEY);//undefined
        console.log(process.env.BASE_URL);//undefined
        console.log(BASE_URL);//undefined
    }, []);
    return (
        <></>
    );
};

Package.json(npm run docker)

代码语言:javascript
复制
"scripts": {
        "start": "rm -rf dist && webpack-dev-server --mode development --open --hot --port 8090",
        "docker": "rm -rf dist && webpack --mode production && make docker-run"
    },
EN

回答 1

Stack Overflow用户

发布于 2019-10-21 22:29:48

我在这里看到的一个错误是,您在docker之外构建项目,并将工件(在构建之后)推送到docker以服务于webapp。

根据DefinePlugin https://webpack.js.org/plugins/define-plugin/的文档

DefinePlugin允许您创建可在编译时配置的全局常量

这意味着,如果您有一个如下所示的App.js组件

代码语言:javascript
复制
import React from 'react';

function App() {
  return (
    <div>
        <p>[process.env.test] = {process.env.test}</p>
        <p>[process.env.NODE_ENV] = {process.env.NODE_ENV}</p>

    </div>
  );
}

export default App;

和webpack的配置

代码语言:javascript
复制
new webpack.DefinePlugin({"process.env.test": JSON.stringify(process.env.test)})

在运行NODE_ENV=production test="A test variable" npm run build之后(如果使用create-react-app启动,它会在内部运行webpack --mode production )

该组件被编译为(仅粘贴了webpack编译代码的相关部分)。

代码语言:javascript
复制
 var i = function() {
        return a.a.createElement(
          "div",
          null,
          a.a.createElement(
            "p",
            null,
            "[process.env.test] = ",
            "A test variable"
          ),
          a.a.createElement(
            "p",
            null,
            "[process.env.NODE_ENV] = ",
            "production"
          )
        );
      }

在这里,它在编译时将{process.env.test}{process.env.NODE_ENV}替换为A test variableproduction

构建后在服务器上设置任何环境变量的都不会影响编译后的文件。

,并且由于在编译代码中直接注入环境变量,您不应该使用它来存储机密信息(秘密/私有令牌、密码、内部服务器的IP地址等)。

因此,您原始问题的解决方案可能是,在docker容器中构建工件。下面是一个示例Docker文件。

代码语言:javascript
复制
FROM node:10 as react-app
# Create app directory
WORKDIR /usr/src/app
# Set a temporary variable
ENV test="Hello Docker"
COPY . .
RUN npm install
RUN npm run build

FROM nginx:1.12-alpine
COPY --from=react-app /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]  

如果你需要参考的话,这是一个示例git repo。

https://github.com/nithinthampi/test-defineplugin

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58484614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档