Going without a win for three years before the Portuguese GP sprint, Vinales made it back-to-back wins in the half-distance races as he streaked away from the field.
Securing the holeshot from pole, Vinales came under no trouble as he moved over two seconds clear of the pack over the 10 laps before eventually taking the chequered flag 2.294 seconds in front.
Marquez scored his second successive runner-up sprint result on the Gresini Ducati, having fended off Tech3 rookie Pedro Acosta before pulling clear of third when championship leader Jorge Martin moved into the position.
Martin increased his championship lead to 24 points as factory Ducati duo Enea Bastianini and Francesco Bagnaia struggled for pace.
Bastianini was 8.6s from the win in sixth, while Bagnaia struggled to a lowly eighth having languished outside of the sprint points for much of the 10 laps.
At the start, Vinales led Marquez and Acosta as Bagnaia faded to 10th following a poor launch, while Bastianini jumped up to fourth on the sister factory team Ducati.
That leading trio quickly broke away from Bastianini, who was already 0.7s adrift on lap two.
Martin moved ahead of Bastianini at Turn 7 on lap three, but faced a 1.2s gap to the final podium spot as Vinales in the lead twisted the knife.
Jorge Martin, Pramac Racing
Photo by: Gold and Goose / Motorsport Images
The Aprilia rider posted the fastest lap of the race with a 2m02.275s on the third tour to take a 0.9s lead over Marquez, which he swelled to 1.5s come the start of the fifth lap.
That gap would only grow as Acosta tried to take second from Marquez on lap six, attempting a move on the inside of the Turn 7 left-hander.
But Acosta ran wide and Marquez swooped back through into Turn 8, before Martin took third from Acosta moments later into Turn 11.
Despite a small error at Turn 12 on lap eight, Vinales’ lead came under no threat as he eased to the chequered flag.
Marquez pulled the pin in the latter stages to get second, 2.1s clear of Martin, with Acosta fourth and Aprilia’s Aleix Espargaro 0.177s adrift in fifth.
Bastianini was sixth after a late battle with KTM’s Jack Miller, while Bagnaia recovered to eighth ahead of Trackhouse Racing’s Raul Fernandez.
Only one Honda made it to the finish, with Luca Marini 22.989s off the lead in 17th and last after team-mate Joan Mir and LCR duo Takaaki Nakagami and Johann Zarco all suffered crashes.
Fabio Quartararo was the lead Yamaha in 15th, while VR46 Ducati rider Fabio Di Giannantonio dropped out on lap one with a bike issue.
Tech3’s Augusto Fernandez also crashed out of the race.