reactjs - basename 和 homepage 未按预期工作以服务/静态/开发中的文件

标签 reactjs docker kubernetes react-router-dom nginx-ingress

不确定这是 Kubernetes、ingress-nginx 还是 ReactJS (create-react-app) 问题...

项目结构

new-app/
  client/
    src/
      App.js
      index.js
      Test.js
    package.json
  k8s/
    client.yaml
    ingress.yaml
  server/
  skaffold.yaml

问题

  • 当使用 Skaffold 启动集群时,ReactJS 前端应该在 192.168.64.5/client 上运行
  • 导航到 192.168.64.5/client 和黑屏
  • 开发者控制台显示:

enter image description here enter image description here

基本上,它试图从 /static 提供静态文件,但我需要它们来自 /client/static

建议的解决方案

假设这是一个 ReactJS 问题,解决方案如下:

在我的情况下似乎没有任何效果。仍然显示尝试从 /static 而不是 /client/static 提供的 Assets 。

ReactJS 应用代码

// App.js

import React from 'react';
import { BrowserRouter, Route } from 'react-router-dom';
import './App.css';

import Test from './Test';

const App = () => {
  return (
    <BrowserRouter
      basename='/client'>
        <>
          <Route exact path='/' component={Test} />
        </>
    </BrowserRouter>

  );
}

export default App;
// Test.js

import React, { useState, useEffect } from 'react';
import logo from './logo.svg';
import './App.css';
import axios from 'axios';

const Test = () => {

  const [data, setData] = useState('');

  useEffect(() => {
    const fetchData = async () => {
      const result = await axios('/api/auth/test/');
      setData(result.data);
    };
    fetchData();
  }, []);

  return (
    <div className='App'>
    <header className='App-header'>
      <img src={logo} className='App-logo' alt='logo' />
      <p>
        Edit <code>src/App.js</code> and save to reload!
      </p>
      <p>
        {data}
      </p>
      <a
        className='App-link'
        href='https://reactjs.org'
        target='_blank'
        rel='noopener noreferrer'
      >
        Learn React
      </a>
    </header>
    </div>    
  )

};

export default Test;
{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "homepage": "/client",
  "dependencies": {
    "axios": "^0.19.0",
    "react": "^16.12.0",
    "react-dom": "^16.12.0",
    "react-router-dom": "^5.1.2",
    "react-scripts": "3.2.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

Kubernetes/Skaffold 和 Docker list

# Dockerfile.dev

FROM node:alpine
EXPOSE 3000
WORKDIR '/app'
COPY ./client/package.json ./
RUN npm install
COPY ./client .
CMD ["npm", "run", "start"]
# ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/add-base-url: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - path: /client/?(.*)
            backend:
              serviceName: client-cluster-ip-service
              servicePort: 3000
# client.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: client-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      component: client
  template:
    metadata:
      labels:
        component: client
    spec:
      containers:
        - name: client
          image: clientappcontainers.azurecr.io/client
          ports:
            - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: client-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: client
  ports:
    - port: 3000
      targetPort: 3000
# skaffold.yaml

apiVersion: skaffold/v1beta15
kind: Config
build:
  local:
    push: false
  artifacts:
    - image: clientappcontainers.azurecr.io/client
      docker:
        dockerfile: ./client/Dockerfile.dev
      sync:
        manual:
          - src: "***/*.js"
            dest: .
          - src: "***/*.html"
            dest: .
          - src: "***/*.css"
            dest: .
deploy:
  kubectl:
    manifests:
      - manifests/ingress.yaml 
      - manifests/client.yaml

那么我做错了什么?

编辑:

我应该注意到,这样做时一切正常:

- path: /?(.*)
  backend:
    serviceName: client-cluster-ip-service
    servicePort: 3000

repo 演示问题:

https://github.com/eox-dev/subdir-issue

最佳答案

显然,目前在开发环境中的 CRA 中这是不可能的:

https://github.com/facebook/create-react-app/issues/8222#issuecomment-568308139

关于reactjs - basename 和 homepage 未按预期工作以服务/静态/开发中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59415730/

相关文章:

docker - 使用 kubernetes 扩展 cron 架构

javascript - Redux- mapStateToProps 不工作

nginx - 无法将 docker 镜像推送到神器

docker - docker镜像中的sh在Windows 10上看不到可执行文件

docker - docker主机端口和容器端口

kubernetes - 在 kubernetes 中,如何在我的 pod 中使用 Replication Controller 中的元数据名称?

kubernetes - 无法通过 google kubernetes 集群中的堆栈驱动程序调试 java 应用程序

javascript - React Stripe Payment 创建客户和订单/送货地址等

html - 如何水平对齐子组件以占据容器宽度的一定百分比?

javascript - webpack - scss 无法解析背景图像 url