The 21-year-old striker, who was among the nominees for September's PL2 Player of the Month, opened the scoring after 25 minutes, heading in George Byers' cross.
He made it 2-0 four minutes later with a cool finish past Jamie Cummings.
On 40 minutes it was 3-0, the Scot curling in from just inside the area to finish off a fine counter-attack for his eighth goal in five matches.
Kylian Hazard netted a consolation strike for Chelsea, his first for the Blues, but Swansea held on.
Sixth-placed Swansea are next in Division 1 action at Leicester City on 23 October, while Chelsea, in eighth, host West Ham United the previous day.