如何从多个文件添加到数据数组?
How can I add to a data array from multiple files?
我的文件夹结构如下所示:
.
├── Gruntfile.js
└── src
└── assets
└── blocks
└── content.js
└── buttons
└── buttons1.js
└── buttons2.js
└── images
└── images.js
在我的 content.js
文件中有一个空数组:
var data = {
'snippets': []
};
在每个文件中,即 buttons1.js
buttons2.js
和 images.js
都有一个数组,例如:
var snippet = [
{
'thumbnail': 'preview/button-01.png',
'category': '119',
'html':
'<div>' +
'<a href="#" class="is-btn is-btn-ghost2 is-upper">Read More</a> ' +
'\n<a href="#" class="is-btn is-btn-ghost1 is-upper">Buy Now</a>' +
'</div>'
}
]
有没有办法让 Grunt(或任何其他进程运行器)循环遍历文件夹中的所有 .js 文件并读取片段数组的值,然后将其添加到 content.js
文件?
所以我最终会得到一个看起来像这样的数组(加上附加的其他文件中的任何其他内容)
var data = {
'snippets': [
{
'thumbnail': 'preview/button-01.png',
'category': '119',
'html':
'<div>' +
'<a href="#" class="is-btn is-btn-ghost2 is-upper">Read More</a> ' +
'\n<a href="#" class="is-btn is-btn-ghost1 is-upper">Buy Now</a>' +
'</div>'
}
]
};
我尝试了 grunt-contrib-concat
使用以下配置,它只是创建一个包含多个代码片段变量的文件,不确定是否有办法修改它的连接方式?或者如果有不同的插件可用
concat: {
options: {
separator: ';',
},
dist: {
src: 'src/assets/blocks/*/*.js',
dest: 'src/assets/blocks/content.js',
},
},
In HTML(添加路径):
<script src="content.js"></script> // we get data == { 'snippets': [] }
<script src="buttons1.js"></script> // we get snippet == [...]
<script>data.snippets.push(snippet);</script>
<script src="buttons2.js"></script> // we get snippet == [...]
<script>data.snippets.push(snippet);</script>
<script src="buttons3.js"></script> // we get snippet == [...]
<script>data.snippets.push(snippet);</script>
// we have each snippet in snippets
基本上,我们加载容器(data
),然后我们一个一个地加载buttons
,将它们的snippet
添加到data
的[=16] =].
附录:动态添加脚本如何?
dataScript=document.body.createElement("script");
dataScript.src="content.js";
document.body.append(dataScript);
buttonSrcs=["buttons1.js", "buttons2.js", "buttons3.js"]; // etc...
for(buttonSrc of buttonSrcs) {
buttonScript=document.body.createElement("script");
buttonScript.src=buttonSrc;
document.body.append(buttonScript);
data.snippets.push(snippet);
};
我凭记忆打字,希望我拼写正确...
我最终为 Grunt 编写了一个自定义任务,它完成了我想要的事情
merge_blocks: {
build: {
src: 'src/assets/blocks/*/*.js',
dest: 'src/assets/blocks/content.js'
}
}
grunt.registerMultiTask('merge_blocks', 'Merge blocks', function () {
const fs = require('fs');
grunt.log.write('[Block Merge] Loaded dependencies...').ok();
// This is the main array
var data_basic = {
'snippets': []
};
this.files.forEach(function (file) {
grunt.log.writeln('Processing ' + file.src.length + ' files.');
//file.src is the list of all matching file names.
file.src.forEach(function (f) {
var data = require('./' + f);
data_basic.snippets.push(...data);
data = null;
});
grunt.log.writeln('Now saving file:' + file.dest);
fs.appendFileSync(file.dest, 'var data_basic = ' + JSON.stringify(data_basic, null, ' '));
});
});
我的文件夹结构如下所示:
.
├── Gruntfile.js
└── src
└── assets
└── blocks
└── content.js
└── buttons
└── buttons1.js
└── buttons2.js
└── images
└── images.js
在我的 content.js
文件中有一个空数组:
var data = {
'snippets': []
};
在每个文件中,即 buttons1.js
buttons2.js
和 images.js
都有一个数组,例如:
var snippet = [
{
'thumbnail': 'preview/button-01.png',
'category': '119',
'html':
'<div>' +
'<a href="#" class="is-btn is-btn-ghost2 is-upper">Read More</a> ' +
'\n<a href="#" class="is-btn is-btn-ghost1 is-upper">Buy Now</a>' +
'</div>'
}
]
有没有办法让 Grunt(或任何其他进程运行器)循环遍历文件夹中的所有 .js 文件并读取片段数组的值,然后将其添加到 content.js
文件?
所以我最终会得到一个看起来像这样的数组(加上附加的其他文件中的任何其他内容)
var data = {
'snippets': [
{
'thumbnail': 'preview/button-01.png',
'category': '119',
'html':
'<div>' +
'<a href="#" class="is-btn is-btn-ghost2 is-upper">Read More</a> ' +
'\n<a href="#" class="is-btn is-btn-ghost1 is-upper">Buy Now</a>' +
'</div>'
}
]
};
我尝试了 grunt-contrib-concat
使用以下配置,它只是创建一个包含多个代码片段变量的文件,不确定是否有办法修改它的连接方式?或者如果有不同的插件可用
concat: {
options: {
separator: ';',
},
dist: {
src: 'src/assets/blocks/*/*.js',
dest: 'src/assets/blocks/content.js',
},
},
In HTML(添加路径):
<script src="content.js"></script> // we get data == { 'snippets': [] }
<script src="buttons1.js"></script> // we get snippet == [...]
<script>data.snippets.push(snippet);</script>
<script src="buttons2.js"></script> // we get snippet == [...]
<script>data.snippets.push(snippet);</script>
<script src="buttons3.js"></script> // we get snippet == [...]
<script>data.snippets.push(snippet);</script>
// we have each snippet in snippets
基本上,我们加载容器(data
),然后我们一个一个地加载buttons
,将它们的snippet
添加到data
的[=16] =].
附录:动态添加脚本如何?
dataScript=document.body.createElement("script");
dataScript.src="content.js";
document.body.append(dataScript);
buttonSrcs=["buttons1.js", "buttons2.js", "buttons3.js"]; // etc...
for(buttonSrc of buttonSrcs) {
buttonScript=document.body.createElement("script");
buttonScript.src=buttonSrc;
document.body.append(buttonScript);
data.snippets.push(snippet);
};
我凭记忆打字,希望我拼写正确...
我最终为 Grunt 编写了一个自定义任务,它完成了我想要的事情
merge_blocks: {
build: {
src: 'src/assets/blocks/*/*.js',
dest: 'src/assets/blocks/content.js'
}
}
grunt.registerMultiTask('merge_blocks', 'Merge blocks', function () {
const fs = require('fs');
grunt.log.write('[Block Merge] Loaded dependencies...').ok();
// This is the main array
var data_basic = {
'snippets': []
};
this.files.forEach(function (file) {
grunt.log.writeln('Processing ' + file.src.length + ' files.');
//file.src is the list of all matching file names.
file.src.forEach(function (f) {
var data = require('./' + f);
data_basic.snippets.push(...data);
data = null;
});
grunt.log.writeln('Now saving file:' + file.dest);
fs.appendFileSync(file.dest, 'var data_basic = ' + JSON.stringify(data_basic, null, ' '));
});
});