如何优化Gulp 4.0.2等待Express 4.17.1启动后打开浏览器的任务
优化Gulp 4等待Express启动后打开浏览器的实现
嘿,你的现有方案确实能正常运行,但借助Gulp 4对异步任务的良好支持,再结合现代JavaScript的异步写法,我们可以让代码更简洁、易读且易于维护。下面分享几个优化思路和实现:
思路1:用Async/Await替代回调式重试
原来的回调嵌套和手动定时器清理略显繁琐,换成async/await可以让异步逻辑更像同步代码,可读性大幅提升:
const http = require('http'); const opn = require('opn'); // 封装服务就绪检查为异步函数 async function checkServerReady(config) { return new Promise((resolve) => { http.get({ host: 'localhost', port: config.port }) .on('response', () => resolve(true)) .on('error', () => resolve(false)); }); } // 循环等待服务就绪,间隔250ms检查一次 async function waitForServer(config) { let isReady = false; while (!isReady) { isReady = await checkServerReady(config); if (!isReady) { // 等待250ms后重试 await new Promise(resolve => setTimeout(resolve, 250)); } } } // 优化后的start:client任务 gulp.task('start:client', async () => { // 确保获取正确的配置(避免全局变量污染) process.env.NODE_ENV = process.env.NODE_ENV || 'development'; const config = require(`./${serverPath}/config/environment`).default; await waitForServer(config); // 服务就绪后打开浏览器 await opn(`http://localhost:${config.browserSyncPort}`); });
优化点说明
- 用
async/await消除了嵌套回调,逻辑线性化,更易理解 - 去掉了手动清理定时器的代码,
while循环天然处理重试逻辑 - 把配置获取内联到任务中,避免全局变量的作用域问题
思路2:借助小工具包简化重试逻辑
如果不想自己写重试循环,可以用p-retry这个轻量工具包来进一步简化代码:
- 先安装依赖:
npm install p-retry --save-dev
- 改写等待逻辑:
const pRetry = require('p-retry'); const http = require('http'); const opn = require('opn'); async function checkServerReady(config) { const isReady = await new Promise((resolve) => { http.get({ host: 'localhost', port: config.port }) .on('response', () => resolve(true)) .on('error', () => resolve(false)); }); if (!isReady) { // 抛出错误让p-retry自动重试 throw new Error('Server not ready'); } } gulp.task('start:client', async () => { process.env.NODE_ENV = process.env.NODE_ENV || 'development'; const config = require(`./${serverPath}/config/environment`).default; // 配置重试规则:一直重试、间隔250ms await pRetry(() => checkServerReady(config), { retries: Infinity, minTimeout: 250, factor: 1 // 不递增重试间隔 }); await opn(`http://localhost:${config.browserSyncPort}`); });
优势
- 重试逻辑完全交给成熟的工具包处理,减少自己写循环的冗余代码
- 可以灵活配置重试次数、间隔时间等参数,扩展性更好
关于start:server任务的小建议
原来的start:server任务可以保持不变,但建议把配置获取抽成独立函数,避免重复代码:
function getServerConfig() { process.env.NODE_ENV = process.env.NODE_ENV || 'development'; return require(`./${serverPath}/config/environment`).default; } gulp.task('start:server', () => { const config = getServerConfig(); nodemon(`--inspect --trace-deprecation --trace-warnings -w ${serverPath} ${serverPath}`) .on('log', onServerLog); });
这样start:client也可以调用getServerConfig()来获取配置,保持代码一致性。
内容的提问来源于stack exchange,提问作者nstuyvesant
相关产品推荐
相关产品推荐

