2016-02-23 2 views
2

С помощью модуля node-google я написал простой модуль узла, чтобы включить функцию «текстового веб-поиска» для моего веб-приложения, представляя результаты в одном из моих представлений.
Поскольку после небольшого количества запросов от одного и того же IP-адреса Google возвращает ошибку 503, я решил использовать модуль на клиенте, поэтому это ограничение на клиент, а не на сервер.
Я использовал browserify, чтобы преобразовать модуль узла в скрипт, который будет отправлен на клиентской странице.
Сценарий просто требует «google.js», и это только 20 строк JavaScript длинные:Browserify производит * огромный * выходной файл

'use strict'; 
var google = require('google'); 

var Google = Object.create({}); 
var Google.search = function(text, callback) { 
    ... 
}); 
// end of the script 

Команда я использую просто:

$ browserify google-search-module.js -o app/scripts/google-search.js 

Проблема в том, что выход browserify производит far больше, чем я ожидал: модуль 1.2 kB станет скриптом 2,4 МБ! Вероятно, он включает все «google» зависимости, но ..,

Вопрос в следующем: это нормально? Ожидается ли, что моя поисковая страница загрузит файл размером 2,4 МБ для поиска текста в Google?

Я совершенно уверен, что я что-то не хватает, но не могу понять, что ... :-(

+0

Помимо размера (вероятно, _is_, вызванного зависимостями), действительно ли он работает из браузера? – robertklep

+0

У меня нет причин сомневаться, что он действительно работает в браузере., Но я даже не тестировал его: это вторичная проблема, учитывая размер файла. Однако, если это поможет, я постараюсь в ближайшее время и сообщить об этом здесь. – MarcoS

+0

Если вы не можете заставить его работать в браузере для начала, большой размер больше не будет проблемой, я бы подумал: D – robertklep

ответ

2

Это ожидаемое поведение. Browserify нагрузки все модули, импортированные с require() рекурсивно, и выводит один файл Есть способы обойти это, но вряд ли они будут работать в вашем корпусе с паталией.

Как правило, с помощью Browserify вы можете работать с одним огромным пакетом в разработке, но затем построить гораздо меньшую производственную версию. jQuery, например, вы можете установить пакет локально в свою папку node_modules. Затем для производства вы можете установить --exclude, чтобы иметь Browserify игнорировать что-либо в вашей папке node_modules, вместо этого полагаясь на CDN для доставки jQuery клиенту.

Я говорю, что это вряд ли будет работать в вашем случае, потому что node-google действительно является модулем узла. Нет гарантии, что он будет работать в браузере (он может или не может быть). Вы действительно должны определить, работает ли он до того, как вы начнете планировать следующую линию атаки.

Если он работает, у вас есть два возможных средства:

  1. Минимизировать ваш пакет и убедитесь, что он подается сжатый. Результирующий размер файла, вероятно, будет меньше 100 КБ, если вы сможете с этим справиться.

  2. Найдите другой модуль для выполнения поиска Google или используйте его самостоятельно. Это, пожалуй, лучшее решение, если вы по какой-то причине не должны использовать node-google.

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

+1

Минимизирован и gzipped? По моему опыту, только minification, вероятно, возьмет его до 700 КБ или около того, а gzipping сделает все остальное. Возможно, я ошибаюсь, но в в любом случае, спрашивающий узнает, выбрали ли они этот маршрут. – McMath

+0

О, правильно. Я забыл про gzipping и не заметил, что вы упомянули это явно, мои извинения. – zerkms

+0

Спасибо, я обязательно проверю его в браузере как можно скорее. .. Я даже не знал о возможных проблемах с «браунированными» модулями узлов ... :-(О jQuery исключении, я не думаю, что это большое улучшение, на производстве у меня будет мой код на CDN, тоже ... – MarcoS

Смежные вопросы