由于大数据 js 文件,browserify 和 babelify 非常慢

browserify and babelify very slow due to large data js files

我有一个 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)来存储和使用我的列表,这样它们就不会减慢进程,但在节点和浏览器中也很重要。

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

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

    let fs = require('fs'); 让你的内容 = JSON.parse(fs.readFileSync('path/to/file'));

  3. 客户端使用:

    让请求=要求("client-request"); // 执行 npm 安装 client-request

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

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

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

您可以单独捆绑数据文件,这样您只需在它们发生变化时重新捆绑它们。这可以使用 --require -r--external -x 选项。

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

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

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

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

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

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

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

更新:

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

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

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

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