Jake Bidwell scored his first Swansea City goal and Ben Cabango netted the winner as Steve Cooper’s side made it three wins from four Championship games.
Bidwell had opened the scoring just seconds into the second half with an intelligent far-post finish, only for that effort to be cancelled out by Tom Bradshaw’s left-footed effort.
But the hosts would not be denied, and Cabango was on hand to fire in a rebound with 22 minutes remaining to give the Swans the edge in a tight contest.
Cooper was also able to hand a debut to new signing Viktor Gyokeres, as the Sweden international got 15 minutes under his belt from the bench.
The hosts showed one change to their starting line-up as Steven Benda was handed a debut in goal with Freddie Woodman ruled out by a stomach bug.
New signing Gyokeres, meanwhile, was among the substitutes following his arrival on loan from Brighton.
The Swans made a decent start, and were left frustrated when referee Stephen Martin waved away penalty appeals after Cabango was bundled over in the box by Shaun Hutchinson.
Benda made a similarly confident start, producing a pair of excellent passes to find skipper Matt Grimes and beat the visitors’ high press.
But Millwall also produced some neat, fluid passages of play, with Joe Rodon doing well to cut out a Jed Wallace cross as Bradshaw waited expectantly.
Swansea responded, Jamal Lowe firing an inviting ball across the six-yard box with no white shirt near enough to capitalise, before Grimes fired an effort straight at Bartosz Bialkowski as Swansea began to take a grip on proceedings at the 20-minute mark.
Marc Guehi was booked as he brought down Wallace after Rodon had seen his pass picked off in the middle of the park, before Andre Ayew fired wide after driving infield from the left flank.
The hosts then failed to make the most of good pressing work by Lowe as Ayew, Korey Smith and the striker himself all failed to get a shot away when presented with the chance.
It was proving to be as evenly-contested as the respective bosses had predicted pre-match, and Guehi made a superb block as Mason Bennett powered a header towards Benda’s goal from a chipped Scott Malone cross.
Jake Cooper did likewise in the Millwall area, getting in the way as Lowe arrived to meet Ayew’s clipped centre as it remained goalless at the break.
But the deadlock was broken just 45 seconds into the second half as Bidwell found the net for the first time in Swansea colours.
Morgan Gibbs-White produced a great turn on the right side of the area, and Bidwell cleverly diverted his deep cross in at the far post as Mahlon Romeo attempted to block his path to goal.
It was the ideal start for Cooper’s side, but their lead lasted barely five minutes.
Bradshaw took a touch away from Guehi on the edge of the area, and his low strike beat Benda at his near post.
The equaliser – the first goal Swansea had conceded in the league this season - sparked a good period for the Lions, with Wallace becoming increasingly influential.
Rodon blocked the Millwall midfielder’s strike from the edge of the box, while Romeo made up for being outfoxed by Bidwell for the goal by flinging himself in front of the wing-back’s low shot.
And Bidwell was involved again as Swansea restored their lead in the 68th minute.
Gibbs-White’s free-kick was half-cleared to Lowe, whose shot was backheeled goalward by Bidwell.
Bialkoswski made an outstanding stop to deny the former Everton man a second goal of the game, but could do nothing as Cabango lashed the loose ball into the far corner of the net.
There was still plenty of time left and it became an increasingly frenetic conclusion as play swept from end to end.
Gyokeres showed glimpses of what he will bring with several tidy contributions to Swansea attacks, but it was Benda who provided the late heroics as he made a superb save after Cooper powerfully met an inswinging corner with his head.
Swansea City: Steven Benda; Ben Cabango, Joe Rodon, Marc Guehi; Connor Roberts, Korey Smith, Matt Grimes (captain), Jake Bidwell; Morgan Gibbs-White (Jay Fulton 80); Andre Ayew, Jamal Lowe (Viktor Gyokeres 75).
Substitutes: Lewis Webb, Wayne Routledge, Liam Cullen, Kyle Naughton, Jordon Garrick.
Millwall: Bartosz Bialkowski; Shaun Hutchinson, Alex Pearce (captain) (Jon Dadi Bodvarsson 85) Jake Cooper; Mahlon Romeo, Ryan Woods, Ryan Leonard, Scott Malone; Jed Wallace, Mason Bennett (Connor Mahoney 74), Tom Bradshaw (Matt Smith 75).
Substitutes: Frank Fielding, Murray Wallace, Shaun Williams, Ben Thompson.
Referee: Stephen Martin