");$( "#content-area" ).prepend($addFlag);} }// This function handles animation for the new ToC, which currently includes:// 1. Fading the ToC in and out to prevent it from covering up the Info section in the footer ; function handleTocAnim( $tocBox, winHeight, docHeight, scrollTop ) { // We're going to check if we're near the bottom for an animation to hide the ToC so we don't // cover up the Info section in the footer var bottomBuffer = 384; //px var isNearBottom = scrollTop + winHeight > docHeight - bottomBuffer; // Fetch the value for the animFlag key var tocAnimating = $tocBox.data( "animFlag" ); // If ToC has been hidden by the fade anim, display will be 'none' when // finished animating var tocHidden = $tocBox.css( 'display' ) === 'none'; if( isNearBottom ) { // If we're near the bottom, and the ToC is not animating // and not hidden, then hide it if( !tocAnimating && !tocHidden ) { $tocBox.data( "animFlag", true ) $tocBox.fadeOut( 400, function() { $tocBox.data( "animFlag", false ); }); } } else { // If we're not near the bottom, and the ToC is not animating // and hidden, then unhide it if( !tocAnimating && tocHidden ) { $tocBox.data( "animFlag", true ); $tocBox.fadeIn( 400, function() { $tocBox.data( "animFlag", false ); }); } } }// Calculate the available height for the ToC Box ; function calcAvailableHeight( height ) {return height * 80.0 / 100.0;}// This function resizes specific page elements, depending on // window size and whether the ToC is present, to keep things // consistent.// The boolean debug arg enables verbose logging. ; function handleReflow( $, winOuterWidth, winInnerHeight, maxMobileWidth, debug ) {if( debug ) {console.log( "Checking if page layout should be reflowed..." );}// We want to reflow the layout whether or not we have the TOC, // with the hasTOC bool as a flag for if it exists on the pagevar tocFlag = $("#content-side");var hasToC = true; // FORCE HAS TOC, DEPLOYING SITEWIDE -supersoup// Check number of H2 elements. If <= 3, early returnvar numH2 = $("h2");if( numH2.length <= 3 ) {return;}// Cache varsvar $mainContainer = $("#main-content");var $logoContainer = $(".hgg-logo-space");var $navContainer = $(".hgg-menu-icon");var $contentArea = $("#content-area");// Null-check variablesvar anyNull = $mainContainer.length && $logoContainer.length && $navContainer.length && $contentArea.length;if( !($mainContainer.length) && debug ) {console.log( "$mainContainer null in reflowLayout..." );}if( !($logoContainer.length) && debug ) {console.log( "$logoContainer null in reflowLayout..." );}if( !($navContainer.length) && debug ) {console.log( "$navContainer null in reflowLayout...")}if( !($contentArea.length) && debug ) {console.log( "$contentArea null in reflowLayout..." );} if( debug ) {console.log( "anyNull: " + anyNull );console.log( "hasTOC: " + hasToC );}if( hasToC ) {// The previous process for initializing offsetTopForView didn't play well when// refreshing the page while partially down the post, switching to pulling the // header height for consistency -supersoupvar offsetTopForView = $("header").height() ; //pxif (offsetTopForView === undefined || offsetTopForView < 0) {offsetTopForView = 0;}var $toc = $( ".toc-box" );if( $toc.length > 0 ) {var availableHeight = calcAvailableHeight( winInnerHeight - offsetTopForView );if( debug ) {console.log( "window.innerHeight: " + winInnerHeight );console.log( "availableHeight: " + availableHeight );console.log( "toc[0].scrollHeight: " + $toc[0].scrollHeight );console.log( "toc.height(): " + $toc.height() );}if( $toc.outerHeight() > availableHeight ) {$toc.css( 'height', availableHeight );if( debug ) {console.log( "Setting ToC height to ", availableHeight );}} else {var newHeight = availableHeight < $toc[0].scrollHeight ? availableHeight : $toc[0].scrollHeight;$toc.css( 'height', newHeight );if( debug ) {console.log( "Setting ToC height to ", newHeight );}}/*// Update largest sizevar maxSize = $toc.data( "maxSize" );var outerHeight = $toc.outerHeight;if( maxSize === 0 || maxSize == undefined || maxSize == NaN || maxSize < cssHeight ) {$toc.data( "maxSize", $toc.outerHeight);console.log( "maxSize is now " + $toc.outerHeight );}*/if( $toc.height() < $toc[0].scrollHeight ) {$toc.css( 'overflow-x', 'hidden' );$toc.css( 'overflow-y', 'auto' );}else {$toc.css( 'overflow-x', 'hidden' );$toc.css( 'overflow-y', 'none' );}}if( winOuterWidth >= 1600 ) {$mainContainer.css( "margin-left", "15.95rem" );$logoContainer.css( "margin-left", "-6.1rem" );$navContainer.css( "margin-right", "-8.0rem" );} else if( winOuterWidth < 1600 && winOuterWidth > maxMobileWidth ) {$mainContainer.css( "margin-left", "14.8rem" );$logoContainer.css( "margin-left", "-3.8rem" );$navContainer.css( "margin-right", "-3.8rem" );} else if( winOuterWidth <= maxMobileWidth ) {// Clear applied CSS$mainContainer.css( "margin-left", "0" );$logoContainer.css( "margin-left", "0" );$navContainer.css( "margin-right", "0" );} else {if( debug ) {console.log( "Unhandled window width in reflowLayout() - With ToC" );}}} else {if( winOuterWidth >= 1600 ) {// Don't do anything yet on non-ToC pages} else if( winOuterWidth < 1600 && winOuterWidth > maxMobileWidth ) {$contentArea.css( "margin-left", "0");} else if( winOuterWidth <= maxMobileWidth ) {// Don't do anything yet on non-ToC pages} else {if( debug ) {console.log( "Unhandled window width in reflowLayout() - Without ToC" );}}} }// Handles reflowing content on the page depending on different variables; (function (window, $, undefined) {$.fn.reflowLayout = function() {// Mobile width for reflow, probably want to sync// with max mobile width for the ToCconst MAX_MOBILE_WIDTH = 1438;// Should we enable verbose logging for debugging?// SHOULD NOT BE TRUE IN PRODUCTION! -supersoupvar debug = false;handleReflow( $, window.outerWidth, window.innerHeight, MAX_MOBILE_WIDTH, debug );$(window).on( 'load', function () {handleReflow( $, window.outerWidth, window.innerHeight, MAX_MOBILE_WIDTH, debug );});// For reflowing when browser size changes$(window).on( 'resize', function () {handleReflow( $, window.outerWidth, window.innerHeight, MAX_MOBILE_WIDTH, debug );});/*$(window).on( 'scroll', function () {var $toc = $( ".toc-box" );if( $toc.length === 0 )return;console.log( "availableHeight: " + calcAvailableHeight( window.innerHeight ) );console.log( "toc[0].scrollHeight: " + $toc[0].scrollHeight );console.log( "toc.outerHeight(): " + $toc.outerHeight() );});*/};})(this, jQuery);// Transform guide content by visually organizing it into cards ; (function(window, $, undefined) { $.fn.cardify = function() { var $contentBody = $("#content-body"); if($contentBody === 0) { return; } var $contentBodyChildren = $contentBody.children(); var $h2s = $contentBody.children("h2"); console.log("H2 children of #content-body: " + $h2s.length); if($h2s.length === 0) { return; } for(var i = 0; i < $h2s.length; i++) { var $array = $contentBodyChildren.nextUntil("h2"); $array.each( function(index) { console.log("Element " + index + ": " + $(this).html()); }); // console.log("Card " + i + ":" + $contentBodyChildren.nextUntil("h2").html()); } } }(this, jQuery));// Create the top level TOC before the first heading // The boolean debug arg enables verbose logging. ; function createTopLevelTOC( $, debug ) {var $contentBody = $("#content-body");if( $contentBody === 0 ) {return;}var headingsToFind = ["h2", "h3"]; var $headings = $contentBody.find(headingsToFind.join(","));if( debug ) {console.log(`Headings found: ${$headings.length}`);}if( $headings.length === 0 ) {return;}var tocContainer = document.createElement("div");tocContainer.id="top_toc_container";tocContainer.classList.add("top_toc_container");var tocTitle = document.createElement("p");tocTitle.classList.add("top_toc_title");tocTitle.innerHTML = "Table of Contents";tocContainer.append(tocTitle);var tocList = document.createElement("ul");tocList.classList.add("top_toc_list");let h2Count = 1;let h3Count = 1;for( let i = 0; i < $headings.length; i++ ) {var item = document.createElement("li");var itemTagName = $headings[i].tagName;var tagIsH3 = itemTagName === "H3";if ( debug ) {console.log(`Item ${i} tagName: ${itemTagName}`);}var count = i+1;if( tagIsH3 ) {item.classList.add("top_toc_item_h3");count = h3Count;h3Count++;}else {item.classList.add("top_toc_item_h2");count = h2Count;h3Count = 1; // Reset h3 counth2Count++;}var innerText = `${tagIsH3 ? " - " : ""} ${$headings[i].innerText}`;item.innerHTML =`${innerText}`;tocList.append(item);}tocContainer.append(tocList);var $topHeading = $headings[0];$topHeading.before(tocContainer);if( debug ) {console.log("Successfully added top level ToC");}}// The main function for creating, populating, and managing the new ToC ; (function (window, $, undefined) { $.fn.createTOC = function (settings) {const MAX_MOBILE_WIDTH = 1438;// Before anything else, if this is a post in a Category that we // specifically want to force the ToC on, let's handle that// THIS IS NO LONGER NEEDED, as we're pushing ToC sitewide -supersoup// handleForceToC( $ );// We want to create the inline top level ToC if we're not generating // the sidebar tocif ( $(window).width() <= MAX_MOBILE_WIDTH ) {createTopLevelTOC( $, false );}// For now, we only want to add the new ToC to manually flagged posts.// The post is flagged with the presence of a
// contained within the content of the post. Originally, this div was being used// to wrap the ToC, but I (supersoup) am going to move the ToC out to a new div.// So, the first thing we want to do is test for this div, early return if not // found, or remove it and recreate a #content-side div elsewhere if it is found.var tocFlag = $("#content-side");var hasToC = !(tocFlag.length === 0);// If #content-side element is foundif( hasToC ) {// Get rid of tosFlag #content-side elementtocFlag.remove();}// Check number of H2 and H3 elements. If <= 3, early returnvar numH2 = $("h2");var numH3 = $("h3");if( numH2.length + numH3.length <= 3 ) {return;}// Proceed with .CreateTOC() var option = $.extend({ title: "hgg-toc", insert: "body", }, settings); var ACTIVE_CLASS = 'active'; var list = ["h2", "h3"]; var $headings = this.find(list.join(",")); var tocBox = document.createElement("ul"); var $tocBox = $(tocBox); tocBox.className = "toc-box"; var idList = []; $headings.map(function (i, head) { var nodeName = head.nodeName; var id = 'toc_' + i + '_' + nodeName; head.id = id; idList.push(id); var row = document.createElement("li"); row.className = 'toc-item toc-' + nodeName; var link = document.createElement('a'); link.innerText = head.innerText; link.className = 'toc-item-link'; link.href = '#' + id; row.appendChild(link); tocBox.appendChild(row); }); // Control the takeover of the highlighted elements var isTakeOverByClick = false; // Event delegate, add click ,Highlight the currently clicked item $tocBox.on("click", ".toc-item", function (ev) { // Set as true ,Represents the click event to take over the control of the highlighted element isTakeOverByClick = true; var $item = $(this); var $itemSiblings = $item.siblings(); $itemSiblings.removeClass(ACTIVE_CLASS); $item.addClass(ACTIVE_CLASS); });// Recreate #content-side element in new locationvar $tocDiv = $("
");$( "#content-area" ).prepend($tocDiv); // Want it to be the first subdiv of #content-areavar headBox = document.createElement("div");headBox.className = "toc-titler";headBox.innerHTML = option.title;var wrapBox = document.createElement("div");wrapBox.className = "wrap-toc";wrapBox.appendChild(headBox);wrapBox.appendChild(tocBox);// If on mobile, set sidebar hiddenif( $(window).width() <= MAX_MOBILE_WIDTH ) {wrapBox.style.display = 'none';} else {wrapBox.style.display = null;}var $insertBox = $(option.insert);var $helperBox = $("
");$helperBox.append(wrapBox);$insertBox.prepend($helperBox);// The style of the storage container boxvar CACHE_WIDTH = $insertBox.css('width');var CACHE_PADDING_TOP = $insertBox.css('paddingTop');var CACHE_PADDING_RIGHT = $insertBox.css('paddingRight');var CACHE_PADDING_BOTTOM = $insertBox.css('paddingBottom');var CACHE_PADDING_LEFT = $insertBox.css('paddingLeft');var CACHE_MARGIN_TOP = $insertBox.css('marginTop'); // var scrollTop = $('html,body').scrollTop(); // var offsetTop = $insertBox.offset().top; // var marginTop = parseInt($insertBox.css('marginTop')); // var offsetTopForView = offsetTop - scrollTop - marginTop; // For initialization on load$(window).on( 'load', function () {initTocAnimData( $insertBox );}); // Rolling ceiling $(window).scroll(function () {// The previous process for initializing offsetTopForView didn't play well when// refreshing the page while partially down the post, switching to pulling the // main-header height for consistency -supersoupvar offsetTopForView = $(".hgg-top-nav").height() ; //px// IE6/7/8: // For pages without doctype declaration, document.body.scrollTop can be used to get the height of scrollTop; // For pages with doctype declaration, document.documentElement.scrollTop can be used;// Safari: // Safari is special, it has its own function to get scrollTop: window.pageYOffset;// Firefox: // Relatively standard browsers such as Firefox can save more worry, just use document.documentElement.scrollTop;var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; // Scroll highlight // Only when the click event cancels the control of the highlighted element, the scroll event can have the control of the highlighted element !isTakeOverByClick && $.each(idList, function (index, id) { var $head = $('#' + id); var $item = $('[href="#' + id + '"]').parent(); var $itemSiblings = $item.siblings();var offsetBuffer = 64; // px, we want the class swap to trigger slightly before so we show an accurate active element// when zooming to a specific element var offsetTopHead = $head.offset().top - offsetBuffer; var isActived = $item.hasClass(ACTIVE_CLASS); if (scrollTop >= offsetTopHead) { $itemSiblings.removeClass(ACTIVE_CLASS); !isActived && $item.addClass(ACTIVE_CLASS); } else { $item.removeClass(ACTIVE_CLASS); } }); // Set to false, which means that the click event will cancel the control of the highlighted element isTakeOverByClick = false;// Handle animation for the ToChandleTocAnim( $insertBox, $(window).height(), $(document).height(), scrollTop );// Handle any changes to ToC CSS on scrollvar isFixed = $helperBox.css("position") === "fixed"; if (scrollTop >= offsetTopForView) {if (isFixed) return;$tocBox.css({overflow: 'auto',padding: 0,});$helperBox.css({position: 'fixed',top: CACHE_MARGIN_TOP,width: CACHE_WIDTH,paddingTop: CACHE_PADDING_TOP,paddingRight: CACHE_PADDING_RIGHT,paddingBottom: CACHE_PADDING_BOTTOM,paddingLeft: CACHE_PADDING_LEFT,backgroundColor: $tocBox.css('backgroundColor')});} else {if (!isFixed) return;$helperBox.css({position: 'static',padding: 0});$tocBox.css({overflow: 'auto',paddingTop: CACHE_PADDING_TOP,paddingRight: CACHE_PADDING_RIGHT,paddingBottom: CACHE_PADDING_BOTTOM,paddingLeft: CACHE_PADDING_LEFT,});} }); };}(this, jQuery));});
by Angus Green | Last Updated: Jan 3, 2023
Image: ZeniMax Online Studios
In Elder Scrolls Online, healers have faced many claims that they’re unneeded in groups. Fortunately for them, this is simply not the case. A good healer who picks their class and build carefully will completely change the way a group gets through encounters. Their beneficial buffs increase the group’s speed and damage, and of course reduces the number of deaths.
The Flames of Ambition DLC and Update 32 have shaken up the standings of class viability, but the healer meta has mostly stayed the same. You can make a great healer out of any class and race combination, but some combos simply do better than others. Here, we delve into the question of which is the best healer class in ESO.
We’ll outline the tier lists below, then explain why each class is where they are in the current patch. Now, let’s jump right into it!
Further Reading:
- ESO Healing Guide for Beginners
- The Best Healer Builds in ESO
- The Best Templar Builds in ESO
ESO Healer Class Tier List
There are several key features that put a specific type of healer ahead of the pack. The first, of course, is how well the healer can output healing (both over time and in bursts) to keep their teammates alive. The second is how well they contribute to increasing group damage and durability through buffs and their own attacks.
Tier | Class |
---|---|
S Tier | Templar, Warden |
A Tier | Necromancer |
B Tier | Sorcerer |
C Tier | Nightblade, Dragonknight |
D Tier | |
F Tier |
ESO Healer Race Tier List
Race plays a role in optimizing your healer as well, so we’ve put together another tier list below:
Tier | Race |
---|---|
S Tier | Breton |
A Tier | Khajiit, High Elf, Dark Elf |
B Tier | Argonian |
C Tier | Imperial |
D Tier | Nord, Orc |
F Tier | Wood Elf, Redguard |
All ESO Classes Ranked Best to Worst by PvE Healing Potential
Now that we’ve established our tier lists, let’s jump into our detailed rankings of ESO’s best healing classes. We’ll start with our highest-tier picks and then move down to the worst class, talking about their status in the meta and covering their most important skills.
1/6
Templar

Templars continue to rein supreme and hold the best healer class throne in ESO. Update 32 helped them out by buffing the Cleansing Ritual ability. It now scales by ~17% more, as the skill only ticks six times since it was changed in Update 30. The solid heals-over-time and Purify synergy heal for even more, along with the great cleanse it’s always offered.
For a list of our top Templar builds, see our guide here.
Skills
Templars have held onto their crown as best healer due to a couple of major reasons. One is that they can cleanse allies for the relatively cheap cost of Extended Ritual instead of Cleanse. Extended Ritual cleanses up to five harmful effects from the caster, and all harmful effects from the player that synergizes with it. This skill is particularly important in Veteran Trials, where some debuffs can quickly cut down the tankiest of players. Cleanse can rid more allies of negative effects, but this can be overkill in most PVE scenarios. Not to mention that 7830 magicka cost is difficult to sustain.
Templars are so coveted in groups largely because of their passives and the buffs they offer. Illuminate, which activates from casting a Dawn’s Wrath ability, grants Minor Sorcery. Light Weaver gives 2 Ultimate to allies that are healed while under 50% health. Master Ritualist makes resurrections go more smoothly during chaotic fights, increasing resurrection speed by 20% and bringing allies back with 100% more health to stop them from falling right back down from a stray AOE.
Breath of Life is a great Templar skill due to its ability to burst heal allies out of sticky situations. Templars can use this skill to quickly heal an ally and avoid a group wipe. Luminous Shards are also a staple for getting through difficult content, as the Holy Shards synergy restores a lot of lost resources to allies in need. It restores 3960 of their major resource (magicka or stamina) and 1980 of their non-major resource. Energy Orb is a great synergy as well, but it’s generally better to go with added resources.
2/6
Warden

Wardens make for very powerful healers and compete with Templars for the #1 best class for healer in ESO. Trial teams tend to optimize with a Templar and a Warden, as they both provide some of the best healing and buffs in the game.
For all of you Warden healers out there, Update 32 finally fixed Healing Seeds in the Green Balance skill line. It hadn’t been adding the 2% additional healing bonus from the Emerald Moss passive, making all Green Balance skills heal for less than they should. With the fix, you can now get 12% additional healing power if you have one bar full of those skills, rather than 10%.
For a list of our best Warden builds, see our guide here.
Skills
The Maturation passive that Wardens provide is one of the main reasons they’re coveted in veteran groups. The Minor Toughness it grants to players healed by a Warden lasts for 20s and increases their maximum health by 10%. This skill increases most DPS and healers’ health by around 2000, and increases the tank’s health anywhere from 3500–5000. Allies will survive a blow that would otherwise have instantly killed them, and they’ll have Maturation to thank for keeping them from the brink.
As said above, the Green Balance passive Emerald Moss is another reason why Wardens heal so well. With each Green Balance skill equipped (usually about 2–3) you’ll gain 2% increase of healing on those skills. 4–6% increased healing potential at 100% uptime certainly isn’t bad.
As far as Green Balance skills go, Budding Seeds is most effective for its burst heal synergy and strong AOE HOT. Second best is Enchanted Growth for a quick, strong AOE heal that also gives you and your allies Minor Intellect and Endurance, increasing magicka and stamina recovery by 15% for 20s. Next is a morph of the Living Vines skill for its strong single-target HOT that can help a group member survive heavy fire. Slotting a morph of Secluded Grove is a great way to increase the healing further, as you can opt to not use it and only pop off Aggressive Warhorns as your group needs.
3/6
Necromancer

Necromancers are the strongest healers outside the Templar/Warden meta due to their strong toolkit. Their abilities can turn a fight around after it’s gone south, making them a great pick for Dungeons and Trials, or just playing with new players.
Update 32 didn’t change much for Necromancers. It buffed Boneyard to deal slightly more damage to make up for its one-second-less duration from Update 30. Frozen Colossus, by contrast, was somewhat nerfed in that it no longer hits targets outside of its line of sight, which wasn’t supposed to occur in the first place.
Skills
The skill that makes Necromancers useful healers is their ultimate, Reanimation. By resurrecting three allies in a twelve-meter AOE, this skill helps you regain control after losing a lot of ground. You won’t use it often, but it’s handy when a few teammates get taken down at once. It’s especially useful for resurrecting tanks, as the boss usually kills off other allies before you get a chance to bring your tank back.
Necromancers are also powerful healers due to the combination of their burst heal, Resistant Flesh, and their Curative Curse passive. Resistant Flesh heals and grants physical and spell resistance to better prepare allies for upcoming damage. It also applies Minor Defile to you for 4s, which is actually a good thing. Curative Curse increases your healing done by 8% when you’re afflicted by a negative effect.
Spirit Guardian is another very powerful Necromancer skill. It helps you focus your attention on healing one player by creating a Spirit Guardian that simultaneously attends to you or your lowest-health ally. The skill transfers 10% of all damage you receive to the Spirit Guardian, so it’s also great for keeping you alive so you can continue healing.
Last but not least, Braided Tether is a great skill that boosts all of your healing done by 3%, while also acting as a great heal to allies around you and between you and the corpse you attach it to.
4/6
Sorcerer

Sorcerers certainly aren’t the standard for healing, but they can do pretty well with the help of their Daedric friends. There wasn’t much love for Sorcerers in Update 32, at least in terms of healing. Their Lighting Splash skill was fixed to deal its damage in full, but that doesn’t affect Sorcerer healers much — they won’t usually use that skill.
Skills
Sorcerer healers naturally lean more toward damage than healing, but their group healing, buffs, and shields are still great. Twilight Matriarch is a great skill that deals damage to enemies and, when activated, will heal itself and two other friendly targets (allies, other daedric pets, etc.).
Power Surge is another good Sorcerer healer skill, but it requires the ability to critically strike more often. Just keep in mind that it may require some interesting build choices! While active, dealing critical strikes heals you and your allies for 2550 health once every three seconds, which is a great passive heal while you focus on outputting damage. Empowered Ward is another great skill that gives you and your pets a damage shield while also applying Minor Intellect to you and your allies, increasing their magicka recovery by 15%.
5/6
Nightblade

Nightblades received a decent amount of changes in Update 32 — enough to make Nightblade healers a little stronger. Malevolent Offering has the most direct impact on healers, now costing magicka and a smaller amount of health that’s taken over three seconds. It can also now target you and allies, instead of only allies. Grim Focus now gives healers more direct healing power instead of stronger critical heals, and 60 spell and weapon damage per stack instead of 2% critical damage and healing.
Skills
Funnel Health is the bread-and-butter Nightblade healing skill, as it’s a solid spammable damage-dealing skill as well. While actively dealing decent damage, you can heal yourself or two nearby alies for 50% of the damage inflicted every two seconds for ten seconds. This lets Nightblade healers stay offensive while still healing their team. Healthy Offering always felt like a clunky skill, but with the upgrade from Update 32, it’s now much better. Since it costs magicka, the skill is easier to cast when you are on low health, and the health over time cost is less impactful. The Minor Mending it grants for 8s is great, as the extra 8% healing power goes a long way.
Refreshing Path is another great healing skill that Nightblades have that is also great for utility. Providing healing every second in the area, allies inside also gain Major Expedition, increasing their movement speed by 30%. This is a very impactful skill during fights where high mobility is required. It may cause your teammates to sprint off platforms, so maybe don’t use it near cliffs on no-death runs.
Bolstering Darkness is the only Nightblade-specific ultimate you want to use as a healer, as it provides a great mixed bag of utility for your teammates. It reduces enemy movement speed by 70% and gives you and allies inside Major Protection (even after they leave the area), which reduces damage taken by 10%. Allies can activate the Hidden Refresh synergy, which increases their movement speed by a stunning 70% and heals them for a large amount over four seconds. Aggressive Warhorn is usually the better ultimate to use, but in certain situations, this ultimate can be a life-saver.
6/6
Dragonknight

Dragonknights saw a lot of changes with Update 32, but most of it helped with increasing their DPS potential. However, the DK heal Cinder Storm is now much easier to manage, as it no longer has a large up front magicka cost, but instead costs 378 magicka every second while it’s active over fifteen seconds. This makes casting this skill much more reliable compared to its old 5670 magicka cost.
Skills
The updates to their passives has made their sustain better overall as well. Combustion and Battle Roar have both received buffs. Combustion now increases the magicka restored from flame damage to 1000 rather than 500, and stamina restored from poison damage to 1000 rather than 500. Battle Roar now restores 50 health, magicka, and stamina per ultimate consumed, rather than the old 46.
Fragmented Shield is a great skill for Dragonknight healer for the solid shield it places on you and nearby allies along with the Major Mending it grants you, increasing healing done by 16%. Having quick access to Major Mending makes DKs heal for high amounts, but at the consistent cost of 4050 magicka.
Cauterize is a great DK heal, as it also gives you Major Prophecy while slotted, and its heal lasts for fifteen seconds, targeting and healing an ally every five seconds. Magma Shield can be used as a decent spammable heal, dealing damage and healing your or up to two allies near the enemy you damage.
Join the High Ground
All classes can be played efficiently as healers, but certain classes make the job easier and help you get through content more quickly. We hope this ESO best healer class tier list helps you craft a healer to take through the deadlands and beyond. For the latest on Elder Scrolls Online and other popular games, follow us on social media and subscribe to our newsletter.
Happy gaming!
Vojon March 1, 2023 at 1:54 am
NB are the best healers S tier together with Wardens.
(Video) ESO BEST CLASS - Which Class Should You Play? Which Class Should You Avoid? ESO Class GuideReply