如何在不缩小的情况下构建 React 的生产版本?

IT技术 node.js reactjs minify create-react-app react-scripts
2021-04-22 05:20:58

背景

我一直在或多或少地遵循官方指南来设置带有 react 的本地开发环境,它似乎使用了create-react-app,这确实设置了很多。

现在,如果我运行,npm run build我会得到build文件夹中所有内容的缩小版本但是,如果我运行npm startNodeJS 服务的版本,则似乎没有任何修改。但是我看不到这些文件。

问题

所以要么:

  • 我可以访问npm start某个地方生成的文件吗?因为这些似乎是未修改的。build永远不会在那里修改)
  • 或者我可以以某种方式运行npm run build,所以它使用未最小化的文件进行“开发”构建?

尝试

我的目标只是访问未最小化版本的 react scripts

至于最后一个问题,我尝试了本问题中建议的一些参数和环境变量,但如您所见,它失败了:

$ NODE_ENV=dev npm run build --dev --configuration=dev

> example-project@0.1.0 build [...]
> react-scripts build

Creating an optimized production build...
[...]

系统

package.json有默认脚本:

  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

注意:请不要问我为什么这样做或试图说服我这是不好的。我可能想要这个的原因有很多,例如调试或这个特定用例

5个回答

要更改 webpack 配置和构建脚本,您必须从 create-react-app 中弹出(我不建议执行此步骤,因为它会破坏未来的兼容性),或者您可以使用 rewire 之类的工具来覆盖某些设置

看看这个 https://github.com/timarney/react-app-rewired

我个人使用只是重新布线

npm i rewire --save-dev

这是我过去为我的一个项目创建的示例配置,它运行良好!

  1. 创建一个 build.js
  2. 更改您的 package.json 以便它运行 build.js

构建.js

const rewire = require('rewire');
const defaults = rewire('react-scripts/scripts/build.js');
const config = defaults.__get__('config');

// Consolidate chunk files instead
config.optimization.splitChunks = {
  cacheGroups: {
    default: false,
  },
};
// Move runtime into bundle instead of separate file
config.optimization.runtimeChunk = false;

// JS
config.output.filename = '[name].js';
// CSS. "5" is MiniCssPlugin
config.plugins[5].options.filename = '[name].css';
config.plugins[5].options.publicPath = '../';

然后在我的 package.json 中,我更改了这样的 npm 脚本链接(将运行 build.js 脚本的节点构建)

包.json

"scripts": {
    "start": "react-scripts start",
    "build": "node build && gulp",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

所以如果你真的想从 create-react-app 中弹出,你所要做的就是运行

npm run-script eject

然后您将获得一个包含 create-react-app 使用的所有配置的新文件夹

但是正如我之前所说的,没有理由不使用重新布线而只是覆盖配置而不是弹出

如果有帮助,请不要忘记标记为答案干杯和成功

^ 当我这样做时,它返回 null - 你确定你的名字是对的,@uɥƃnɐʌuop ? const minifier = config.plugins.find((plugin) => plugin.constructor.name === "MiniCssExtractPlugin");
2021-05-24 05:20:58
这个信息让我走上了战争之路,谢谢。我切换到react-app-rewired. 按照步骤 1-3 到config-overrides.js,并使用扩展运算符修改默认的 webpack 配置。
2021-05-26 05:20:58
@dylanh724,不,我不能确定它通常是什么,我只知道在我发表评论时这是有效的。它可能是特定于配置的,或者从那时起可能已经改变。我记得我注销了每个插件的 constructor.name 以获得MiniCssExtractPlugin
2021-06-13 05:20:58
我使用上面的脚本加上这个工作: config.optimization.minimize = false;
2021-06-14 05:20:58
在我的情况下,minifier 是索引 4.. 而不是使用config.plugsin[5]你最好的东西: const minifier = config.plugins.find((plugin) => plugin.constructor.name === "MiniCssExtractPlugin");以避免在 create react 应用程序构建脚本被更改时出现错误。
2021-06-15 05:20:58

为什么看不到源文件?这是我会尝试的:

  1. 启动你的react应用程序 npm run start
  2. 打开浏览器 http://localhost:3000
  3. 打开开发人员工具并检查 webpack-dev 服务器创建的分块包在 Mac 上的 Chrome 中,您可以执行以下操作:cmd+option+j将打开开发人员工具。然后单击选项卡:在此选项卡中,您将看到由 react 的构建配置创建的包现在这些包的输出可能不漂亮,但它就在那里。

或者,webpack.config.js即使您使用create-react-app. 由于此配置只是封装在react-scriptsnode module中因此,也许您可​​以尝试直接编辑此文件,而无需弹出:<base_path>/node_modules/react-scripts/config/webpack.config.js尽管您需要小心不要破坏现有的配置设置。您可能想弄乱source-map生产版本设置。至少这样,如果你破坏了这个文件,你总是可以删除并重新安装,react-scripts然后回到你的初始配置。这也将允许您在“半安全”沙盒环境中进行自定义。请记住,没有魔法create-react-app可以提供,而只是在制造构建配置的有用默认值。

最后,正如@xzesstence 指出的,您可以尝试react-app-rewiredmodule。

希望这有帮助!

它还取决于您希望如何使用 create-react-app,因为它旨在提供适合大多数用例的良好默认值,而不是个人自定义。create-react-app 背后没有什么神奇之处,它只是为构建配置提供有用的项目结构和良好的默认值。它有点混淆了这个好的/坏的细节,但如果你没有使用 create-react-app 你就必须设置这些细节。至于库选项,我明白你的观点,我并不反对它,因为我个人喜欢精细控制并提供我自己的构建配置
2021-05-24 05:20:58
我不确定我是否同意,但我也认为这是每个开发人员的个人偏好。没有导出到浏览器,您只是使用开发人员工具,就像它们用于第一个选项的方式一样。这是开发人员工具的重点,因为它是每个前端开发人员日常工作的一部分,而开发工具是一个很棒的工具集。第二个选项是修改 webpack.config.js 中的构建配置以获取推荐的构建目录文件。尽管您肯定可以破坏module,但只需安装即可恢复正常
2021-05-31 05:20:58
那么你应该尝试重新布线的方式,这不是解决方法,它不会破坏任何东西......你实际上只是添加一个像我发布的那样的 build.js 然后你根据需要修改配置..你可以更新依赖项而没有任何限制和你永远不会失去你的配置。首先我和你一样想,为什么这这么复杂,但它真的很简单,而且他们添加默认配置作为依赖项是有逻辑的。总的来说,这是一个很好的解决方案,我真的可以推荐。我在一个巨大的生产环境中多次使用它,试一试看看你会得到什么
2021-06-06 05:20:58
但是使用该库会增加新团队成员学习的额外复杂性,因此您必须权衡这与仅拥有有效配置。但最终这是个人喜好,只要一切正常,就没有错误的选择:)
2021-06-10 05:20:58
虽然您建议的所有内容在技术上都是可行的,但当我更新 npm module等时,这似乎是一个很大的解决方法,很有可能会中断。而且它实际上并没有按照设计/预期的方式使用工具(npm 等)。通过浏览器导出也很难看,因为我想要一个目录中的所有文件,但在浏览器中我只能 AFAIK 打开单个文件,并且可能手动复制/粘贴它们,但不......这永远不适合开发人员的工作流程. (特别是因为我需要经常这样做!)
2021-06-11 05:20:58

我想要一个 React 应用程序的未混淆代码——主要是出于好奇,我有源代码——同时有在 Angular 中重写它的工作(生成一个更易于维护的应用程序,其大小为 5%,依赖项为 1%)。

我从未使用过 React 但通过修改文件发现

<base_path>/node_modules/react-scripts/config/webpack.config.prod.js

并用以下内容替换 module.exports 下的大型优化配置项...

module.exports = {...

    optimization: {
            minimize: false,
            splitChunks: {
                chunks: 'all',
                name: true
            },
            runtimeChunk: true
        },

npm run build构建了未混淆的、可读的代码,按预期运行,没有使用其他修改。仅将 Gitbash 与命令npm installnpm run buildnpm start 一起使用 - 只是认为有人可能会觉得这很有用。

我不推荐这个,因为你想要的代码仍然包裹在 webpack eval 中。从源代码中选择有用的部分或重新构建应用程序会更容易。充其量,我必须了解集群 react 和 webpack 是什么。

使用那个仍然对我有用。也许隐藏配置文件,如果它构建,就会有不止一个配置。另外,我仅使用 gitbash npm 命令进行构建。
2021-06-12 05:20:58
我正在运行 VS2019,以上对我不起作用。没有 webpack.config.prod.js 文件,只有 webpack.config.js。我确实在 webpack.config.js 中找到了“优化”键并将其替换为上面的,但它仍然发布了缩小的输出。无论如何,谢谢!
2021-06-19 05:20:58

该文件被保存在服务器进程内存中并不会写入到磁盘,除非你退出脚本(或者是否有可能使用像“联控”的工具),并修改它们以使用其写入到磁盘writeToDisk选项中所描述的webpack DevServer 文档

但是,您可以通过导航到webpack-dev-server服务器下的端点来获取实际的文件列表/链接

例如,如果在 localhost:3000 使用默认 url,则使用以下 url 来查看服务器上的所有文件:

http://localhost:3000/webpack-dev-server

但您真正需要的只是 index.html(通常只是加载 JS 文件的存根)和以下 3 个 JS 文件,它们在所有 create-react-app 分期付款中似乎都一致,以及它们各自的源代码地图文件。

  1. main.chunk.js
  2. 包.js
  3. 供应商~main.chunk.js

您可以右键单击页面上的链接并保存它们,或者您可以直接导航链接或从 Chrome 开发工具“源”选项卡中获取它们。

请注意,通常对于代码更改仅更新 main.chunk.js 文件,因此对于平均代码更改,您可能只获取更新的 main.chunk.js 和 main.chunk.js.map 文件。

我知道现在回答这个为时已晚,但试试这个npm i -D cra-build-watch

我觉得这个库被低估了,但它只是观察 react 应用程序中的变化,而不是一次又一次地重新构建整个包。

尽管重新布线有助于通过不缩小构建来进行构建,但是,它仍然会一次又一次地经历整个构建过程。