У меня есть проект 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) для хранения и использования моих списков, чтобы они не замедляли процесс. вниз, но это очень важно и в узле, и в браузере.
Как насчет использования этой техники? stackoverflow.com/questions/40173707/…
@TarunLalwani спасибо за предложение - я постараюсь использовать это.
@LeonardoSeccia, у тебя была возможность протестировать это?
@TarunLalwani, боюсь, что нет ... Я не дошел до этого - в настоящее время я использую browserify из командной строки, поэтому это решение будет означать изменение и этого ...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если у вас есть файлы с данными - просто загрузите их отдельно и не включайте в процесс сборки
На сервере используют:
пусть fs = require ('fs'); let yourContent = JSON.parse (fs.readFileSync ('путь / к / файлу'));
При использовании клиента:
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-запрос, который вы предпочитаете
Извините, я должен был сказать ... Он должен работать в автономном режиме, на стороне клиента ... Так что это решение не идеальное. Также, как бы вы могли автоматически переключаться между двумя ветвями кода? В идеале хотелось бы просто ускорить процесс сборки ...
Вы можете объединить файлы данных по отдельности, поэтому вам нужно будет повторно объединить их только при их изменении. Это возможно с использованием опций --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 на диск, что может быть основной причиной замедления, как я упоминал в комментариях ниже. Тем не менее, стоит попробовать.
Если даже что не работает, вы можете использовать другие, гораздо более хитрые подходы. Я пока перейду к их рассмотрению, потому что я не думаю, что они того стоят, если только вы не используете должен как один файл и не имеете другого способа сделать это. : \
После того, как я задал вопрос, это на самом деле лучшее решение, которое я нашел и что я сейчас делаю ... К сожалению, это означает несколько файлов.
У вас может быть сценарий, объединяющий файлы вместе, но, поскольку вы уже говорите browserify не анализировать их для проверки на наличие требований, я предполагаю, что большая часть задержки происходит из-за простой записи такого большого файла. Таким образом, вы, вероятно, не сможете ускорить его и по-прежнему выводить один файл.
С другой стороны, также возможно, что за это отвечает babelify. Поскольку вы не используете babelify с командой, которая строит пакет данных, просто объединение их может быть тем, что вам нужно. Все зависит от того, насколько велик ваш пакет данных на самом деле и насколько быстро ваш диск.
Компьютеры не творят чудес. JS выполняется в браузере, который выполняется в ОС.