Как создать производственную версию React без минификации?

Фон

Я следовал более или менее официальному руководству по настройке локальная среда разработки с реакцией, и она, кажется, использует create-react-app, что очень много настраивает.

Теперь, если я запускаю npm run build, я получаю уменьшенную версию всего в папке build. Однако если я запустил npm start, версия, которую обслуживает NodeJS, не будет иметь никаких модификаций. Но я не вижу этих файлов.

Вопрос

Так что либо:

  • Могу ли я где-нибудь получить доступ к файлам, созданным npm start? Поскольку они кажутся неизменными. (build там никогда не изменяется)
  • Или можно как-то запустить npm run build, чтобы он делал "развивающую" сборку с неминимизированными файлами?

Пытается

Моя цель - просто получить доступ к неограниченной версии сценариев реакции.

Что касается последнего вопроса, я пробовал некоторые параметры и переменные среды. как предлагается в этом вопросе, но, как видите, это не удалось:

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

> [email protected] 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"
  },

Примечание. Не спрашивайте, почему я это делаю, и не пытайтесь убедить меня, что это плохо. Есть много причин, по которым я, возможно, захочу это, например отладка или этот конкретный вариант использования.


person rugk    schedule 14.03.2019    source источник
comment
Кстати, поскольку это кажется очень сложной задачей, я спросил create-react-app devs, может ли это быть реализовано по умолчанию в их скриптах.   -  person rugk    schedule 14.03.2019


Ответы (5)


Чтобы изменить конфигурацию веб-пакета и сценарии сборки, вам нужно либо извлечь из приложения create-react-app (я бы не рекомендовал этот шаг, поскольку он нарушает совместимость в будущем), либо вы можете использовать такие инструменты, как rewire, чтобы переопределить некоторые настройки

Взгляните на этот https://github.com/timarney/react-app-rewired

Я лично использовал просто перепайку

npm i rewire --save-dev

Вот пример конфигурации, которую я создал для одного из моих проектов в прошлом, и она сработала очень хорошо!

  1. Создайте build.js
  2. Измените свой package.json так, чтобы он запускал build.js

build.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)

package.json

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

Итак, если вы действительно хотите выйти из приложения create-response-app, все, что вам нужно сделать, это запустить

npm run-script eject

Затем вы получите новую папку со всеми конфигурациями, используемыми приложением create-response-app.

Но, как я сказал ранее, нет причин, почему бы не использовать rewire и просто переопределить конфигурацию вместо извлечения

если это поможет, пожалуйста, не забудьте отметить как ответ Ура и удачи

person xzesstence    schedule 14.03.2019
comment
Благодаря этой информации я оказался на тропе войны. Я перешел на react-app-rewired. Выполнили шаги с 1-3 по config-overrides.js и использовали операторы распространения для изменения конфигурации веб-пакета по умолчанию. - person fionbio; 23.07.2019
comment
Я получил это, используя приведенный выше сценарий плюс: config.optimization.minimize = false; - person Peter W; 24.10.2020
comment
В моем случае минификатором был индекс 4 ... вместо использования config.plugsin[5] лучше всего использовать что-то вроде: const minifier = config.plugins.find((plugin) => plugin.constructor.name === "MiniCssExtractPlugin");, чтобы избежать ошибок при изменении сценария сборки приложения create response. - person uɥƃnɐʌuop; 16.01.2021
comment
^ Это возвращает null, когда я это делаю - вы уверены, что правильно поняли имя, @ uɥƃnɐʌuop? const minifier = config.plugins.find((plugin) => plugin.constructor.name === "MiniCssExtractPlugin"); - person dylanh724; 28.03.2021
comment
@ dylanh724, нет, я не уверен, что это обычно, я просто знал, что это работало, когда я оставил комментарий. Вероятно, это конкретная конфигурация или, возможно, с тех пор изменилась. Я помню, что я выходил из системы с именем constructor.name каждого плагина, чтобы получить MiniCssExtractPlugin - person uɥƃnɐʌuop; 28.03.2021
comment
Следует отметить: react-app-rewired сейчас поддерживается сообществом. - person Rohim Chou; 20.05.2021

Почему вы не видите исходные файлы? Вот что я бы попробовал:

  1. Запустите свое приложение для реагирования с npm run start
  2. Откройте в браузере http://localhost:3000
  3. Откройте Инструменты разработчика и проверьте созданные пакеты с фрагментами сервером webpack-dev. В Chrome на Mac вы можете сделать следующее: cmd+option+j откроет инструменты разработчика. Затем щелкните вкладку источники: на этой вкладке вы увидите пакеты, созданные конфигурацией сборки response. Результат этих пакетов может быть некрасивым, но все это есть.

В качестве альтернативы, все параметры конфигурации сборки вашего приложения содержатся в вашем webpack.config.js файле, даже если вы используете create-react-app. Поскольку эта конфигурация просто инкапсулирована внутри модуля react-scripts node. Так что, возможно, вы могли бы попробовать отредактировать этот файл напрямую, не извлекая: <base_path>/node_modules/react-scripts/config/webpack.config.js. Хотя вам нужно быть осторожным, чтобы не нарушить существующий параметр конфигурации. Вероятно, вы захотите поиграть с source-map настройками для производственных сборок. По крайней мере, таким образом, если вы испортите этот файл, вы всегда можете просто удалить и переустановить react-scripts и вернуться к исходной конфигурации. Это также позволит вам поиграть со своими настройками в «полубезопасной» изолированной среде. Помните, что create-react-app не предлагает никакого волшебства, а просто устанавливает полезные значения по умолчанию для вашей конфигурации сборки.

Наконец, как указал @xzesstence, вы можете попробовать модуль react-app-rewired .

Надеюсь, это поможет!

person Nathan    schedule 14.03.2019
comment
Хотя все, что вы предлагаете, вероятно, технически возможно, это большой обходной путь с большим потенциалом поломки, когда я обновляю модули npm или около того. И он действительно использует инструменты (npm и т. Д.) Не так, как они предназначены / предназначены. Экспорт через браузер также уродлив, поскольку я, например, хочу, чтобы все файлы были в каталоге, но в браузере я могу AFAIK открывать только отдельные файлы и, возможно, могу вручную скопировать / вставить их, но нет ... это никогда не вписывается в рабочий процесс разработчика. (тем более, что мне нужно это делать часто!) - person rugk; 14.03.2019
comment
тогда вы должны попробовать способ перепрограммирования, и это не обходной путь, и он ничего не сломает ... вы буквально просто добавляете build.js, как тот, который я опубликовал, а затем изменяете конфигурацию по мере необходимости ... вы можете обновлять зависимости без каких-либо ограничений и вы никогда не потеряете свой конфиг. Сначала я думал так же, как и вы, почему это так сложно, но это действительно просто, и есть логические причины, по которым они добавили конфигурации по умолчанию в качестве зависимостей. это отличное решение в целом, я действительно могу порекомендовать. Я использовал его несколько раз в огромной производственной среде, просто попробуйте и посмотрите, что вы получите - person xzesstence; 14.03.2019
comment
Не уверен, что согласен, но я также думаю, что это личное предпочтение каждого разработчика. Нет экспорта в браузер, который вы просто используете с помощью инструментов разработчика, как они должны были использоваться для первого варианта. В этом суть инструментов разработчика, поскольку они являются повседневной частью каждого фронтенд-разработчика, а инструменты разработчика - фантастический набор инструментов. Второй вариант - изменить конфигурацию сборки в вашем webpack.config.js, чтобы получить рекомендуемые файлы каталога сборки. Хотя вы наверняка можете сломать модуль, его просто установить, чтобы он не вернулся в нормальное состояние. - person Nathan; 14.03.2019
comment
Это также зависит от того, как вы хотите использовать приложение create-react-app, поскольку оно предназначено для обеспечения хороших значений по умолчанию, которые подходят для большинства случаев использования, но не для индивидуальных настроек. В приложении create-react-app нет никакой магии, он просто предоставляет полезную структуру проекта и хорошие значения по умолчанию для конфигурации сборки. Это как бы запутывает детали, что хорошо / плохо, но если бы вы не использовали приложение create-react-app, вам пришлось бы настроить эти детали. Что касается опции библиотеки, я понимаю вашу точку зрения и не возражаю против нее, поскольку лично мне нравится иметь детальный контроль и я бы предоставил свои собственные конфигурации сборки - person Nathan; 14.03.2019
comment
Но использование библиотеки добавляет дополнительный уровень сложности для изучения новыми членами команды, поэтому вам нужно сопоставить это с простой рабочей конфигурацией. Но, в конце концов, это личное предпочтение, и нет неправильных вариантов, пока все работает :) - person Nathan; 14.03.2019

Мне нужен был необфусцированный код приложения 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 install, npm run build и npm start. Просто подумал, что кому-то это может пригодиться.

Я не рекомендую это делать, потому что код, который вам нужен, все еще обернут в беспорядок eval webpack. Проще выбрать полезные фрагменты из источника или просто пересобрать приложение. В лучшем случае я должен был увидеть, что такое реакция кластера и веб-пакет.

person KellyCode    schedule 14.10.2020
comment
Я использую VS2019, и это не сработало для меня. Нет файла webpack.config.prod.js, только webpack.config.js. Я нашел ключ «оптимизации» в webpack.config.js и заменил его указанным выше, но он по-прежнему публиковал минимизированный вывод. В любом случае спасибо! - person user481779; 15.10.2020
comment
Использование этого все еще работает для меня. Возможно, сохраните файл конфигурации, и, если он будет собран, будет несколько конфигураций. Кроме того, я создаю только команды gitbash npm. - person KellyCode; 16.10.2020

Файлы хранятся в памяти процесса сервера и не записываются на диск, если только вы не извлечете сценарии (или если возможно использовать такой инструмент, как 'rewire') и измените их для записи на диск с помощью параметра writeToDisk, как описано в документацию Webpack DevServer.

Однако вы можете получить фактический список файлов / ссылки, перейдя к конечной точке webpack-dev-server на сервере.

Например, если вы используете URL-адрес по умолчанию на localhost: 3000, используйте следующий URL-адрес для просмотра всех файлов на сервере:

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

Но что вам действительно нужно, так это только index.html (который, как правило, просто заглушка, загружающая файлы JS) и 3 следующих файла JS, которые кажутся единообразными во всех установках приложения create-response-app, вместе с их соответствующим источником. файлы карты.

  1. main.chunk.js
  2. bundle.js
  3. поставщики ~ main.chunk.js

Вы можете просто щелкнуть правой кнопкой мыши ссылки на странице и сохранить их, или вы можете перейти по прямой ссылке или получить их на вкладке источников Chrome Dev Tools.

Обратите внимание, что обычно при изменении кода обновляется только файл main.chunk.js, поэтому для среднего изменения кода вы можете просто получить обновленные файлы main.chunk.js и main.chunk.js.map.

person yoel halb    schedule 09.06.2021

Я знаю, что уже слишком поздно отвечать на этот вопрос, но попробуйте это npm i -D cra-build-watch.

Я считаю, что эта библиотека недооценена, но она просто следит за изменениями в приложении React и не перестраивает весь пакет снова и снова.

Хотя перемонтаж помогает в создании сборки, не уменьшая ее, тем не менее, она проходит через весь процесс сборки снова и снова.

person Sharan Singh    schedule 23.01.2021