npm 如何更改React项目中的生产构建静态文件夹路径?

lsmepo6l  于 2023-03-03  发布在  React
关注(0)|答案(3)|浏览(409)

我有一个React项目,我在上面运行了npm run build,它为我做了一个生产构建。

<script src="./static/js/5.a4bfdba9.chunk.js"></script>

如您所见,路径集为./static/js/
但我希望将路径设置为./static/dashboard/js/5.a4bfdba9.chunk.js
我不知道在哪里或做什么改变,以确保每次运行构建时,它都采用我指定的路径,而不是默认路径?

**注意:**我查看了package.json中的"homepage": "."属性,但更改此属性只会在/static/js/之前附加一个路径

bjp0bcyl

bjp0bcyl1#

    • 更新日期:**

您需要更新webpack配置来实现这一点。有多种方法可以做到这一点:

  1. react-scripts弹出(不推荐)
    1.修补程序包
    1.React-应用-重新布线
    我提供了patch-package的步骤。
    你需要修改react-scripts包中的config/webpack.config.js文件,这是一个git diff,包含了你需要做的修改:
diff --git a/node_modules/react-scripts/config/webpack.config.js b/node_modules/react-scripts/config/webpack.config.js
index 26c2a65..ad29fbd 100644
--- a/node_modules/react-scripts/config/webpack.config.js
+++ b/node_modules/react-scripts/config/webpack.config.js
@@ -212,13 +212,13 @@ module.exports = function (webpackEnv) {
       // There will be one main bundle, and one file per asynchronous chunk.
       // In development, it does not produce real files.
       filename: isEnvProduction
-        ? 'static/js/[name].[contenthash:8].js'
+        ? 'static/dashboard/js/[name].[contenthash:8].js'
         : isEnvDevelopment && 'static/js/bundle.js',
       // TODO: remove this when upgrading to webpack 5
       futureEmitAssets: true,
       // There are also additional JS chunk files if you use code splitting.
       chunkFilename: isEnvProduction
-        ? 'static/js/[name].[contenthash:8].chunk.js'
+        ? 'static/dashboard/js/[name].[contenthash:8].chunk.js'
         : isEnvDevelopment && 'static/js/[name].chunk.js',
       // webpack uses `publicPath` to determine where the app is being served from.
       // It requires a trailing slash, or the file assets will get an incorrect path.
@@ -676,8 +676,8 @@ module.exports = function (webpackEnv) {
         new MiniCssExtractPlugin({
           // Options similar to the same options in webpackOptions.output
           // both options are optional
-          filename: 'static/css/[name].[contenthash:8].css',
-          chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',
+          filename: 'static/dashboard/css/[name].[contenthash:8].css',
+          chunkFilename: 'static/dashboard/css/[name].[contenthash:8].chunk.css',
         }),
       // Generate an asset manifest file with the following content:
       // - "files" key: Mapping of all asset filenames to their corresponding

现在,如果您对node_modules/react-scripts/config/webpack.config.js进行这些更改,您将得到输出到您想要的文件夹中的文件,并且index.html也将具有正确的路径。
但是如果你安装/卸载任何软件包,node_modules中的更改都会被覆盖。要保存这些更改,你可以使用patch-package,它会在安装后将你的更改写入node_modules。
以下是安装补丁包的步骤,您可以阅读他们的自述文件了解更多细节:

  1. yarn add patch-package postinstall-postinstall
    1.在package.json的脚本部分添加以下内容:
    "postinstall": "patch-package"
    1.运行patch-package以创建. patch文件:
    npx patch-package some-package
    1.提交修补程序文件以与您的团队共享修复程序
    git add patches/react-scripts+4.0.3.patch
    git commit -m "change output dir structure in react-scripts"
    我也创建了一个git repository供您参考。
    • 旧答案:**
    • 警告:**不适用于移动生成文件夹的内容。只能移动整个生成文件夹。例如:mv build/ dist/

改变create react应用程序的设置,使其输出到不同的文件夹将是非常复杂的。但你可以在构建完成后移动文件,这是非常简单的。
在您的package.json中有:

"scripts": {
  "build": "react-scripts build"

您可以添加另一个名为postbuild的脚本,它在构建之后执行一些操作,并将由npm/Yarn自动调用。

"postbuild": "mv build/ dist/"

这应该会将文件移动到不同的文件夹。

7tofc5zh

7tofc5zh2#

现在有了更好的解决方案。从hashrocket
当我构建CRA应用程序时,我会获得以/static开头的资产(css、图像)路径。如果我将应用程序部署到https://something.com/myapp,则应用程序将尝试访问https://something.com/static/asset.css处的资产路径。这不是资产所在的位置。资产所在的位置为https://something.com/myapp/static/asset.css
Create React App允许您在package.json文件中使用homepage属性更改构建资产的前缀。
您可以将其设置为myapp:

"homepage": "/myapp"

然后,资产的路径为/myapp/static/asset.css
在我的示例中,我对package.json进行了以下更改:

"homepage": "/search",
  "build": "react-scripts build && mkdir build/search && mv build/static build/search/static"

这是因为我有一个nginx反向代理服务/search到一个不同的端点,所以我所有的静态资产必须从/search/static服务。

3z6pesqy

3z6pesqy3#

以防其他人遇到类似的问题。我的问题是项目名称被前置到静态路径。
因此路径为/{project-name}/static/5.a4bfdba9.chunk.js而不是/static/5.a4bfdba9.chunk.js
按照提供的解决方案,我遇到了一个注解,指定“公共路径”是从主页推断出来的。在package.json中,我的主页url包括项目名称。

错误“主页”:“https://{URL}.io/项目名称”
正确“主页”:“https://{URL}.io/项目名称”

从此URL中删除项目名称解决了此问题。

相关问题