In the first half, Spain forward Ferran Torres was assisted twice by Lamine Yamal on the teenager's 100th LaLiga appearance to give Barca the advantage at the break.
Pol Lozano pulled one back in the second half, but two late goals from Yamal and Marcus Rashford wrapped up three points for Barca, who extended their lead at the top of the table.
Atletico Madrid slipped to a third successive league defeat after being beaten 2-1 by Sevilla.
Javier Bonar had equalised following Akor Adams' 10th-minute penalty, but Nemanja Gudelj found the eventual winner for Sevilla.
Elche claimed a 1-0 win over Valencia, while Lucas Boye scored a late equaliser as Real Sociedad were held to a 3-3 draw by Alaves.
The score was 2-2 at half-time and Orri Oskarsson sent the hosts ahead on the hour mark, but late drama included Sergio Gomez being dismissed for Sociedad in the third minute of stoppage time before Boye struck for Alaves four minutes later.
In the Bundesliga, Bayern Munich took their goal tally to a record 105 for the season after beating St Pauli 5-0.
Jamal Musiala put Bayern ahead nine minutes in, to equal the 101 goals of the Bayern team of 1971/72, and Leon Goretzka's second-half effort eclipsed that feat.
Michael Olise, Nicolas Jackson and Raphael Guerreiro wrapped up the win to go 12 points clear at the top after second-placed Borussia Dortmund were beaten by Bayer Leverkusen.
Robert Andrich scored the only goal of the game as Dortmund slipped away from the league leaders and Yan Diomande's goal helped third-placed Leipzig beat Borussia Monchengladbach 1-0.
Mathias Honsak scored a brace as basement side Heidenheim beat Union Berlin 3-1 to end their run of 15 Bundesliga fixtures without a win.
First-half goals from Oscar Hojlund and Arnaud Kalimuendo were enough for Eintracht Frankfurt to beat Wolfsburg 2-1.
Jeremie Boga scored the only goal of the game for Juventus to earn a 1-0 win over Atalanta and move into the top four of Serie A.
Juve are three points behind AC Milan, who dropped back after being beaten 3-0 by Udinese, their second successive league defeat.
Milan fell behind after Davide Bartesaghi turned the ball into his own net and Jurgen Ekkelenkamp doubled Udinese's advantage before Arthur Atta wrapped up three points.
Sebastiano Esposito's goal was the difference as Cagliari beat fellow-strugglers Cremonese 1-0, while Cesare Casadei scored the winner as Torino earned a 2-1 win over second-from-bottom Verona.
In Ligue 1, Rennes earned back-to-back wins after beating Angers 2-1 and Auxerre's meeting with Nantes ended goalless.