Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bad alias resolution when the main process references the common folder #1

Open
zerokarafont opened this issue Apr 2, 2021 · 6 comments

Comments

@zerokarafont
Copy link

I'm sorry I'm not a native English speaker. This is my problem
When I tried to reference the common configuration, I couldn't find the correct path in the packed dist directory,
It seems that my configuration is not bundled correctly

import { app, BrowserWindow, Tray, Menu } from 'electron'
import type { BrowserWindowConstructorOptions } from 'electron'
import windowStateKeeper from 'electron-window-state'
import config from '@/common/config'

index.js in dist directory

var import_electron = __toModule(require("electron"));
var import_electron_window_state = __toModule(require("electron-window-state"));
var import_config = __toModule(require("@/common/config"));
...

error stack

Error: Cannot find module '@/common/config'
Require stack:
- F:\code\project\electron-vite-react\dist\index.js
- F:\code\project\electron-vite-react\node_modules\electron\dist\resources\default_app.asar\main.js
-
    at Module._resolveFilename (internal/modules/cjs/loader.js:887:15)
    at Function.n._resolveFilename (electron/js2c/browser_init.js:261:1128)
    at Module._load (internal/modules/cjs/loader.js:732:27)
    at Function.f._load (electron/js2c/asar_bundle.js:5:12684)
    at Module.require (internal/modules/cjs/loader.js:959:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (F:\code\project\electron-vite-react\dist\index.js:22:32)
    at Module._compile (internal/modules/cjs/loader.js:1078:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1108:10)
    at Module.load (internal/modules/cjs/loader.js:935:32)

tree

├─.config
├─.vscode
├─public
├─scripts
└─src
    ├─common
    │  ├─config
    │  └─event
    ├─main
    │  ├─ipc
    │  └─work_thread
    └─renderer
        ├─components
        │  ├─DropZone
        │  └─HtmlHead
        ├─layouts
        └─pages
            └─home

how can i fix it ?

@jdamon96
Copy link

jdamon96 commented Apr 9, 2021

I'm also having this same issue.

So far in my research it appears that you may be able to fix this by using an esbuild plugin to change the import's path during the build process - see the discussion here: evanw/esbuild#456

@devjayprakash
Copy link

i am also facing the same issue... does anyone has some solution

@zerokarafont
Copy link
Author

@jdamon96 @DevelopAppWithMe
esbuild alias plugin not work for me.
My solution is not to use esbuild, the main process uses tsc to compile.
Here is the key script (from another scaffold, however i forget where is it from, shoud be in awesome-vite repo ) you should replace original main compile script with this.
Everything is perfect except that it is a little slower than esbuild.

import type {
 CompilerOptions,
 Diagnostic,
 FormatDiagnosticsHost,
} from "typescript";
import * as ts from "ttypescript";
import * as path from "path";
import * as os from "os";
import { CompileError, WatchMain, outDirMain, mainPath } from "./common";

let diagnosticErrors: Array<CompileError> = [];

const formatHost: FormatDiagnosticsHost = {
 getCanonicalFileName: (filepath) => filepath,
 getCurrentDirectory: ts.sys.getCurrentDirectory,
 getNewLine: () => ts.sys.newLine,
};

function reportDiagnostic(diagnostic: Diagnostic) {
 if (!diagnostic.file || !diagnostic.start || !diagnostic.length) {
   return;
 }

 const diagnosticMessage = ts.flattenDiagnosticMessageText(
   diagnostic.messageText,
   formatHost.getNewLine()
 );
 const filepath = diagnostic.file.fileName.replace(process.cwd(), "");
 const { start } = diagnostic;
 const len = diagnostic.length;

 const linesOfCode = diagnostic.file.text.split(os.EOL);
 const line = diagnostic.file.text.substr(0, start + 1).split(os.EOL).length;
 const lineStart =
   diagnostic.file.text.substring(0, start + 1).lastIndexOf(os.EOL) + 1;
 const col = start - lineStart;

 const compileError: CompileError = {
   location: {
     column: col,
     file: filepath,
     length: len,
     line,
     lineText: linesOfCode[line - 1],
   },
   message: diagnosticMessage,
 };
 diagnosticErrors.push(compileError);
}

export const watchMain: WatchMain = (
 reportError,
 buildStart,
 buildComplete,
 notFoundTSConfig
) => {
 const configPath = path.join(mainPath, "tsconfig.json");
 if (!configPath) {
   notFoundTSConfig();
 }

 const createProgram = ts.createSemanticDiagnosticsBuilderProgram;

 const host = ts.createWatchCompilerHost(
   configPath,
   {
     sourceMap: true,
   },
   ts.sys,
   createProgram,
   reportDiagnostic,
   (
     diagnostic: Diagnostic,
     _: unknown,
     options: CompilerOptions,
     errorCount?: number
   ) => {
     if (!!errorCount && errorCount > 0) {
       reportError(diagnosticErrors);
       diagnosticErrors = [];
     } else if (diagnostic.code === 6194) {
       buildComplete(outDirMain);
     } else if (diagnostic.code === 6032 || diagnostic.code === 6031) {
       buildStart();
     }
   }
 );

 ts.createWatchProgram(host);
};
=== tsconfig ===
{
"paths": {
     "@main/*": [
       "main/*"
     ],
     "@renderer/*": [
       "renderer/*"
     ],
     "@common/*": [
       "common/*"
     ],
   },
}```

@anup-a
Copy link

anup-a commented Jul 4, 2021

Did anyone fix this using esbuild ?
It wasn't able to work with relative paths neither aliases. This seems to be major flaw @guybarnard .

@lewisandrew
Copy link

Likewise, I get the same error for aliases and for relative paths, i.e. './coolStuff'

@fursandy
Copy link

fursandy commented Jan 7, 2022

@anup-a I have fix this using "esbuild-node-externals" and set bundle true

import { nodeExternalsPlugin } from "esbuild-node-externals";

esbuild.build({
  ...
  plugins: [nodeExternalsPlugin()],
  bundle: true
  ...
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants