我可以在不弹出的情况下更改 create-react-app 中 public 文件夹的名称吗?

Can I change the name of the public folder in create-react-app without ejecting?

我有一个已设置的 create-react-app 项目(express 和节点连接到后端的 mysql 数据库,以防万一),它工作得很好。我的项目经理告诉我,我需要将 'public' 目录的名称更改为 'static'(此目录 holds/will 包含我的静态文件,例如我的 index.html 和我需要提供的任何媒体)以便正确部署,但是我能找到的唯一解决方案是弹出,这样我就可以更改 'PUBLIC_URL' 的值。当前,当我 运行 'npm run start' 记录时出现错误:'Could not find a required file. Name: index.html',它仍在 public 目录中搜索(我已经将其更改为'static')。我的代码中没有任何地方引用 public 文件夹。

根据我的理解(如果我错了请纠正我),PUBLIC_URL 变量由 create-react-app 设置为 public 文件夹的路径。我想将其更改为静态文件夹,但我发现唯一可能涉及弹出然后手动更改变量的解决方案。有没有一种方法可以在不弹出的情况下设置该变量,或者做一些其他的变通方法来更改该目录,如果没有,最简单的方法是什么(我宁愿不弹出,但如果它是唯一的方法)...我真的只需要目录来更改名称,并且发现自己对我认为相当简单的更改感到沮丧。

谢谢!

编辑:这是我的 package.json:

{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.5.2",
    "react-dom": "^16.5.2",
    "react-scripts": "1.1.5"
  },
  "scripts": {
    "start": "PORT=8080 && react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

在基于 Unix 的系统上,您只需使用 "mv" 命令将构建文件夹移动到一个新文件夹即可。

我在 package.json:

上将其作为 build 脚本
"build": "react-scripts build && rm -rf static && mv build static"

我构建我的项目,然后删除任何先例 "static" 文件夹,最后将我的 "build" 文件夹移动到新的 "static" 文件夹。

PUBLIC_URL 是您可以设置的变量。

您可以在控制台中设置

export PUBLIC_URL="/static"

创建 React 应用程序将从 process.env.PUBLIC_URL

您可以在 pull request thread 中阅读更多相关信息以实现此功能

我真的很惊讶它实际上是多么简单。

  1. 使用您选择的包管理器安装 react-app-rewired

  2. 在项目的根目录下创建一个 config-overrides.js 文件

  3. 将以下代码粘贴到config-overrides.js

const path = require('path');
module.exports = {
    paths: function (paths, env) {
        // Changing public to static
        paths.appPublic = path.resolve(__dirname, 'static');
        paths.appHtml = path.resolve(__dirname, 'static/index.html');
        return paths;
    }
}
  1. 在项目的根目录下创建一个 .env 文件并写入 PUBLIC_URL='./static'

希望这对尝试做同样事情的人有所帮助。

package.json.scripts(对于 WINDOWS)

"start03": "set FOLDER=chapter03 && react-app-rewired start",
"build03": "set FOLDER=chapter03 && react-app-rewired build", 

react-app-rewired

    const path = require('path');
    module.exports = {paths: function (paths, env) {

          const folder = process.env.FOLDER.trim()

           // Changing public to static
           paths.appPublic = path.resolve(`${ __dirname }/src/${ folder }/_public`)
           paths.appHtml = path.resolve(`${ __dirname }/src/${ folder }/_public/index.html`)
           paths.appIndexJs = path.resolve(`${ __dirname }/src/${ folder }/index.js`)
           paths.appBuild = path.resolve(`${ __dirname }/build/${ folder }`)

           return paths;
        },
    }