【问题标题】:browserify and babelify very slow due to large data js files由于大数据 js 文件,browserify 和 babelify 非常慢
【发布时间】:2018-04-04 11:53:57
【问题描述】:

我有一个 nodejs 项目,它使用大型字典列表(数百万个条目),存储在 js 文件中,如下所示:

module.exports = ["entry1", "entry2", "entry3", "entry4", "entry5", etc.];

然后我像这样从其他文件中使用它们:

var values = require('./filePath');

这很好用,它也可以在浏览器中运行(使用 browserify),但是捆绑需要很长时间 - 大约 10 分钟。

我使用以下命令来创建包: browserify "./src/myModule.js" --standalone myModule -t [ babelify --presets [ es2015 stage-2 ] --plugins ["transform-es2015-classes", {"loose": true}]

我试图避免使用 --noparse ["path1", "path2", "path3", etc.] 解析我的字典 js 文件,但没有任何区别。

理想情况下,我只想加快 browserify\babelify 进程,但是如果这不可能,我会很高兴找到另一种方式(即避免require)来存储和使用我的列表,这样他们就不会不要减慢这个过程,但这在节点和浏览器中也很重要。

【问题讨论】:

  • 计算机不会创造奇迹。 JS 在浏览器中执行,在 OS 中执行。
  • 使用这种技术怎么样? stackoverflow.com/questions/40173707/…
  • @TarunLalwani 谢谢你的建议 - 我会考虑使用这个。
  • @LeonardoSeccia,你有机会测试它吗?
  • @TarunLalwani,恐怕不会......我没有考虑到它 - 我目前从命令行使用 browserify,所以这个解决方案也意味着改变它......

标签: javascript node.js babeljs browserify


【解决方案1】:

您可以单独捆绑数据文件,因此您只需在它们更改时重新捆绑它们。这可以使用--require -r--external -x 选项来实现。

要创建数据包,请执行以下操作:

browserify -r ./path/to/data.js -r ./path/to/other/data.js > data-bundle.js

生成的data-bundle.js 将在全局范围内定义require 函数,该函数可用于获取您在上述命令中列出的任何文件。只需确保将此包包含在主包之前的脚本标记中即可。

如果能够--require 一个 glob 模式就好了,但不幸的是 browserify 不支持这个。如果您尝试使用 shell 扩展模式,-r 选项将仅适用于第一个,这很糟糕。您可能可以编写一个 shell 脚本,从 ls 或其他东西构建命令,以避免必须明确列出所有数据文件,但我认为这超出了问题的范围。

要在不重建数据文件的情况下创建主包,只需在命令中添加如下选项:

-x './path/to/data/*.js'

这告诉 browserify 基本上忽略它们并让它们通过你的其他包创建的全局 require 函数被拉入。如您所见,这确实支持 glob 模式,因此更容易一些。

更新:

要将两个包合二为一,只需在以构建主包的 browserify 命令开头的 shell 脚本末尾添加类似这样的内容:

cat data-bundle.js main-bundle.js > bundle.js
rm main-bundle.js

不幸的是,这总是需要将 data-bundle.js 的副本写入磁盘,这可能是导致速度变慢的最终原因,正如我在下面的 cmets 中提到的那样。不过值得一试。

如果连 that 都不起作用,那么您可能会采取其他一些更老套的方法。不过,我现在将继续讨论这些内容,因为我认为它们不值得,除非您绝对必须将它作为一个文件保存并且没有其他方法可以做到这一点。 :\

【讨论】:

  • 自从提出问题以来,这实际上是我找到的最佳解决方案以及我目前正在做的事情......不幸的是这意味着多个文件。
  • 你可以让你的脚本将文件连接在一起,但是看到你已经告诉 browserify 不要解析它们来检查需求,我认为大部分延迟来自简单地编写这么大的文件.所以你可能无法加快它的速度并仍然让它输出一个文件。
  • 再一次,babelify 也有可能对此负责。由于您没有将 babelify 与构建数据包的命令一起使用,因此将它们连接起来可能就是您想要的。这完全取决于您的数据包实际上有多大以及您的驱动器有多快。
【解决方案2】:

如果您有包含数据的文件 - 只需以单独的方式加载它们,不要将它们包含在构建过​​程中

  1. 将您的大数据文件格式化为 JSON
  2. 在服务器上使用:

    让 fs = require('fs'); 让 yourContent = JSON.parse(fs.readFileSync('path/to/file'));

  3. 在客户端使用:

    let request = require("client-request"); // 执行 npm 安装客户端请求

    var 选项 = { uri: "http://.com/path/to/file", json: 真 }

    var req = request(options, function callback(err, response, body) { console.log(response.statusCode) 如果(身体){ 让你的内容 = 正文 } })

或使用任何其他发出您喜欢的 HTTP 请求的库

【讨论】:

  • 对不起,我应该说......它需要离线工作,客户端......所以这个解决方案并不理想。另外,您将如何自动在代码的 2 个分支之间切换?理想情况下,我只想加快捆绑过程...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多