Browserify 生成的输出文件*非常大*。

3
利用node-google模块的帮助,我编写了一个简单的node模块,为我的Web应用程序启用了“文本网络搜索”功能,并在其中一个视图中呈现结果。
由于来自同一IP的查询数量很少就会导致Google返回503错误,因此我决定在客户端上使用该模块,这样限制是针对客户端而不是服务器的。
我使用了browserify将node模块转换为可在客户端页面中引用的脚本。
该脚本只需要“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

问题在于 browserify 生成的输出文件比我预期的要大得多:一个1.2kB的模块变成了一个2.4MB的脚本!可能它也包括了所有的“google”依赖项,但是...,

问题是:这正常吗?我的搜索页面需要加载一个2.4 MB的文件才能搜索 Google 上的一些文本?
我很确定我漏掉了什么,但是不知道是什么... :-(

除了大小(可能是由依赖关系引起的),它实际上能在浏览器中工作吗? - robertklep
我没有理由怀疑它在浏览器中的实际运行情况,但是,我甚至没有测试过:鉴于文件的大小,这是一个次要问题。然而,如果这有助于解决问题,我会尽快尝试并在此报告。 - MarcoS
如果一开始在浏览器中无法使其正常工作,我认为大尺寸将不再是问题:D - robertklep
更新:你是对的:它不起作用... :-( 转而使用客户端谷歌爬取模块... - MarcoS
1个回答

2
这是预期的行为。Browserify 会递归地加载所有使用 require() 导入的模块,并输出单个文件。虽然有一些方法可以规避这种情况,但它们在你的特定情况下可能不太可行。
通常情况下,在开发过程中,你可能会使用一个巨大的捆绑包,但是在生产环境中则会构建一个更小的版本。例如,如果你正在使用 jQuery,你可以将该包安装到本地的 node_modules 文件夹中。然后,在生产环境中,你可以设置 --exclude 标志,让 Browserify 忽略 node_modules 文件夹中的任何内容,而依靠 CDN 将 jQuery 传递给客户端。
我说这在你的情况下不太可能有效,因为 node-google 确实是一个 Node 模块。无法保证它能在浏览器中工作(可能会或可能不会)。你真的应该在开始规划下一步行动之前确定它是否可行。
如果它可行,你有两种可能的解决方案:
  1. 压缩你的捆绑包,并确保它被提供为 gzip 格式。如果可以接受的话,生成的文件大小可能会少于 100kB。
  2. 查找其他用于进行 Google 搜索的模块,或自己实现一个。这可能是最好的解决方案,除非你必须出于某种原因使用 node-google。
当然,如果它在浏览器中根本无法工作,那么只有第二个解决方案可用。

1
经过压缩和gzip处理?根据我的经验,仅进行代码压缩可能会将其大小减小到约700kB左右,而gzip处理则可以进一步减小文件体积。我可能有所偏差,但无论如何,询问者如果选择这种方法,就会了解到具体情况。 - McMath
哦,好的。我忘记了压缩,并没有注意到你明确提到了它,我道歉。 - zerkms
谢谢,我会尽快在浏览器中测试它...我甚至不知道“browserified”节点模块可能存在的问题... :-( 关于jQuery排除,我认为这并不是一个很大的改进,在生产环境中,我的代码也会放在CDN上... - MarcoS
@MarcoS 关于从流行的CDN服务器提供公共库的观点是,大多数情况下,它将从用户的缓存中提供,因此他们根本不需要下载该库。如果您将所有内容捆绑在一起,即使大部分内容已经在他们的计算机上,他们仍然必须下载整个内容。因此,您应该考虑使用CDN服务器。 - McMath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接