ByRebecca Alter,
a staff writer who covers comedy and pop culture
Photo-Illustration: Vulture; Photos: Everett
The Clown Prince of Crime. The Ace of Knaves. Juggalo Jesus. The ignoble Joker goes by many names, at least one of which I just made up, and has infinite origin stories and decades of Gotham-leveling showdowns to match. As each generation — or each five-year IP-reboot cycle — receives a Batman to speak to the times, so too do we see a new Joker, always a complement and foil to whatever the Caped Crusader’s energy brings. A Joker can be camp, or frightening, or empathetic. Sometimes, he doesn’t need a Batman at all. What unites disparate Jokers is they will always be agents of chaos, the wild card in the deck, and generally less than the picture of mental health. It all makes for a very fun acting assignment, a chance to go big and ham it up or get twisted and alien. As Joker: Folie à Deux slips on a banana peel into theaters this week, we’ve ranked every Joker movie performance from films that had cinematic releases, from the masterpieces, to the toons that punch above their weight, to, well …
10.
Jared Leto, Suicide Squad
Do you know just how noxious your performance has to be to stand out as bad in a movie this messy? You gotta be leaving–Viola Davis–dead-rats levels of noxious. Backstage antics aside, Jared Leto plays Joker as the lamest, most generic, most first-thought version of “crazy.” And he does it while looking like a high-school bully in a bad sequel in the Zombies Disney Channel Original Movie Cinematic Universe. This iteration of the Joker story falls apart if you don’t believe Harley and Joker’s love. Margot Robbie is doing the absolute most to be the flirty Manic Pixie Dream Harley of any clownboy’s dreams, but the chemistry’s gotta go both ways. Leto’s Joker belongs on T-shirts at Lukewarm Topic. Call him BB-Gun Kelly. All that Method acting (more like methy acting) and for what?
9.
Barry Keoghan, The Batman
Too soon to say based off this cameo. All we know is he’s sart of like an evil porson.
8.
Kane Distler, The People’s Joker
Distler’s performance as Mr. J in 2024’s best Joker film suffers by comparison, as one of two Joker-figures in Vera Drew’s groundbreaking pop art indie supe-flick, The People’s Joker. It’s awesome how he’s styled as a parody of Leto’s version, and Distler’s wide-eyed fuckboy take on the character actually builds depth upon Leto’s: He’s an abusive boyfriend, but he was also abused himself, and he does share moments of warmth, affirmation, and chemistry with Joker the Harlequin. It’s a far more believable relationship than the one in Suicide Squad, and a trans-boy Mr. J almost feels like cosmic payback for whatever the fuck it was Leto was doing in Dallas Buyers Club.Also: He’s one of the hotter Jokers on this list.
7.
Zach Galifianakis, The Lego Batman Movie
Galifianakis plays Joker as a spurned lover, a sensitive nut who just wants Batman to obsess over him the way he obsesses over Batsy. He plays into the larger arc of the movie, which is about Batman (genuinely Will Arnett’s best movie role) learning to let others into his heart instead of being such a weird emo loner all the time. It makes his final showdown with Joker almost romantic, and it works because Galifianakis’s voice can go from sweetie to crazy real quick. However, he’s comedically upstaged at every turn by Batman, and especially by Michael Cera’s Robin.
6.
Cesar Romero, Batman (1966)
I love Cesar Romero’s Joker. I’m of the apparently edgy, alt opinion that clowns should be funny. So sue me. Romero invented the Joker performance, and all of these subsequent Jokers are in his debt. Romero’s Joker is Adam West’s groovy camp foil. To think it took until 2024 before we got another Joker as joyously queer as this is alarming! But this list is based only on movie performances, so I’m not factoring Romero’s fine work across three television seasons into this ranking. And sadly, in the movie, he’s not given terribly much to do. This is a Rogues Gallery Batman plot, and the order of villain significance in this film goes Catwoman, Penguin, Joker, Riddler. There’s a humorous and nonsensical subplot about how the bad guys have kidnapped a ship captain and are gaslighting him into thinking he’s still on his ship, and Romero gets to have some fun Yo-Ho-Hoeing and all that. Still, his role is mostly to react and to maniacally laugh, and he doesn’t even have the most distinctive laugh in the movie; that would be The Penguin’s wah wah wah.
5.
Joaquin Phoenix, Joker
Joaquin Phoenix has a special gift for playing vulnerable, hurting, unknowable men, and in Todd Phillips’s Joker, he’s given enough rope to follow those tendencies to their fullest potential. It is visually arresting to watch his weird bird-bone body contort itself into situations where Arthur Fleck feels like he just doesn’t fit, and interesting enough to watch for the moments he shifts from quiet to violent. But all of this impressive physicality, especially in scenes when Phoenix does a weird interpretive dance to music only Fleck can hear in his rattling tin can of a brain, come across like actorly indulgence, a Serious Performer’s wet dream, more serving Phoenix and Phillips than saying anything nearly as deep as the movie seems to think it is. I’m still ranking the performance high, though, because he really is doing a lot of acting, and if Phoenix’s goals were to be creepy and weird and pitiable, he succeeded, even if it seemed less like a portrait of a uniquely fucked up man and more like how I imagine literally any random male stand-up comic actually is in their downtime. It’s a far cry from a Joker, and even more damning to this movie’s fetishes and aspirations, it’s a far cry from Rupert Pupkin.
4.
Vera Drew, The People’s Joker
The most fearless Joker performance of the year, maybe on this list altogether, isn’t in Folie à Deux. It comes from writer, director, and editor Vera Drew, who stars as “Joker the Harlequin” in her autobiographical, unlicensed antihero origin story The People’s Joker. Drew maps her own story of coming out as trans while coming up in the often toxic, occasionally affirming world of Los Angeles alt comedy onto the world of often dark, occasionally kooky Batman comics and movies, making her both the Joker and the Harley Quinn of the film. Drew draws inspiration from DC comics, ’90s Batman movies, and even Joker and Suicide Squad, remixing their characters and signifiers into a trippy Gotham City full of gatekeepers, hacks, and a naked CGI Lorne Michaels. It’s all hilarious, odd, and controversial on many levels (TPJ’s Batman is a groomer), but it’s also surprisingly moving, owing to Drew’s honest performance that combines a sardonic sense of humor with a vulnerability and openness that feels very real for such a surreal product. Drew’s musical number towards the end of the film is far more daring than any of Phoenix and Gaga’s in Joker 2, and she didn’t even have to pull out a gun or bash anyone’s head in while singing the Carpenters or whatever to do it. This instant-cult-classic indie figures that if American culture is dominated by these superhero stories, we-the-people might as well be allowed to use their characters and worlds to create art of our own … like commedia dell’arte, which was all sad clowns and Harlequins anyway. Drew’s Joker the Harlequin seizes the means of production and takes them on a joyride through all that is sacred to nerds. Which, of course, is total Joker behavior.
3.
Mark Hamill, Mask of the Phantasm and The Killing Joke
Listen, boopsie. My editor lobbied for this at number one, but because of this list’s rules — movies only,no television taken into consideration — Hamill is making the podium at a still-respectable bronze. Originating his take on the role in the landmark Batman: The Animated Series in 1992, Hamill throws his whole being into becoming the Joker. On a list full of highly physical performances like Phoenix’s, it’s impressive just how expressive and transformative Hamill could be in voice alone as he took his Joker to the big screen for Batman: Mask of the Phantasm in 1993. Hamill’s Joker manages to be simultaneously cartoonish and weighty, dipping from helium-high chuckles to sinister growls as he taunts and stalks the Bat. Most impressive is how Hamill goes so ham while still fitting into Phantasm’s somewhat-realistic, Edward Hopper–esque vision of Gotham City as a Mobtown. Hamill revives the character for 2016’s The Killing Joke, and while the movie isn’t at the same level of quality and animation as Phantasm, Hamill’s performance carries it, as he switches the voice up in flashbacks to Joker’s backstory and at one point gets to do a very strange musical number.
2.
Heath Ledger, The Dark Knight
What more needs to be said about Heath Ledger’s Joker? This is a transformative performance that has reached the point of legend, with deep, sad lore, and influence that’s still felt throughout pop culture a decade and a half later. Revisiting the film for the first time as an adult, I literally could not believe that Ledger had only just turned 28 years old when principal photography began. This is a Joker whose seen things,who has lived a hundred lives, who hobbles around like a dang-ass freak and croaks out a weird lizard laugh between smacks of his weird lizard lips. He’s a genuinely menacing figure, but he also serves comedy when required. Ledger gave us a Joker for this millennium, and turned the character into a mythical figure, like secular Satan, whose story Hollywood is addicted to retelling, for better or worse. Ledger is many people’s ultimate Joker. I respect that, but disagree, because the One Joker to Rule the Deck is …
1.
Jack Nicholson, Batman (1989)
Obviously! It haaaaad to be Jack. Nicholson famously brokered one of Hollywood’s most legendary deals when he signed on to play the Joker in Tim Burton’s Batman on the condition that he take home a cut of the film’s box office. This led to Warner Bros. paying him something like $90 million, in nineteen-eighty-nine money, and honestly? You see every cent of that on the screen in Nicholson’s performance. His Joker, Jack Napier, starts off as a peak-’80s greed-is-good skyscraper slickster with more than a hint of latent psychopathic crazy in him, a craziness that gets amplified when he gets the classic Joker treatment: dropped into a vat of chemicals by Batman. When he emerges, he’s got permanent clown-white skin and blood-red lips stretched into a freakish prosthetic smile, and his eyebrows pulled to Matt Gaetz proportions. It’s an iconic look, and it frees Nicholson up to have almost too much fun, doing all sorts of colorful deadly high jinks, the peak of which involves him defacing classical art while blasting an original Prince song about how great he, the Joker, is. The ways that he manages to interrupt a scene with a fake infomercial or party trick call to mind Michael Keaton in Burton’s Beetlejuice,but Nicholson’s Joker is smoother, more of a fat cat, more, well, Jack Nicholson. If Batman was the dawn of the modern superhero blockbuster, Nicholson’s performance as the Joker fulfilled all the promise of a comic book brought to life. The ’90s run of Batman movies had to stack themselves full of two or three superheroes per flick to accomplish what Jack pulled off solo. That’s entertainment.
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"3":3,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(3),appendLandingPageParams=require(135),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"3":3,"4":4,"12":12,"124":124,"135":135}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(408),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"408":408,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]