Browserify и Babelify очень медленно из-за больших файлов данных js

У меня есть проект nodejs, который использует большие списки словарей (миллионы записей), хранящиеся в файлах js, которые выглядят так:

module.exports = ["entry1", "entry2", "entry3", "entry4", "entry5", etc.];

а затем я использую их из других файлов, например:

var values = require('./filePath');

Это отлично работает, и это также работает в браузере (с использованием browserify), однако объединение занимает много времени - около 10 минут.

Я использую следующую команду для создания пакета: browserify "./src/myModule.js" --standalone myModule -t [ babelify --presets [ es2015 stage-2 ] --plugins ["transform-es2015-classes", {"loose": true}]

Я пытался избежать синтаксического анализа моих файлов словарей js с помощью --noparse ["path1", "path2", "path3", etc.], но это не имело никакого значения.

В идеале я хотел бы просто ускорить процесс browserify \ babelify, однако, если это невозможно, я был бы очень рад найти другой способ (например, избегать require) для хранения и использования моих списков, чтобы они не замедляли процесс. вниз, но это очень важно и в узле, и в браузере.

Компьютеры не творят чудес. JS выполняется в браузере, который выполняется в ОС.

D. Pardal 06.04.2018 15:49

Как насчет использования этой техники? stackoverflow.com/questions/40173707/…

Tarun Lalwani 07.04.2018 15:28

@TarunLalwani спасибо за предложение - я постараюсь использовать это.

Leo 09.04.2018 13:35

@LeonardoSeccia, у тебя была возможность протестировать это?

Tarun Lalwani 13.04.2018 14:57

@TarunLalwani, боюсь, что нет ... Я не дошел до этого - в настоящее время я использую browserify из командной строки, поэтому это решение будет означать изменение и этого ...

Leo 13.04.2018 15:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
5
563
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если у вас есть файлы с данными - просто загрузите их отдельно и не включайте в процесс сборки

  1. Отформатируйте файлы больших данных в формате JSON
  2. На сервере используют:

    пусть fs = require ('fs'); let yourContent = JSON.parse (fs.readFileSync ('путь / к / файлу'));

  3. При использовании клиента:

    let request = require ("клиент-запрос"); // делаем npm install client-request

    var options = { uri: "http: //.com/path/to/file", json: правда }

    var req = request (параметры, обратный вызов функции (ошибка, ответ, тело) { console.info (response.statusCode) if (body) { пусть yourContent = body } })

Или используйте любую другую библиотеку, которая выполняет HTTP-запрос, который вы предпочитаете

Извините, я должен был сказать ... Он должен работать в автономном режиме, на стороне клиента ... Так что это решение не идеальное. Также, как бы вы могли автоматически переключаться между двумя ветвями кода? В идеале хотелось бы просто ускорить процесс сборки ...

Leo 10.04.2018 20:25
Ответ принят как подходящий

Вы можете объединить файлы данных по отдельности, поэтому вам нужно будет повторно объединить их только при их изменении. Это возможно с использованием опций --require -r и --external -x.

Чтобы создать пакет данных, сделайте что-то вроде этого:

browserify -r ./path/to/data.js -r ./path/to/other/data.js > data-bundle.js

Полученный data-bundle.js будет определять функцию require глобально, которую можно использовать для получения любого файла, указанного в приведенной выше команде. Просто убедитесь, что вы включили этот пакет в тег скрипта перед основным пакетом.

Было бы неплохо иметь возможность --require шаблон глобуса, но, к сожалению, browserify не поддерживает это. Если вы попытаетесь использовать оболочку для расширения шаблона, опция -r будет применяться только к первому, что отстой. Вероятно, вы можете написать сценарий оболочки, который создает команду из ls или чего-то еще, чтобы избежать необходимости перечислять все файлы данных явно, но я думаю, что это выходит за рамки вопроса.

Чтобы создать свой основной пакет без перестройки файлов данных, просто добавьте в свою команду такую ​​опцию:

-x './path/to/data/*.js'

Это говорит browserify игнорировать их и позволять втягивать их через глобальную функцию require, созданную вашим другим пакетом. Как видите, он поддерживает шаблоны глобусов, так что это немного проще.

Обновлять:

Чтобы объединить два пакета в один, просто поместите что-то вроде этого в конец сценария оболочки, который начинается с команды browserify, которая создает ваш основной пакет:

cat data-bundle.js main-bundle.js > bundle.js
rm main-bundle.js

К сожалению, при этом всегда придется записывать копию data-bundle.js на диск, что может быть основной причиной замедления, как я упоминал в комментариях ниже. Тем не менее, стоит попробовать.

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

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

Leo 10.04.2018 22:03

У вас может быть сценарий, объединяющий файлы вместе, но, поскольку вы уже говорите browserify не анализировать их для проверки на наличие требований, я предполагаю, что большая часть задержки происходит из-за простой записи такого большого файла. Таким образом, вы, вероятно, не сможете ускорить его и по-прежнему выводить один файл.

sripberger 11.04.2018 15:29

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

sripberger 11.04.2018 16:07

Другие вопросы по теме