使用create-react-app时,请使用自定义构建输出文件夹

632*_*324 47 reactjs create-react-app

Facebook提供了构建反应应用程序的create-react-app 命令.当我们运行时npm run build,我们看到/build文件夹中的输出.

npm run build

将生产应用程序构建到构建文件夹.它正确地将React捆绑在生产模式中并优化构建以获得最佳性能.

构建被缩小,文件名包含哈希.您的应用已准备好部署!

我们如何使用自定义文件夹而不是/build输出?谢谢.

小智 57

编辑你的package.json:

"build": "react-scripts build && mv build webapp"
Run Code Online (Sandbox Code Playgroud)

  • 我不得不把它变成"构建":"react-scripts build && rm -rf docs && mv build docs"`否则在第一次运行后它将build _into_文件夹移动而不是覆盖它. (8认同)
  • 与 Windows 等效的命令 ``rm -rf webapp = DEL /S /Q webapp`` 和 ``mv build webapp = move build webapp`` (3认同)
  • 如果您不想移动构建文件夹,只需复制其文件即可。Windows 的等效命令:``mv build webapp = xcopy /E /H /C /I build webapp`` (2认同)
  • 如果你想将 build 中的内容移到 webapp 上而不是 webapp/build 上,Windows 的命令是 `"build": "react-scripts build && RMDIR /S /Q webapp && move build webapp"` (2认同)

小智 54

有了react-scripts >= 4.0.2,这是官方支持的

默认情况下,Create React App 会将编译后的资产输出/build/src. 您可以使用此变量为 Create React App 指定输出资产的新路径。BUILD_PATH应指定为相对于项目根目录的路径。

// package.json
  "scripts": {
    "build": "BUILD_PATH='./dist' react-scripts build",
    // ...
  },
Run Code Online (Sandbox Code Playgroud)

或将 .env 文件添加到项目的根目录:

# .env
BUILD_PATH='./dist'
Run Code Online (Sandbox Code Playgroud)

  • 对于windows,你需要使用set。例如: `"build": "set BUILD_PATH=../wwwroot/clientapp && react-scripts build"` (15认同)
  • 我希望它能进来!他们拒绝支持,这真是太烦人了。 (4认同)
  • 此配置今天发布了 4.0.2 版本,位于高级配置文档和变更日志中。 (3认同)
  • 这个解决方案很棒!**重要警告** 在编写 BUILD_PATH 时,请确保您编写的路径不存在,否则您不介意被删除。执行 `BUILD_PATH='..'` 对我的项目进展造成了严重损害。(它也删除了 git。) (3认同)

Kal*_*sev 29

您无法使用当前配置选项更改构建输出文件夹名称.

而且,你不应该.这是背后哲学react-create-app的一部分:他们说约会优于配置.

如果您确实需要重命名文件夹,我会看到两个选项:

  1. 在构建过程完成后,编写一个命令,将构建文件夹内容复制到所需的另一个文件夹.例如,您可以尝试使用copyfilesnpm包或类似的东西.

  2. 您可以尝试弹出react-create-app并调整配置.

    如果您对构建工具和配置选项不满意,则可以随时弹出.此命令将从项目中删除单个构建依赖项.

    相反,它会将所有配置文件和传递依赖项(Webpack,Babel,ESLint等)复制到项目中,以便您可以完全控制它们.除弹出之外的所有命令仍然有效,但它们将指向复制的脚本,以便您可以调整它们.在这一点上,你是独立的.

    但是,重要的是要注意这是一个单向操作.一旦弹出,你就无法回去!您将丢失所有未来的更新.

因此,如果可能,我建议您不要使用自定义文件夹命名.尽量坚持使用默认命名.如果不是一个选项,请尝试#1.如果它仍然不适用于您的特定用例,并且您真的没有选择 - 探索#2.祝好运!

  • 对于有特殊情况的人来说,"约会优于配置"并不比一个巨大的"操你"(例如,我正在尝试将一个UI与一个Rust Web服务器捆绑在一起,其构建工件应该进入自己的构建文件夹). (8认同)
  • 复制文件比重命名文件夹有什么优势? (3认同)
  • 该版本已发布“v4.0.2”。工作示例:/sf/answers/4622528221/ (2认同)
  • “约定优于配置”并不意味着不灵活。 (2认同)

Mal*_*yer 26

Create-react-app Version 2+答案

对于create-react-app的最新(> v2)版本(以及可能更旧的版本),将以下行添加到package.json,然后重建.

"homepage": "./"
Run Code Online (Sandbox Code Playgroud)

您现在应该看到build/index.html将具有相对链接./static/...而不是指向服务器根目录的链接:/static/....

  • 谢谢。这应该是公认的答案。如果您不使用绝对 URL,VS Code 会警告您,但构建也适用于相对 URL。 (5认同)

t_d*_*m93 19

支持BUILD_PATH刚刚登陆到v4.0.2

BUILD_PATH变量添加到.env文件并运行build脚本命令:

// .env file
BUILD_PATH=foo 
Run Code Online (Sandbox Code Playgroud)

这应该将所有构建文件放入foo文件夹。

  • 杰出的。使用 BUILD_PATH=../dist 按预期工作 (2认同)

Wal*_*rée 9

Félix的答案是正确的,并得到了Dan Abramov自己的支持

但是对于那些想要更改输出本身结构(在build文件夹中)的用户,可以在的帮助下运行构建后命令,该命令将在文件中定义postbuildbuild脚本之后自动运行package.json

下面的示例将其从更改static/user/static/,移动文件并更新相关文件上的文件引用(此处为要点):

package.json

{
  "name": "your-project",
  "version": "0.0.1",
  [...]
  "scripts": {
    "build": "react-scripts build",
    "postbuild": "./postbuild.sh",
    [...]
  },
}
Run Code Online (Sandbox Code Playgroud)

postbuild.sh

#!/bin/bash

# The purpose of this script is to do things with files generated by
# 'create-react-app' after 'build' is run.
# 1. Move files to a new directory called 'user'
#    The resulting structure is 'build/user/static/<etc>'
# 2. Update reference on generated files from
#    static/<etc>
#     to
#    user/static/<etc>
#
# More details on: https://github.com/facebook/create-react-app/issues/3824

# Browse into './build/' directory
cd build
# Create './user/' directory
echo '1/4 Create "user" directory'
mkdir user
# Find all files, excluding (through 'grep'):
# - '.',
# - the newly created directory './user/'
# - all content for the directory'./static/'
# Move all matches to the directory './user/'
echo '2/4 Move relevant files'
find . | grep -Ev '^.$|^.\/user$|^.\/static\/.+' | xargs -I{} mv -v {} user
# Browse into './user/' directory
cd user
# Find all files within the folder (not subfolders)
# Replace string 'static/' with 'user/static/' on all files that match the 'find'
# ('sed' requires one to create backup files on OSX, so we do that)
echo '3/4 Replace file references'
find . -type f -maxdepth 1 | LC_ALL=C xargs -I{} sed -i.backup -e 's,static/,user/static/,g' {}
# Delete '*.backup' files created in the last process
echo '4/4 Clean up'
find . -name '*.backup' -type f -delete
# Done
Run Code Online (Sandbox Code Playgroud)


小智 9

这是我的解决方案:在根目录中创建 .env,然后将这一行添加到其中。

BUILD_PATH=$npm_package_name-$npm_package_version
Run Code Online (Sandbox Code Playgroud)

构建路径将为“name_of_app”-“version”

这些值可以在 package.json 中设置

{
  "name": "my-app",
  "version": "0.1.2",
...
}
Run Code Online (Sandbox Code Playgroud)


Jai*_*son 7

我有想重命名文件夹并更改构建输出位置的场景,并使用最新版本的 package.json 中的以下代码

"build": "react-scripts build && mv build ../my_bundles"
Run Code Online (Sandbox Code Playgroud)


Muh*_*BUL 7

Windows 的移动命令对我不起作用。因为它不复制“静态”文件夹和子文件夹。所以我能够使用“ROBOCOPY”解决这个问题。

"build": "react-scripts build && ROBOCOPY build ../my-relative-path/react-app /E",
Run Code Online (Sandbox Code Playgroud)


gco*_*lby 5

根据Ben CarpWallace Sidhrée 的回答

这是我用来将整个构建文件夹复制到 wamp 公用文件夹的方法。

包.json

{
  "name": "[your project name]",
  "homepage": "http://localhost/[your project name]/",
  "version": "0.0.1",
  [...]
  "scripts": {
    "build": "react-scripts build",
    "postbuild": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./post_build.ps1",
    [...]
  },
}
Run Code Online (Sandbox Code Playgroud)

post_build.ps1

Copy-Item "./build/*" -Destination "C:/wamp64/www/[your project name]" -Recurse -force
Run Code Online (Sandbox Code Playgroud)

仅当您部署到服务器上的子文件夹时才需要主页行(请参阅另一个问题的答案)。


小智 5

快速兼容性构建脚本(也适用于 Windows):

"build": "react-scripts build && rm -rf docs && mv build docs"
Run Code Online (Sandbox Code Playgroud)


小智 5

使用跨环境是解决方案。

安装跨环境:

npm install cross-env
Run Code Online (Sandbox Code Playgroud)

您应该更新为:

"scripts": {
  "build": "cross-env BUILD_PATH='../yourCustomBuildFolder' react-scripts build",
}
Run Code Online (Sandbox Code Playgroud)

  • 我收到 BUILD_PATH 无法识别的错误,但在应用您所说的内容后,我的问题得到了解决。 (2认同)