Given the dominant nature of Fulham’s first half display at the New Den, they really shouldn’t have been hanging on after Benik Afobe’s freak first goal for Millwall offered the hosts hope of an unlikely revival. Marco Silva’s side carried on from their sparkling showing at Huddersfield – brushing aside the absence of a couple of key players – to storm into a two-goal lead within eight minutes. Their catalyst was the classy Fabio Carvalho, the talented teenager who led Gary Rowett’s side a merry dance, streaking away from Millwall defenders to create the first for Aleskandar Mitrovic and rolling into a composed finish after racing onto Neeskens Kebano’s through ball to double the lead.

Carvalho has always been highly rated at Motspur Park since Fulham were alerted to his brilliant displays at Balham by a coach who happened to hold a season ticket at Craven Cottage. The Lisbon-born but London-moulded midfielder didn’t look out of place when he enlivened an already relegated Fulham side at the tail end of the Premier League season and the highest compliment you can pay him is that he has ensured that Silva has yet to miss the majesty of captain Tom Cairney in the number ten role. The need to tie him down to a contract beyond the end of the season becomes more urgent with each devastating display.

He showed a serious burst of pace to fashion Fulham’s opener – surging onto a pass down the left flank from Ivan Cavaleiro and leaving Millwall defenders trailing in his wake as he advanced along the byline before teeing up Aleksandar Mitrovic for his second goal in four days. The Serbian’s sidefooted finish from close range was more conventional than the way he broke his duck in Yorkshire – but the end result was exactly the same.

The visitors eased into a two-goal lead five minutes later. Neeskens Kebano, recalled after Bobby Decordova-Reid picked up a minor injury in the lead up to this game, sauntered into far too much space from the right and measured a perfect through ball for Carvalho. The youngster barely had to break stride after his clever run between the Millwall centre halves and surprised Bartosz Bialkowski at his near post with a clinical finish.

The only surprise by half time was that Fulham hadn’t entirely killed off the contest. Their spellbinding passages of football were reminiscent of the Tigana and Jokanovic sides that utterly dominated the division, but they couldn’t add a third despite being in complete command. The lively Kebano twisted and turned but saw a shot well blocked by Jake Cooper and when Carvalho led a lightning break from the back, Cavaleiro somehow failed to find the corner from the left angle of the penalty area. Both Kebano and Carvalho were denied by desperate bits of defending as Silva’s side finished in the ascendancy.

Rowett changed things around at half time – sending on former Fulham forward Matt Smith in a tacit admission that he had got his approach badly wrong – but the visitors still looked the more likely to score. Millwall were indebted to Bialkowski for a brilliant double save at the start of the second period – the Polish goalkeeper clawed away a Mitrovic volley and then blocked Carvalho’s follow-up. Daniel Ballard, who shone like a beacon at the heart of the home side’s stretched defence, did superbly to deny Carvalho with the goal gaping and then threw himself in front of Mitrovic to prevent the Serbian from scoring – clattering his own goalkeeper in the process.

Cooper slid in to deny Carvalho a second after excellent link-up play between Robinson and Cavaleiro down the left and Bialkowski beat away a venomous drive from the former Wolves winger as Fulham found the third goal ever so elusive. The danger of their two-goal lead was underlined when Smith headed a marvellous cross from Scott Malone fractionally over. The former Fulham front man did have a telling part to play in proceedings when his header bounced off Afobe and looped in over Paulo Gazzaniga to give Millwall hope of a miraculous comeback.

The New Den roared their approval and the Lions almost managed it. Afobe shot straight at Gazzaniga with Fulham’s defence suddenly all at sea when a bit more composure might have delivered a late leveller. Cooper had an even clearer chance deep into stoppage time after Gazzaniga had made a madcap dash to try and claim Jed Wallace’s cross but the centre back’s header flew over. It was a heartstopping end for Fulham, whose early fluency should have carried them well clear of such late drama.

MILLWALL (5-3-2): Bialkowski; Romeo (Smith 45), Malone, Ballard, M. Wallace, Cooper; Leonard (McNamara 79), Kieftenbeld (Evans 79), Saville; J. Wallace, Afobe. Subs (not used): Long, Pearce, B. Mitchell, Bradshaw.

BOOKED: Romeo, Malone, Evans, Cooper.

GOAL: Afobe (87).

FULHAM (4-2-3-1): Gazzaniga; Tete, A. Robinson, Adarabioyo, Ream; Seri, Onomah (Anguissa 45); Cavaleiro (Bryan 85), Kebano (Mawson 90+1), Carvalho, Mitrovic. Subs (not used): Rodak, Odoi, Francois, Stansfield.

BOOKED: Mitrovic, Gazzaniga.

GOALS: Mitrovic (3), Carvalho (8).

REFEREE: Geoff Eltringham (County Durham).

ATTENDANCE: 12,700.