2016-02-23 99 views
2

藉助node-google模塊,我編寫了一個簡單的節點模塊,爲我的Web應用啓用了「文本網頁搜索」功能,並在我的某個視圖中顯示結果。
由於來自同一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產生是大於我所期望的:一個1.2 kB模塊成爲一個2.4 MB的腳本!也許它也包括所有'谷歌'的依賴關係,但.. ..,

問題是:這是正常的嗎?我的搜索頁面是否預計會加載一個2.4 MB文件來搜索Google上的一些文本?

我敢肯定,我失去了一些東西,但無法理解什麼... :-(

+0

除了大小(這可能是由依賴關係引起的),它實際上是從瀏覽器工作嗎? – robertklep

+0

我沒有理由懷疑它實際上在瀏覽器中工作..但是,我甚至沒有測試它:這是一個次要問題,考慮到文件的大小。但是,如果這可以幫助,我會盡快嘗試並在此處報告。 – MarcoS

+0

如果你不能在瀏覽器中使用它,大尺寸不會再是問題了,我想:D – robertklep

回答

2

這是預期的行爲。Browserify加載所有模塊中引入與require()遞歸,並輸出一個單獨的文件。有一些方法可以解決這個問題,但它們不太可能在你的特定情況下工作。

通常情況下,使用Browserify,你可能在開發中使用一個巨大的包,但是然後構建一個更小的生產版本。例如,您可以將包裝本地安裝到您的node_modules文件夾中。然後,對於生產,您可以設置--exclude標誌讓Browserify忽略您的node_modules文件夾中的任何內容,而不是依靠CDN向客戶端傳遞jQuery。

我說這不太可能在你的情況下工作,因爲node-google真的是一個節點模塊。不能保證它能在瀏覽器中工作(它可能會也可能不會)。在開始計劃下一行攻擊之前,你應該確定它是否正在工作。

如果是工作,你有兩種可能的補救措施:

  1. 縮減大小的包,並確保其供應gzip壓縮。如果你能忍受這一點,那麼最終的文件大小可能會少於100kB。

  2. 找到一些其他的模塊來做Google搜索,或者實現你自己的一個模塊。這可能是最好的解決方案,除非你出於某種原因必須使用node-google。

當然,如果它不在瀏覽器中工作,只能使用第二種解決方案。

+1

縮小和gzipped?根據我的經驗,縮小本身可能會降低到700kB左右,而gzip應該完成剩下的工作,我可能是錯的,但在任何情況下,提問者會發現他們是否選擇了這條路線 – McMath

+0

噢,對,我忘了gzip,並沒有注意到你明確提到了,我的歉意 – zerkms

+0

謝謝,我會盡快在瀏覽器中測試它。 ..我甚至不知道'browserified'節點模塊可能存在的問題... :-(關於jQuery排除,我認爲這不是一個很大的改進,在生產中我也會將我的代碼放在CDN上... – MarcoS