Vancouver’s Braden Holtby stopped 34 of 38 shots. Winnipeg’s Laurent Brossoit had 30 saves.
The Canucks pulled Holtby with just over three minutes to go. Wheeler scored an empty-net goal with 2:10 remaining.
Stastny gave Winnipeg some breathing room 9:13 into the third period, blasting a wrist shot past Holtby from the bottom of the slot to make it 4-2.
The Canucks were down 3-1 late in the second when they cut the lead to a goal on a power play.
Winnipeg defenseman Tucker Poolman was called for interference after bringing down Nils Hoglander near the Jets’ blue line. Vancouver capitalized when Miller ripped a shot past Brossoit with 4.7 seconds left on the clock.
The Canucks were 1 for 2 on the power play. Winnipeg was 1 for 3 with the man advantage.
The Jets’ power-play goal put the home side up 3-1 early in the second frame.
Wheeler sent a pass through several defenders in front of the Canucks net to Connor, who sent a low shot through Holtby’s pads.
Winnipeg’s first goal of the game came 5:19 into the first. Holtby made a stop on Adam Lowry but couldn’t control the rebound. The puck popped out to Lowry, who shoved it into the net.
The Canucks were quick to respond. Boeser, deep in the Jets end, swept a pass to Pettersson at the top of the slot. The Swedish center took a few strides and fired a wrist shot past Brossoit to even the score.
Some sloppy defensive play by Vancouver helped Winnipeg take a one-goal lead into the first intermission.
Brandon Sutter dove, trying to sweep the puck from the Canucks zone. Instead, it was picked up by Perreault, who waltzed in and fired a shot past Holtby with 2.6 seconds left in the period.
NOTES: Poolman returned to the Jets lineup after missing three games with an undisclosed injury. … Canucks winger Jake Virtanen played his 300th NHL game.
Canucks: Open a two-game set at home against the Toronto Maple Leafs on Thursday.