Matthijs De Ligt passed a late fitness test to start for Juve, who also welcomed back Alex Sandro and Gonzalo Higuain from the Turin derby win over Torino. Meanwhile, former Liverpool midfielder Suso was recalled to the midfield.
Polish international Krzysztof Piatek missed the big chance of the opening 15 minutes when he directed a perfectly placed cross wide to the far corner with Juve caught napping at the back.
A terrific save from Wojciech Szczesny following a spate of one-touch passes parried Rafael Leao’s looping header for a corner 25 minutes on the clock.
Milan continuing peppering the Pole in the final minutes to halftim, with blistering drives one after the other from Ismael Bennacer and Piatek.
The home side were renewed after halftime and threatened the opener through Blaise Matuidi who curled wide of the far right corner six minutes into the restart.
Cristiano Ronaldo, who endured a quiet evening, was removed for Paulo Dybala in the 55th minute as Maurizio Sarri looked for a different attacking dimension.
The Bianconneri grew stronger thereafter and forced countless errors of their counterparts from the middle of the park, however chances kept going astray.
Dybala put the cat amongst the pigeons when he skipped past Alessio Romagnoli to drill into the bottom corner in the final 14 minutes.
Milan went on the attack minutes later and probed for the equaliser, but Hakan Calhanoglu’s long range shot from outside the area was safely gathered by Szczesny, as the Italian champions grabbed the points overall to leapfrog Inter Milan into the top spot.