To use JavaScript / ECMAScript modules (ES modules, since ES6) with iisnode you have to create a new entry point file.
server.cjs
import('./app.mjs');
Now just set the server.cjs instead of app.js in the web.config.
<configuration>
<system.webServer>
<iisnode
logDirectory="c:\inetpub\wwwroot\my-website\_data\iisnode"
devErrorsEnabled="false"
flushResponse="true"
enableXFF="true" />
<httpErrors existingResponse="PassThrough" />
<handlers>
<add name="iisnode" path="server.cjs" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="NodeApp">
<match url=".*" />
<action type="Rewrite" url="server.cjs" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
That's it! Your node app will now use the ES modules system.
What is the .cjs and .mjs file extension?
- .cjs - uses the node's origin CommonJS module system
- .mjs - uses ES module
- .js - by default same as .cjs
In the package.json we can change the default module system to ES modules.
.js file extensions will then be treated the same as .mjs files.
// package.json
{
"type": "module", // default value is "commonjs"
"name": "my-app",
...
}