2016-02-23 64 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