pug-site-core 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -18,37 +18,44 @@ export const pugSiteCore = {
18
18
  translateLanguageData,
19
19
  };
20
20
 
21
- // let curCmd = process.env.npm_lifecycle_event;
21
+ let curCmd = process.env.npm_lifecycle_event;
22
+ const args = process.argv.slice(2);
22
23
 
23
- // try {
24
- // switch (curCmd) {
25
- // case "getFun":
26
- // await generateGetDataFn();
27
- // break;
28
- // case "getData":
29
- // await generateGetDataFn();
30
- // const args = process.argv.slice(2);
31
- // await fetchDataToJsonFile(args);
32
- // break;
33
- // case "dev":
34
- // startDevServer();
35
- // break;
36
- // case "compileFn":
37
- // await compilePagesPugToFn();
38
- // break;
39
- // case "buildFn":
40
- // await buildFn();
41
- // break;
42
- // case "buildStatic":
43
- // await buildStatic();
44
- // break;
45
- // case "lang":
46
- // await translateLanguageData();
47
- // break;
48
- // default:
49
- // console.log(`未知的命令: ${curCmd}`);
50
- // }
51
- // } catch (error) {
52
- // console.error(`执行命令 ${curCmd} 时发生错误:`, error);
53
- // process.exit(1);
54
- // }
24
+ // 检查是否包含 dev 参数
25
+ if (args.includes("dev")) {
26
+ try {
27
+ switch (curCmd) {
28
+ case "getFun":
29
+ await generateGetDataFn();
30
+ break;
31
+ case "getData":
32
+ await generateGetDataFn();
33
+ // 移除 dev 参数后传递其他参数
34
+ const dataArgs = args.filter((arg) => arg !== "dev");
35
+ await fetchDataToJsonFile(dataArgs);
36
+ break;
37
+ case "dev":
38
+ startDevServer();
39
+ break;
40
+ case "compileFn":
41
+ await compilePagesPugToFn();
42
+ break;
43
+ case "buildFn":
44
+ await buildFn();
45
+ break;
46
+ case "buildStatic":
47
+ await buildStatic();
48
+ break;
49
+ case "lang":
50
+ await translateLanguageData();
51
+ break;
52
+ default:
53
+ console.log(`未知的命令: ${curCmd}`);
54
+ }
55
+ } catch (error) {
56
+ console.error(`执行命令 ${curCmd} 时发生错误:`, error);
57
+ process.exit(1);
58
+ }
59
+ } else {
60
+ console.log(`请添加 dev 参数以执行命令,例如: npm run getData dev`);
61
+ }
package/lib/devServer.js CHANGED
@@ -171,7 +171,7 @@ async function matchRouter(url, language, device) {
171
171
  for (let index = 0; index < router.length; index++) {
172
172
  const obj = router[index];
173
173
  if (obj.matchFn.call(params)) {
174
- let data = obj.getData.call(params);
174
+ let data = await obj.getData.call(params);
175
175
  let pugPath = obj.getPagesFnName.call(params);
176
176
  pugPath = pugPath.split("_").join(pathSymbol);
177
177
  return {
package/lib/generate.js CHANGED
@@ -196,12 +196,22 @@ export async function fetchDataToJsonFile(args) {
196
196
  const getData = await import(paths.getData);
197
197
  const pugFilePathList = await getPagesPugFilePathArr();
198
198
 
199
- const { languageList, customBuildData, fetchDataLangLimit } = config;
199
+ const { languageList, customBuildData, fetchDataConcurrencyLimit } = config;
200
200
 
201
- await async.eachLimit(languageList, fetchDataLangLimit, async (language) => {
202
- // 语言过滤检查
203
- if (filterLang.length && !filterLang.includes(language)) return;
201
+ // 创建一个全局任务队列控制整体并发数
202
+ const queue = async.queue(async (task) => {
203
+ await task();
204
+ }, fetchDataConcurrencyLimit || 10);
204
205
 
206
+ // 收集所有需要执行的任务
207
+ const allTasks = [];
208
+
209
+ // 过滤出需要处理的语言
210
+ const languagesToProcess = filterLang.length
211
+ ? languageList.filter((lang) => filterLang.includes(lang))
212
+ : languageList;
213
+
214
+ for (const language of languagesToProcess) {
205
215
  // 清空指定语言的数据目录
206
216
  if (filterLang.includes(language) && !filterFun.length) {
207
217
  await fse.remove(paths.resolveRoot("jsonData", language));
@@ -210,67 +220,73 @@ export async function fetchDataToJsonFile(args) {
210
220
  // 处理公共数据
211
221
  const commonFuncName = "get_common_data";
212
222
  if (isFillFun(commonFuncName)) {
213
- const commonData = await getData[commonFuncName](language);
214
- console.log(language, commonFuncName, "开始写入json文件");
215
- await fse.outputJSON(
216
- paths.resolveRoot("jsonData", language, "_common.json"),
217
- commonData
218
- );
223
+ allTasks.push(async () => {
224
+ const commonData = await getData[commonFuncName](language);
225
+ console.log(language, commonFuncName, "开始写入json文件");
226
+ await fse.outputJSON(
227
+ paths.resolveRoot("jsonData", language, "_common.json"),
228
+ commonData
229
+ );
230
+ });
219
231
  }
220
232
 
221
233
  // 处理自定义数据
222
234
  if (customBuildData?.length) {
223
- await async.each(customBuildData, async (obj) => {
235
+ for (const obj of customBuildData) {
224
236
  if (
225
237
  obj.includeLang &&
226
238
  obj.includeLang.length > 0 &&
227
239
  !obj.includeLang.includes(language)
228
240
  ) {
229
- return;
241
+ continue;
230
242
  }
243
+
231
244
  let dataFn = getData[obj.getDataFn];
232
245
  if (!dataFn || typeof dataFn !== "function") {
233
246
  return Promise.reject(new Error(obj.getDataFn + "获取数据函数不存在"));
234
247
  }
235
248
 
236
- if (filterFun.length && !filterFun.includes(funName)) {
237
- return;
249
+ if (filterFun.length && !filterFun.includes(obj.getDataFn)) {
250
+ continue;
238
251
  }
239
252
 
240
- let data = await dataFn(language);
241
- await checkData(data, language, obj.getDataFn);
242
- console.log(language, obj.getDataFn, "开始写入json文件");
243
- let outPutPath = obj.outPutPath.split("/").join(pathSymbol);
244
- if (Array.isArray(data)) {
245
- let name = outPutPath.split(pathSymbol).pop().replace(/\..*$/, "");
246
- const regex = /^\[.+\]$/;
247
- if (regex.test(name)) {
248
- let property = name.slice(1, -1);
249
- for (let index = 0; index < data.length; index++) {
250
- const dataItem = data[index];
251
- let fileName = dataItem[property];
252
- if (!fileName) {
253
- return Promise.reject(
254
- new Error(
255
- `${language} ${obj.getDataFn} 获取的数据中期望以${property}属性命名文件但是${index}下标中对象属性不存在或者为空字符串`
256
- )
253
+ allTasks.push(async () => {
254
+ let data = await dataFn(language);
255
+ await checkData(data, language, obj.getDataFn);
256
+ console.log(language, obj.getDataFn, "开始写入json文件");
257
+ let outPutPath = obj.outPutPath.split("/").join(pathSymbol);
258
+ if (Array.isArray(data)) {
259
+ let name = outPutPath.split(pathSymbol).pop().replace(/\..*$/, "");
260
+ const regex = /^\[.+\]$/;
261
+ if (regex.test(name)) {
262
+ let property = name.slice(1, -1);
263
+ for (let index = 0; index < data.length; index++) {
264
+ const dataItem = data[index];
265
+ let fileName = dataItem[property];
266
+ if (!fileName) {
267
+ return Promise.reject(
268
+ new Error(
269
+ `${language} ${obj.getDataFn} 获取的数据中期望以${property}属性命名文件但是${index}下标中对象属性不存在或者为空字符串`
270
+ )
271
+ );
272
+ }
273
+ await saveJsonData(
274
+ paths.join(language, outPutPath.replace(name, fileName)),
275
+ dataItem
257
276
  );
258
277
  }
259
- await saveJsonData(
260
- paths.join(language, outPutPath.replace(name, fileName)),
261
- dataItem
262
- );
278
+ } else {
279
+ await saveJsonData(paths.join(language, outPutPath), data);
263
280
  }
264
- } else {
281
+ } else if (typeof data === "object") {
265
282
  await saveJsonData(paths.join(language, outPutPath), data);
266
283
  }
267
- } else if (typeof data === "object") {
268
- await saveJsonData(paths.join(language, outPutPath), data);
269
- }
270
- });
284
+ });
285
+ }
271
286
  }
272
287
 
273
- await async.each(pugFilePathList, async (fileName) => {
288
+ // 处理模板页面数据
289
+ for (const fileName of pugFilePathList) {
274
290
  let funName =
275
291
  "get_" + fileName.split(pathSymbol).join("_").slice(0, -4) + "_data";
276
292
 
@@ -278,42 +294,64 @@ export async function fetchDataToJsonFile(args) {
278
294
  if (!getData[funName] || typeof getData[funName] !== "function") {
279
295
  return Promise.reject(new Error(`${funName} 获取数据函数不存在`));
280
296
  }
297
+
281
298
  if (filterFun.length && !filterFun.includes(funName)) {
282
- return Promise;
299
+ continue;
283
300
  }
284
- let data = await getData[funName](language);
285
- await checkData(data, language, funName);
286
- console.log(language, funName, "开始写入json文件");
287
- if (Array.isArray(data)) {
288
- await async.eachOfLimit(data, 64, async (item, index) => {
289
- let lastJsonFilePath;
290
- if (item.page_name) {
291
- lastJsonFilePath = paths.join(
301
+
302
+ allTasks.push(async () => {
303
+ let data = await getData[funName](language);
304
+ await checkData(data, language, funName);
305
+ console.log(language, funName, "开始写入json文件");
306
+ if (Array.isArray(data)) {
307
+ for (let index = 0; index < data.length; index++) {
308
+ const item = data[index];
309
+ let lastJsonFilePath;
310
+ if (item.page_name) {
311
+ lastJsonFilePath = paths.join(
312
+ language,
313
+ ...jsonFilePath.slice(0, -1),
314
+ item.page_name
315
+ );
316
+ } else {
317
+ console.warn("下标:", index, "无page_name属性,使用index作为文件名");
318
+ lastJsonFilePath =
319
+ paths.join(language, ...jsonFilePath) +
320
+ "_" +
321
+ (index + 1) +
322
+ ".json";
323
+ }
324
+ item._template = fileName;
325
+ await saveJsonData(lastJsonFilePath, item);
326
+ }
327
+ } else {
328
+ if (data.page_name) {
329
+ jsonFilePath = paths.join(
292
330
  language,
293
331
  ...jsonFilePath.slice(0, -1),
294
- item.page_name
332
+ data.page_name
295
333
  );
296
334
  } else {
297
- console.warn("下标:", index, "无page_name属性,使用index作为文件名");
298
- lastJsonFilePath =
299
- paths.join(language, ...jsonFilePath) + "_" + ++index + ".json";
335
+ jsonFilePath = paths.join(language, ...jsonFilePath) + ".json";
300
336
  }
301
- item._template = fileName;
302
- await saveJsonData(lastJsonFilePath, item);
303
- });
304
- } else {
305
- if (data.page_name) {
306
- jsonFilePath = paths.join(
307
- language,
308
- ...jsonFilePath.slice(0, -1),
309
- data.page_name
310
- );
311
- } else {
312
- jsonFilePath = paths.join(language, ...jsonFilePath) + ".json";
337
+ data._template = fileName;
338
+ await saveJsonData(jsonFilePath, data);
313
339
  }
314
- data._template = fileName;
315
- await saveJsonData(jsonFilePath, data);
316
- }
340
+ });
341
+ }
342
+ }
343
+
344
+ // 将所有任务添加到队列
345
+ allTasks.forEach((task) => queue.push(task));
346
+
347
+ // 等待所有任务完成
348
+ return new Promise((resolve, reject) => {
349
+ queue.drain(() => {
350
+ resolve();
351
+ });
352
+
353
+ queue.error((err) => {
354
+ reject(err);
317
355
  });
318
356
  });
319
357
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pug-site-core",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -37,7 +37,7 @@
37
37
  "axios": "^1.7.7"
38
38
  },
39
39
  "license": "ISC",
40
- "description": "注释测试的指令执行",
40
+ "description": "优化并发处理现在可以精细到一个数据请求",
41
41
  "files": [
42
42
  "lib/",
43
43
  "index.js"