A possible vite plugin to make this work with electron.
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 30/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Necesita aclaración
- Estado de actividad
- Estancado
- Stack tecnológico
- csharp, electron, node.js, typescript, vite
- Área
- build-system, desktop, tooling
Línea de trabajo
Revisa el código propuesto del Vite plugin y el ejemplo de configuración de Vite, incluidos sus transforms para node-api-dotnet/init.js y los archivos de ensamblado generados. Primero aclara si este proyecto quiere mantener la integración de Electron/Vite y qué archivos o pruebas deberían añadirse; para darlo por terminado se requieren criterios de aceptación acordados porque el issue no los define.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
After days of research I wrote a plugin to make this cool node-api-dotnet works with electron. Hope it can help people later.
- Create a vite plugin
import fs from "fs";
import path from "path";
interface ElectronNodeApiDotNetOptions {
// The path to `node_modules/node-api-dotnet
nodeModulePath: string,
// The path to all generated files and assemblies
csprojOutputPath: string,
}
export default (options: ElectronNodeApiDotNetOptions) => {
const name = "electron-node-api-dotnet";
let assemblyName = "Microsoft.JavaScript.NodeApi";
let assemblyRoot = path.normalize(options.csprojOutputPath)
const transformInitJs = (code: string) => {
// Create require to dynamic require .node files.
code = `
import path from "path";
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const bundleRoot = ${JSON.stringify(options.nodeModulePath)};
` + code
// Since we use import above, we also need to replace the export style.
// https://github.com/rollup/plugins/issues/1121
code = code.replace(
"module.exports = initialize",
"export default initialize"
)
// Get the dotnet assembly name, preventing upstream change.
const regex = /const assemblyName\s*=\s*['"`](.*?)['"`];/;
const match = code.match(regex);
if (match) {
assemblyName = match[1];
console.log(`[${name}] Using assembly name: ${assemblyName}`);
} else {
console.error(
`[${name}] Cannot match assembly name, plugin may not work!`
);
}
// Transform dynamic assemblyName require to a static one
// Also transform the relative paths to be prefixed with provided bundle root.
code = code.replace(
/require\(`\.\/(.+?)\/\$\{assemblyName\}\.node`\)/g,
"require(path.join(bundleRoot, `./$1/" + assemblyName + ".node`))"
);
// Transform the default case.
code = code.replace(
"nativeHost = require(__dirname + `/${rid}/${assemblyName}.node`)",
"nativeHost = require(path.join(bundleRoot, `./${rid}/${assemblyName}.node`))"
)
// Transform the path for managed host.
code = code.replace(
"const managedHostPath = __dirname + `/${targetFramework}/${assemblyName}.DotNetHost.dll`",
"const managedHostPath = path.join(bundleRoot, `./${targetFramework}/${assemblyName}.DotNetHost.dll`)"
)
return code;
}
const transformAssemblyJs = (code: string, filePath: string) => {
// Instead of use import.meta.url
code = code.replace(
"import { fileURLToPath } from 'node:url';", ""
)
// Use the absolute path, because these files will be rollup
// to one single file (for example main.js)
code = code.replace(
"const __filename = fileURLToPath(import.meta.url)",
`const __filename = ${JSON.stringify(filePath)}`
)
return code
}
return {
name,
resolveId(source: string, importer: string | undefined, options: any) {
return null;
},
transform(code: string, id: string) {
const normId = path.normalize(id)
if (id.endsWith("node_modules/node-api-dotnet/init.js")) {
return transformInitJs(code)
} else if (normId.startsWith(assemblyRoot)) {
return transformAssemblyJs(code, normId)
}
return code;
},
load(id: string) {
if (id.endsWith(`${assemblyName}.node`)) {
// Treat .node files as empty string, otherwise there'll be error because binary are
// not valid js files.
return ``;
}
return null;
},
generateBundle(options: any, bundle: any) {
// bundle whatever way you want
},
};
};
- Include it in vite config, or nuxt config, if you like. Remember to exclude files from commonjs plugin.
import commonjs from '@rollup/plugin-commonjs'
import resolve from '@rollup/plugin-node-resolve'
import electronNodeDotNetApi from './rollup/electron-node-api-dotnet'
...
vite: {
plugins: [
resolve(),
commonjs({
exclude: [
"node_modules/node-api-dotnet/**"
]
}),
electronNodeDotNetApi({
nodeModulePath: path.join(projectRootDir, 'node_modules/node-api-dotnet'),
csprojOutputPath: csharpOutputDir
}),
]
}
- Lenguaje dominante
- C#
- Estrellas
- 783
- Forks
- 80
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de microsoft/node-api-dotnet
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
microsoft/node-api-dotnet#484 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
microsoft/node-api-dotnet#481 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
microsoft/node-api-dotnet#486 · 1 comentario ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
microsoft/node-api-dotnet#483 · 1 comentario · 1 reacción ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
microsoft/node-api-dotnet#479 ·
Todos los issues de microsoft/node-api-dotnet
Issues similares
-
effort:S P3 refactor
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
nightscout/nocturne#1532 ·
-
core dependencies
Dificultad 1/5 Menos de una hora Aptitud para principiantes 80/100
-
documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
C#/.NET Roslyn LSP Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Suspicious code fragments Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
DotNetNext/SqlSugar#1458 ·