由于大数据 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
)来存储和使用我的列表,这样它们就不会减慢进程,但在节点和浏览器中也很重要。
如果您有包含数据的文件 - 只需以单独的方式加载它们,不要将它们包含在构建过程中
- 将您的大数据文件格式化为 JSON
在服务器上使用:
let fs = require('fs');
让你的内容 = JSON.parse(fs.readFileSync('path/to/file'));
客户端使用:
让请求=要求("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 都不起作用,您可能会采用其他一些更老套的方法。不过,我现在将继续讨论这些内容,因为我认为它们不值得,除非你绝对 必须 将它作为一个文件并且没有其他方法可以做到. :\
我有一个 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
)来存储和使用我的列表,这样它们就不会减慢进程,但在节点和浏览器中也很重要。
如果您有包含数据的文件 - 只需以单独的方式加载它们,不要将它们包含在构建过程中
- 将您的大数据文件格式化为 JSON
在服务器上使用:
let fs = require('fs'); 让你的内容 = JSON.parse(fs.readFileSync('path/to/file'));
客户端使用:
让请求=要求("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 都不起作用,您可能会采用其他一些更老套的方法。不过,我现在将继续讨论这些内容,因为我认为它们不值得,除非你绝对 必须 将它作为一个文件并且没有其他方法可以做到. :\