Обнаружение React / ReactDOM разработка / сборка - PullRequest
0 голосов
/ 08 октября 2018

Реагирующая сборка разработки ведет себя иначе, чем производственная сборка, например, обработка ошибок.

Можно выяснить, какая из них используется из среды, но только в модульной среде, из-за того, как process.env.NODE_ENVиспользуется пакетом React :

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./cjs/react.production.min.js');
} else {
  module.exports = require('./cjs/react.development.js');
}

Случай, когда process.env может быть неприменим, это React, используемый глобально как модуль UMD, window.React и window.ReactDOM:

<script src="some-unknown-react-version.js"></script>

<script>
React // is it in production mode?
</script>

Возможные варианты использования:

  • компонент, который может работать в модульной и глобальной средах (публикуется как UMD) и по-разному визуализируется в производственном браузере

  • расширение или пользовательский сценарий, в котором режим сборки / производства обнаруживается из React или ReactDOM объекта

Как можно точно определить разработку / сборку React во время выполнения, не прибегая к среде?

Я ищу надежное и чистое решение, которое было бы применимо к React 15 и React 16. Если это возможно.

Это не дубликат похожих вопросов.потому что существующие ответы решают проблему через process.env.

Ответы [ 7 ]

0 голосов
/ 17 октября 2018

Некоторые коснулись использования факта, что производство всегда будет минимизировано, а развитие не будет минимизировано.Вот конкретное решение, которое использует это:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.6/react.js"></script>

<script>
const reactInfo = {
    version: React.version,
    development: (String((new React.Children.map()).constructor).length > 100)
};
console.log(reactInfo);
</script>

<div id="content"></div>

Я проверял это на дюжине версий реакции от v14 до v16.Из здесь вы можете видеть, что этот код не затрагивался с момента его первого написания, за исключением одного небольшого изменения год назад (что не повлияло бы на этот ответ, потому что слишком мало символов, хотя яВ любом случае, мы тестировали версии до 11 месяцев назад, и здесь есть приличный разрыв).

Примечание

Dev - 200 символов, Prod - 70, поэтому для персонажа Dev: Prod соотношение 3: 1соотношение.Я выбрал 100, потому что добавление 90 символов кода добавит 30 строк в prod, поэтому 100 - лучшее место с предоставленной информацией (технически ~ 105 или что-то в этом роде).Добавление 90 символов или удаление 100 символов крайне маловероятно для такой простой функции (функции, которая была изменена только один раз в 5 лет при редактировании 20 символов), поэтому я думаю, что она должна быть стабильной.

Для получения дополнительной информациистабильность или, по крайней мере, знание, если оно сломается, вы можете проверить, находится ли оно в пределах 25 символов от 70 и 200, и выдать ошибку, если это не так.Это должно отразить любые большие изменения (я бы дал 100% уверенность в том, что он никогда не скроет ошибку), но вы можете получить ложные срабатывания.Какой из них вы хотите, зависит от вашего варианта использования.

РЕДАКТИРОВАТЬ:

Если посмотреть на минимизацию, это регулярное выражение, которое выведет, если функция была минимизирована, так что вы можете безопасно использовать этот,Кроме того, произойдет сбой, если React.Children.map не является функцией (почти наверняка никогда не произойдет), которую вы можете либо поймать, либо не поймать в зависимости от того, насколько строго вы хотите обработать маловероятное событие ошибки (или просто проигнорируйте его, потому чтотипа, зачем им это когда-нибудь менять).Сигнатура функции сохраняется, даже если она преуменьшена до [native code], так что это скорее перспективный imo.Я бы пошел с первым для простоты, хотя.

const reactInfo = {
    version: React.version,
    development: !/function\s?\w?\(\w(,\w)*\)/.test(String((new React.Children.map()).constructor).split("{")[0])
};
0 голосов
/ 17 октября 2018

Есть разница.В режиме разработки для элементов React определено свойство _self, тогда как в рабочем режиме это свойство не определено.

Итак, решение состоит в том, чтобы проверить это свойство с помощью кода, подобного следующему:

function ReactIsInDevelomentMode(){ 
    return '_self' in React.createElement('div');
}
0 голосов
/ 17 октября 2018

Ваш вопрос ясен, но вы не уточняете систему сборки, используете ли вы webpack или parcel?у тебя есть Server Side Rendering или нет?вы запускаете ваше встроенное приложение по node или pm2?или вы просто создаете свое приложение, а затем помещаете встроенный файл внутри своей страницы, созданный с помощью других технологий, таких как PHP или C#?

На самом деле, приведенные выше вопросы могут определить ваш ответ, но, конечно, выиспользуйте модуль bundler, поэтому я предпочитаю использовать разрешение файла config в вашем проекте.

Если бы я был у вас, несомненно, я бы использовал webpack, два файла конфигурации веб-пакета, один для разработки и один для производстваРежим.затем я создаю папку, содержащую два файла с config.dev.js и config.prod.js.В веб-пакете разработки:

~~~
module.exports = {
        ~~~
        resolve: {
            extensions: ['.js', '.jsx'],
            alias: {
                ~~~
                Config: `${srcDir}/config/config.dev.js`,
                // srcDir is a defined variable for source directory
            }
        },
        ~~~

В веб-пакете разработки:

~~~
module.exports = {
        ~~~
        resolve: {
            extensions: ['.js', '.jsx'],
            alias: {
                ~~~
                Config: `${srcDir}/config/config.prod.js`,
                // srcDir is a defined variable for source directory
            }
        },
        ~~~

И теперь вы можете поместить каждые dev и prod данные для типов ваших сборок.например, в вашей config.dev.js можно написать:

module.exports = {
    buildType: "dev"
};

Конечно, в вашей config.prod.js можно написать:

module.exports = {
    buildType: "prod"
};

Абсолютно вы можете получить доступ к данным конфигурации с кодом ниже внутриваши react файлы:

import config from 'Config';

И с этим решением вы сможете понять тип вашей сборки в режиме реального времени выполнения вашего приложения.

Примечание: Для получения дополнительной информации, вы можете посмотреть мою статью среднего размера , а если вы не знакомы с продолжительным чтением, см. Статью хранилище Также более новую версиюпример моего ответа хранилище , содержащее конфиги.

0 голосов
/ 16 октября 2018

Как выглядит ваша настройка развертывания?Не существует «правильного» способа сделать то, что вы хотите.Я бы сфокусировался на различиях между производственной / разрабатываемой сборкой и созданием собственной вспомогательной функции.

РЕДАКТИРОВАТЬ: Похоже, невозможно определить версию prod / dev из класса React.

Две идеи:

  1. Я не уверен, как построено приложение, но PropTypes должен быть хорошим идентификатором ENV.
  2. Если ваше производствоПриложение React минимизируется, тогда вы можете просто определить, минимизирован ли код реагирования. (это будет хакерским, но оно должно работать, сосредоточиться на количестве пробелов или длине строки, ...)

Я заметил в комментариях ниже, что вы говорите, что minified !== production, если вы можете сделать это таким образом, то это, вероятно, ваш лучший выбор.В любом случае вам не нужно минимизировать код реакции разработки.

0 голосов
/ 16 октября 2018

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

Объект React доступен в глобальных переменных, и производственная сборка React отличается от разработкиВерсия, по крайней мере, одна вещь: она обычно минимизируется.Таким образом, мы можем попытаться проверить, работаем ли мы с уменьшенной версией или нет.

Для проверки вы можете сравнить имя функции с именем свойства метода объекта React, например:

let func = 'Component'
if (React[func].name === func) {
  // non-minified -> development build
}

Этот метод предназначен не для проверки производства и разработки, а для проверки минимизации, ипоскольку сборка производства обычно сводится к минимуму, она действительно может помочь.

0 голосов
/ 13 октября 2018

Обнаружение сборки dev / production на клиенте с использованием сборки umd кажется долгим процессом.Если существует такое требование, почему бы не создать приложение с create-react-app?

Я не буду судить о ваших решениях, так что вот что-то полезное.

react-dev-tools плагин предоставлен facebookопределяет тип сборки.

Вот соответствующая часть вышеупомянутого плагина:

https://github.com/facebook/react-devtools/blob/faa4b630a8c055d5ab4ff51536f1e92604d5c09c/backend/installGlobalHook.js#L23

Надеюсь, вы могли бы сделать его полезным.

0 голосов
/ 08 октября 2018

React предоставляет как версию для разработки, так и рабочую версию ссылки activ.js:

Разработка:

<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

Производство:

<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>

источник


И чтобы узнать, находится ли он в режиме разработки или производственном режиме без переменной среды , необходимо явно объявить некоторую переменную, назначив ее режим:(включите следующий сценарий вместе со сценарием реакции)

<script>
var devMode = 'development';
</script>

и при необходимости проверяйте devMode.


В качестве альтернативы вы можете проверить его режим следующим образом: (вам необходимодобавить идентификатор в тег скрипта)

var script_id = document.getElementById('script-attached-id');
console.log(script_id.getAttribute('src').includes('development'));

Таким образом, вам нужно только обновить исходный путь и определить режим.


И последний вариант, который я могу придуматьчтение самого файла и определение его режима с тех пор, как реакция упоминается в комментарии:

Разработка:

/** @license React v16.5.2
 * react.development.js

Производство:

/** @license React v16.5.2
 * react.production.min.js

Итак, после прочтенияфайл, просто проверьте его режим во второй строке.Или вы можете проверить на react.development.js без построчной проверки.

...