Browserify生成一个* huge *输出文件

时间:2016-02-23 18:48:57

标签: javascript node.js browserify

借助node-google模块,我编写了一个简单的节点模块,为我的网络应用启用“文本网络搜索”功能,并在我的一个视图中显示结果。
由于来自同一IP的极少数查询后Google返回503错误,我决定在客户端上使用该模块,因此限制是每个客户端,而不是每个服务器。
我确实使用browserify将节点模块转换为要在客户端页面中获取的脚本 该脚本只需要'google.js',而且只需要20行javascript:

'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

问题是浏览器生成的输出比我预期的要大:1.2 kB模块成为2.4 MB脚本!可能它也包括所有'谷歌'依赖,但是..,

问题是:这是正常的吗?我的搜索页面是否需要加载2.4 MB文件才能搜索Google上的某些文字?

我很确定我错过了什么,却无法理解......: - (

1 个答案:

答案 0 :(得分:2)

这是预期的行为。 Browserify以递归方式加载以require()导入的所有模块,并输出单个文件。有很多方法可以解决这个问题,但它们不太适用于你的特殊情况。

通常,使用Browserify,您可以在开发中使用一个巨大的包,但随后构建一个小得多的生产版本。例如,如果您使用的是jQuery,则可以将软件包本地安装到node_modules文件夹中。然后,为了生产,您可以设置--exclude标志,让Browserify忽略node_modules文件夹中的任何内容,而不是依靠CDN将jQuery传递给客户端。

我说这不太适用于你的情况,因为node-google确实是一个Node模块。无法保证它可以在浏览器中运行(可能会也可能不会)。在开始规划下一道攻击线之前,你真的应该确定它是否正常工作。

如果它有效,您有两种可能的补救措施:

  1. 缩小捆绑包并确保其已经过gzip压缩。如果您可以使用,那么生成的文件大小可能会小于100kB。

  2. 查找用于进行Google搜索的其他模块,或实施您自己的模块。这可能是最佳解决方案,除非您出于某种原因必须使用node-google。

  3. 当然,如果它无论如何都不能在浏览器中工作,那么只有第二种解决方案可用。