Dortmund were impressive ahead of Tuesday's Champions League last 16, first-leg, clash at home to Paris Saint-Germain, coached by ex-Borussia boss Thomas Tuchel, this convincing win lifting them to second in the Bundesliga.
They sit a point behind leaders Bayern Munich, who play strugglers Cologne away on Sunday.
Dortmund dominated a limited Frankfurt team, who looked a shadow of the side which hammered Bayern 5-1 last November and beat Leipzig 2-0 last month.
Frankfurt could only come up with one shot on goal, compared to Dortmund's 17 at Signal Iduna Park.
After goals by Lukasz Piszczek and Jadon Sancho, Haaland again showed some clinical finishing to smash home a second-half pass and continue his phenomenal tally before Raphael Guerreiro added a late fourth.
The 19-year-old Haaland, who scored 28 goals in 22 games this season for Salzburg before Dortmund paid 20 million euros ($22 million) for him, now has eight goals in five league games, plus one in the 3-2 German Cup defeat to Werder Bremen.
Haaland was replaced 12 minutes from time and came off to a standing ovation from the 81,000 crowd.
After Guerreiro hit the post for Dortmund early on, the hosts took the lead through right-back Piszczek.
The Poland international, stand-in captain with Marco Reus sidelined by a leg injury, cracked a long-range goal off his left foot on 33 minutes.
Sancho and Haaland, both 19, then put the result beyond doubt with two goals inside four minutes after the break.
England winger Sancho showed his class when a long pass by Axel Witsel found him on the left wing.
He powered into the box before tucking his shot past Frankfurt goalkeeper Kevin Trapp on 50 minutes.
Sancho was then involved in Haaland's goal when he fed Achraf Hakimi and the right winger provided the final pass which the Norwegian teen converted on 54 minutes.
It became a rout when Hakimi tried to pass back for Haaland, who could not control the ball.
The Frankfurt's defence cleared the danger, but the ball went only as far as Guerreiro, who hit the bottom corner on 74 minutes.
This was Dortmund's first win in three games after the cup defeat as Bremen and last Saturday's 4-3 defeat at Leverkusen when they leaked two goals in the dying stages.