microsoft / microsoft/node-api-dotnet
Generated entry JS file for AOT thinks I'm not using AOT
Open
@jasongin is already working on this.
Since Mar 14, 2025.
- Dominant language
- C#
- Stars
- 783
- Forks
- 80
- PR merge metrics
- No merged PRs in 30d
Description
I'm building an AOT module with the following .csproj file:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishAot>true</PublishAot>
<PublishNodeModule>true</PublishNodeModule>
<PublishDir>bin</PublishDir>
<PackNpmPackage>true</PackNpmPackage>
<PackageOutputPath>pkg</PackageOutputPath>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.JavaScript.NodeApi" Version="0.9.5" />
<PackageReference Include="Microsoft.JavaScript.NodeApi.Generator" Version="0.9.5" />
</ItemGroup>
</Project>
After dotnet publish, I get a valid AOT .dll file with the following .js entry file generated:
// Generated for: NativeModule 1.0.0.0
// Generated by: Microsoft.JavaScript.NodeApi.Generator 0.9.0.0
/* eslint-disable */
const dotnet = require('node-api-dotnet/net8.0');
const path = require('node:path');
// @ts-ignore - https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/65252
const { dlopen, platform, arch } = require('node:process');
const moduleName = path.basename(__filename, __filename.match(/(\.[cm]?js)?$/)[0]);
module.exports = dotnet ? importDotnetModule(moduleName) : importAotModule(moduleName);
function importDotnetModule(moduleName) {
[...]
}
function importAotModule(moduleName) {
[...]
}
Note the module.exports = dotnet ? importDotnetModule(moduleName) : importAotModule(moduleName); line which is the culprit here - because I'm using AOT, it's supposed to call importAotModule rather than importDotnetModule. However, I'm not sure how this is supposed to work:
- If I have
node-api-dotnetin my dependencies,require('node-api-dotnet/net8.0')works, i.e. it returns a truthy value, soimportDotnetModulegets called (which fails) - If I don't have
node-api-dotnetin my dependencies (as in the example), the require throws and I can't import the module
I feel I'm missing something here, how am I supposed to "tell" the generator or runtime I'm using AOT?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.