Skip to content

Commit 0c7d743

Browse files
author
Maledong
authored
chore: replace callbacks with necessary async/await (#4555)
1. Some functions like 'fs' or 'graceFulFs' has been supporting 'async/await' for a long time, so this is a refactor to improve the related codes. 2. 'sass.render' is deprecated, use awaitable 'sass.compileAsync' instead.
1 parent 010906e commit 0c7d743

2 files changed

Lines changed: 65 additions & 86 deletions

File tree

build.js

Lines changed: 51 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
const fs = require('fs');
88
const gracefulFs = require('graceful-fs');
9+
910
// This is needed at least on Windows to prevent the `EMFILE: too many open files` error
1011
// https://github.com/isaacs/node-graceful-fs#global-patching
1112
gracefulFs.gracefulify(fs);
@@ -268,7 +269,7 @@ function withPreserveLocale(preserveLocale) {
268269
}
269270

270271
// This function builds the static/css folder for all the Sass files.
271-
function buildCSS() {
272+
async function buildCSS() {
272273
console.log('[sass] static/css started');
273274
const labelForBuild = '[sass] static/css finished';
274275
console.time(labelForBuild);
@@ -277,88 +278,70 @@ function buildCSS() {
277278
const dest = path.join(__dirname, 'build/static/css/styles.css');
278279

279280
const sassOpts = {
280-
file: src,
281-
outFile: dest,
282281
outputStyle:
283282
process.env.NODE_ENV !== 'development' ? 'compressed' : 'expanded'
284283
};
285284

286-
gracefulFs.mkdir(
287-
path.join(__dirname, 'build/static/css'),
288-
{ recursive: true },
289-
(err) => {
290-
if (err) {
291-
throw err;
292-
}
293-
294-
sass.render(sassOpts, (error, result) => {
295-
if (error) {
296-
throw error;
297-
}
285+
const graceFulFsPromise = gracefulFs.promises;
298286

299-
postcss([autoprefixer])
300-
.process(result.css, { from: src })
301-
.then((res) => {
302-
res.warnings().forEach((warn) => {
303-
console.warn(warn.toString());
304-
});
287+
await graceFulFsPromise.mkdir(path.join(__dirname, 'build/static/css'), {
288+
recursive: true
289+
});
305290

306-
gracefulFs.writeFile(dest, res.css, (err) => {
307-
if (err) {
308-
throw err;
309-
}
291+
const result = await sass.compileAsync(src, sassOpts);
310292

311-
console.timeEnd(labelForBuild);
312-
});
313-
});
293+
postcss([autoprefixer])
294+
.process(result.css, { from: src })
295+
.then(async (res) => {
296+
res.warnings().forEach((warn) => {
297+
console.warn(warn.toString());
314298
});
315-
}
316-
);
299+
300+
await graceFulFsPromise.writeFile(dest, res.css);
301+
console.timeEnd(labelForBuild);
302+
});
317303
}
318304

319305
// This function copies the rest of the static assets to their subfolder in the
320306
// build directory.
321-
function copyStatic() {
307+
async function copyStatic() {
322308
console.log('[ncp] build/static started');
323309
const labelForBuild = '[ncp] build/static finished';
324310
console.time(labelForBuild);
325-
gracefulFs.mkdir(
311+
312+
const graceFulFsPromise = gracefulFs.promises;
313+
314+
await graceFulFsPromise.mkdir(path.join(__dirname, 'build/static'), {
315+
recursive: true
316+
});
317+
318+
ncp(
319+
path.join(__dirname, 'static'),
326320
path.join(__dirname, 'build/static'),
327-
{ recursive: true },
328-
(err) => {
329-
if (err) {
330-
throw err;
321+
(error) => {
322+
if (error) {
323+
return console.error(error);
331324
}
332325

333326
ncp(
334-
path.join(__dirname, 'static'),
335-
path.join(__dirname, 'build/static'),
327+
path.join(__dirname, 'node_modules/jquery/dist/jquery.min.js'),
328+
path.join(__dirname, 'build/static/js/jquery.min.js'),
336329
(error) => {
337330
if (error) {
338331
return console.error(error);
339332
}
340333

341334
ncp(
342-
path.join(__dirname, 'node_modules/jquery/dist/jquery.min.js'),
343-
path.join(__dirname, 'build/static/js/jquery.min.js'),
335+
path.join(
336+
__dirname,
337+
'node_modules/jquery.fancytable/dist/fancyTable.min.js'
338+
),
339+
path.join(__dirname, 'build/static/js/fancyTable.min.js'),
344340
(error) => {
345341
if (error) {
346342
return console.error(error);
347343
}
348-
349-
ncp(
350-
path.join(
351-
__dirname,
352-
'node_modules/jquery.fancytable/dist/fancyTable.min.js'
353-
),
354-
path.join(__dirname, 'build/static/js/fancyTable.min.js'),
355-
(error) => {
356-
if (error) {
357-
return console.error(error);
358-
}
359-
console.timeEnd(labelForBuild);
360-
}
361-
);
344+
console.timeEnd(labelForBuild);
362345
}
363346
);
364347
}
@@ -398,25 +381,24 @@ function getSource(callback) {
398381
// name. It brings together all build steps and dependencies and executes them.
399382
function fullBuild(opts) {
400383
const { selectedLocales, preserveLocale } = opts;
401-
getSource((err, source) => {
384+
getSource(async (err, source) => {
402385
if (err) {
403386
throw err;
404387
}
405388

406-
// Executes the build cycle for every locale.
407-
gracefulFs.readdir(path.join(__dirname, 'locale'), (e, locales) => {
408-
if (e) {
409-
throw e;
410-
}
411-
const filteredLocales = locales.filter(
412-
(file) =>
413-
junk.not(file) &&
414-
(selectedLocales ? selectedLocales.includes(file) : true)
415-
);
416-
const localesData = generateLocalesData(filteredLocales);
417-
filteredLocales.forEach((locale) => {
418-
buildLocale(source, locale, { preserveLocale, localesData });
419-
});
389+
const graceFulFsPromise = gracefulFs.promises;
390+
const locales = await graceFulFsPromise.readdir(
391+
path.join(__dirname, 'locale')
392+
);
393+
394+
const filteredLocales = locales.filter(
395+
(file) =>
396+
junk.not(file) &&
397+
(selectedLocales ? selectedLocales.includes(file) : true)
398+
);
399+
const localesData = generateLocalesData(filteredLocales);
400+
filteredLocales.forEach((locale) => {
401+
buildLocale(source, locale, { preserveLocale, localesData });
420402
});
421403
});
422404
}

server.js

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// The server where the site is exposed through a static file server
44
// while developing locally.
55

6-
const fs = require('fs');
6+
const fs = require('fs/promises');
77
const http = require('http');
88
const path = require('path');
99
const chokidar = require('chokidar');
@@ -48,45 +48,42 @@ function getLocale(filePath) {
4848
// This function has two meanings:
4949
// 1. Build for the specific language.
5050
// 2. Choose what languages for the menu.
51-
function dynamicallyBuildOnLanguages(source, locale) {
51+
async function dynamicallyBuildOnLanguages(source, locale) {
52+
let localesData = null;
53+
5254
if (!selectedLocales || selectedLocales.length === 0) {
53-
fs.readdir(path.join(__dirname, 'locale'), (err, locales) => {
54-
if (err) {
55-
throw err;
56-
}
57-
58-
const filteredLocales = locales.filter((file) => junk.not(file));
59-
const localesData = build.generateLocalesData(filteredLocales);
60-
build.buildLocale(source, locale, { preserveLocale, localesData });
61-
});
55+
const localesPath = path.join(__dirname, 'locale');
56+
const locales = await fs.readdir(localesPath);
57+
const filteredLocales = locales.filter((file) => junk.not(file));
58+
localesData = build.generateLocalesData(filteredLocales);
6259
} else {
63-
const localesData = build.generateLocalesData(selectedLocales);
64-
build.buildLocale(source, locale, { preserveLocale, localesData });
60+
localesData = build.generateLocalesData(selectedLocales);
6561
}
62+
build.buildLocale(source, locale, { preserveLocale, localesData });
6663
}
6764

6865
build.getSource((err, source) => {
6966
if (err) {
7067
throw err;
7168
}
7269

73-
locales.on('change', (filePath) => {
70+
locales.on('change', async (filePath) => {
7471
const locale = getLocale(filePath);
7572

7673
if (!selectedLocales || selectedLocales.includes(locale)) {
7774
console.log(
7875
`The language ${locale} is changed, '${filePath}' is modified.`
7976
);
80-
dynamicallyBuildOnLanguages(source, locale);
77+
await dynamicallyBuildOnLanguages(source, locale);
8178
}
8279
});
8380

84-
locales.on('add', (filePath) => {
81+
locales.on('add', async (filePath) => {
8582
const locale = getLocale(filePath);
8683

8784
if (!selectedLocales || selectedLocales.includes(locale)) {
8885
console.log(`The language ${locale} is changed, '${filePath}' is added.`);
89-
dynamicallyBuildOnLanguages(source, locale);
86+
await dynamicallyBuildOnLanguages(source, locale);
9087
locales.add(filePath);
9188
}
9289
});

0 commit comments

Comments
 (0)