diff --git a/packages/@vue/cli-service/lib/commands/serve.js b/packages/@vue/cli-service/lib/commands/serve.js index 0852171c5b..81f319e36b 100644 --- a/packages/@vue/cli-service/lib/commands/serve.js +++ b/packages/@vue/cli-service/lib/commands/serve.js @@ -1,5 +1,6 @@ const { info, + error, hasProjectYarn, openBrowser, IpcMessenger @@ -76,8 +77,14 @@ module.exports = (api, options) => { const useHttps = args.https || projectDevServerOptions.https || defaults.https const protocol = useHttps ? 'https' : 'http' const host = args.host || process.env.HOST || projectDevServerOptions.host || defaults.host - portfinder.basePort = args.port || process.env.PORT || projectDevServerOptions.port || defaults.port - const port = await portfinder.getPortPromise() + let port = args.port || process.env.PORT || projectDevServerOptions.port + let hasUserGivenPort = true + // just use portfinder when user not set port + if (!port) { + hasUserGivenPort = false + portfinder.basePort = defaults.port + port = await portfinder.getPortPromise() + } const rawPublicUrl = args.public || projectDevServerOptions.public const publicUrl = rawPublicUrl ? /^[a-zA-Z]+:\/\//.test(rawPublicUrl) @@ -276,6 +283,14 @@ module.exports = (api, options) => { if (err) { reject(err) } + }).on('error', err => { + if (hasUserGivenPort && err.code === 'EADDRINUSE') { + console.log() + error(`Address already in use ${err.address}:${err.port}.`) + info(`You can change the port by ${chalk.cyan('--port')} option or ${chalk.cyan('vue.config.js')} or ${chalk.cyan('package.json')}.`) + process.exit(1) + } + reject(err) }) }) })