Что означает «Генератор кода деоптимизировал стиль [некоторый файл], так как он превышает максимум« 100 КБ »»?

165

Я добавил новый пакет npm в свой проект и требует его в одном из моих модулей.

Теперь я получаю это сообщение из веб-пакета,

build modulesNote: The code generator has deoptimised the styling of "D:/path/to/project/node_modules/ramda/dist/ramda.js" as it exceeds the max of "100KB".

Что это означает? Нужно ли предпринимать какие-то действия?

Йохан Алкстол
источник
Можете ли вы разместить конфигурацию вашего Webpack где-нибудь? Что такое пакет NPM?
Юхо Вепсяляйнен,
Йохан, обязательно прими ответ, который решил это за тебя
Дана Вудман

Ответы:

151

Это связано с compactопцией компилятора Babel, которая дает команду «не включать лишние пробельные символы и ограничители строки. Когда установлено« auto », для параметра compact задано значение« true »при входных размерах> 100 КБ.» По умолчанию его значение равно «auto», поэтому, вероятно, вы получаете предупреждение. Смотрите документацию Babel .

Вы можете изменить эту опцию из Webpack, используя параметр запроса . Например:

loaders: [
    { test: /\.js$/, loader: 'babel', query: {compact: false} }
]
Рикардо Стювен
источник
17
И если у вас есть несколько загрузчиков, вы можете использовать ?compact=falseвместо queryпараметра. Например:{test: /\.js$/, loaders: ['ng-annotate', 'babel?compact=false']}
кендснайдер
4
Также мы можем добавить опцию в файл .babelrc, чтобы очистить файл webpack.config.js, например добавить {"compact": true} в файл .babelrc.
Рон
3
@Ricardo Stuven, но зачем мне менять его на false? кажется положительным, что «не включать лишние пробельные символы и ограничители строк»
omriman12
1
@Ben, так что, в основном, мы установим значение false только при разработке?
omriman12
2
@ omriman12 Это зависит от того, как вы собираетесь использовать вывод. Если это производственная сборка, которая будет минимизирована, то нет никакого значения в установке этого параметра в false. Для таких случаев, как мой, где важен формат вывода, это имеет значение. Как и большинство вещей, это зависит. :)
Бен
48

Кажется, это ошибка Вавилона . Я предполагаю, что вы используете babel-loader и не исключаете внешние библиотеки из вашего теста loader. Насколько я могу судить, сообщение не вредно, но вы все равно должны сделать что-то вроде этого:

loaders: [
    { test: /\.js$/, exclude: /node_modules/, loader: 'babel' }
]

Посмотри. Это было это?

mhelvens
источник
1
Странно, я вижу то же самое сообщение (также для ramda), хотя я делаю exclude: /node_modules/.
Роман Поминов
Тот же путь, тоже? Может быть, ваша внешняя библиотека находится в другом месте? Если нет, вы также можете попробовать решение Рикардо. Эта проблема не очень критична.
Мельвенс
Виноват. Я проверял неправильный конфиг. Фактический не имел exclude.
Роман Поминов
Я нашел этот ответ лучше. Спасибо @mhelvens
Мосия Табо
22

Любой из следующих трех вариантов избавляет от сообщения (но по разным причинам и с различными побочными эффектами, я полагаю):

  1. исключить node_modulesкаталог или явно includeкаталог, в котором находится ваше приложение (которое предположительно не содержит файлов, превышающих 100 КБ)
  2. установите опцию Babel compact на true(фактически любое значение , отличное от «авто»)
  3. установить опцию Babel compactк false(см выше)

# 1 в приведенном выше списке может быть достигнуто либо путем исключения node_modulesкаталога, либо путем явного включения каталога, в котором находится ваше приложение.

Например, в webpack.config.js:

let path = require('path');
....
module: {
     loaders: [
          ...
          loader: 'babel',
          exclude: path.resolve(__dirname, 'node_modules/')

... или с помощью include: path.resolve(__dirname, 'app/')(снова в webpack.config.js).

№ 2 и № 3 в приведенном выше списке могут быть выполнены с помощью метода, предложенного в этом ответе или (мои предпочтения) путем редактирования .babelrcфайла. Например:

$ cat .babelrc 
{
    "presets": ["es2015", "react"],
    "compact" : true
}

Протестировано со следующей настройкой:

$ npm ls --depth 0 | grep babel
├── babel-core@6.7.4
├── babel-loader@6.2.4
├── babel-preset-es2015@6.6.0
├── babel-preset-react@6.5.0
Маркус Юний Брут
источник
8

Я попробовал путь Рикардо Стювена, но у меня это не сработало. В итоге получилось добавить «compact»: false в мой файл .babelrc:

{
    "compact": false,
    "presets": ["latest", "react", "stage-0"]
}
Юсинто Нгадиман
источник
1
Используя babel 6.5.x, webpack 2, у меня было то же сообщение, но для lodash.js, и это решило проблему.
phil_lgr
Пришел, искал это :)
информер
Спасибо, у меня было то же самое
Henkie85
4

Для более подробного объяснения THIS LINK, Babel compilerкоманда может не включать лишние пробельные символы и ограничители строки. несколько раз назад его порог был, 100KBно сейчас есть 500KB.

Я предлагаю вам отключить эту опцию в вашей среде разработки, с этим кодом в .babelrcфайле.

{
    "env": {
      "development" : {
        "compact": false
      }
    }
}

Для производственной среды Babelиспользуйте конфигурацию по умолчанию auto.

AmerllicA
источник
2

В реакции / redux / webpack / babel build эта ошибка исправлена ​​путем удаления типа тега script text / babel

получил ошибку:

<script type="text/babel" src="/js/bundle.js"></script>

Нет ошибки:

<script src="/js/bundle.js"></script>
Виталий Котов
источник
1

в webpack 4 с несколькими правилами для модулей вы просто делаете что-то подобное в своем правиле .js:

{
     test: /\.(js)$/,
     loader: 'babel-loader',
     options: {
          presets: ['es2015'],    // or whatever
          plugins: [require('babel-plugin-transform-class-properties')], // or whatever
          compact: true    // or false during development
     }
},
Steev
источник
1

Возможно, это не тот случай, когда исходный вопрос OP, но: если вы превышаете максимальный размер по умолчанию, это может быть признаком какой-то другой проблемы, с которой вы столкнулись. в моем случае у меня было предупреждение, но в конечном итоге оно превратилось в ФАТАЛЬНУЮ ОШИБКУ: MarkCompactCollector: полупространственная копия, откат в старом поколении. Выделение не удалось - куча JavaScript из памяти. причина была в том, что я динамически импортировал текущий модуль, так что это закончилось бесконечным циклом ...

Шмуэль Фридман
источник
Это было для меня симптомом - я начал удалять / добавлять свои импорта, чтобы попытаться отследить их. Нарушающий скрипт использовал динамический require ( require('../../../' + a + '/' + b)). Удаление его решило проблему (и оно никогда не вернется).
Фрэнк
Не уверен, почему за это проголосовали, это была моя проблема. Спасибо, Шмуэль!
Арон