假设我的目录结构如下:
1. folder A
1a. some_file.js
1b. data.json
2. folder B
2a. folder B1
2a1. other_file.json
2a2. data.json
2b. folder B2
2b1. data.json
3. output.json
是否有一个webpack加载器可以在所有子文件夹中合并data.json
,并将其输出到output.json
?
我发现https://www.npmjs.com/package/json-files-merge-loader似乎做了类似的事情,但它似乎要求data.json
的每条路径,而我需要通过所有文件夹和子文件夹的内容data.json
1}}。所有data.json
个键都是唯一的,我希望output.json
是一个JSON对象,其中包含来自所有data.json
的所有键/值对。
答案 0 :(得分:6)
webpack并不适合您的用例。许多人认为webpack可以替代构建系统,但它只是一个模块捆绑器,它不能处理每个任务。具体做法是:
require()
和import
语句,这意味着它需要静态定义模块。通过编写插件或使用从模板生成的文件来解决这个问题,但即使你这样做了...... webpack可能能够使用一些花哨的插件来做这些事情,但它可能不值得。在您的情况下,您可能只想编写一个Node脚本。如果需要,可以在构建之前使用plugin like this运行代码。
const fs = require('fs');
// https://github.com/isaacs/node-glob
const glob = require('glob');
const output = {};
glob('src/**/*.json', (error, files) => {
files.forEach((filename) => {
const contents = JSON.parse(fs.readFileSync(filename, 'utf8'));
Object.assign(output, contents);
});
fs.writeFileSync('output.json', JSON.stringify(output));
});
答案 1 :(得分:5)
是否有一个webpack加载器可以在所有子文件夹中组合data.json,并将其输出到output.json?
这与在构建之前运行代码不同。因为深度webpack集成允许在热重新加载时跟踪文件更改并立即更新结果:
MergePlugin = require("merge-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /\.(json)$/i,
use: [
MergePlugin.loader()
]
}
]
},
plugins: [
new MergePlugin({
search: './src/**/*.json',
})
]
}
output.json
,请在search
param中对它们进行描述,这就是全部[path]
的组参数进行播放 - 了解有关分组的详情和一些more
答案 2 :(得分:1)
@dee请检查此插件 https://www.npmjs.com/package/merge-jsons-webpack-plugin
您可以将文件/模式数组作为输入传递,它将以json的形式发出单个文件。
答案 3 :(得分:0)
我的multi-json-loader
可能会对您有所帮助。它接受glob并将文件组合成单个JSON blob,同时还保留输出对象中的相对路径。
即dirA / a.json,dirB / b.json和dirB / c.json输出为
{
"dirA": {
"a": /*parsed contents of a.json*/
},
"dirB": {
"b": /*parsed contents of b.json*/,
"c": /*parsed contents of b.json*/
}
}