javascript - Er det mulig å lage en Electron-applikasjon som kun kompileres til plattformkode?


Jeg vil klargjøre spørsmålet mitt for et veldig spesifikt bruksområde.

La oss si at jeg har designet koden min som følger:

Og dette er innholdet:

src/inner/inner.darwin.ts:

export default function logger() {
    console.log('Darwin Logger');
}

src/inner/inner.windows.ts:

export default function logger() {
    console.log('Windows Logger');
}

src/inner/inner.ts:

MERK eksporten som standard - den er obligatorisk

import LOGGER from '???????????';

export default class A {
    public static logger() {
         LOGGER();
    }
}

Så i utgangspunktet, når jeg kompilerer Windows-kode, vil jeg importere inner.windows.ts-koden. Når jeg bruker Mac-kode - inner.darwin.ts-koden.

Jeg vet at jeg kan kontrollere utelatte filer i tsconfig.json. Så når jeg skal lage et Windows-program, vil jeg kode:

"exclude": ["**/*.darwin.ts"]

Og når jeg vil lage Mac én:

"exclude": ["**/*.windows.ts"]

Imidlertid hjalp det ikke med å løse importproblemet.

Jeg vet at jeg kan kjøre kode avhengig av den underliggende plattformen ved å bruke process.platform, men det gjør ikke jobben. Jeg vil at utdataene fra Windows-applikasjonen skal være mindre i størrelse - og ignorere all Mac-kode. Hvis jeg skulle bruke dette process.platform - ville Mac-koden fortsatt eksistere i den underliggende Windows-applikasjonen.

Noen råd?

Kan Webpack gjøre noe for å hjelpe? Jeg er åpen for alle kodeendringer så lenge koden er godt definert og delt, og det endelige resultatet er at jeg bare har Darwin-kode og Windows-kode

Svar #1

Så løsningen er ganske enkel. Alt jeg måtte gjøre var å bruke en Webpack-plugin. Den beste pluginen for denne oppgaven er NormalModuleReplacementPlugin som leveres rett ut av boksen av Webpack selv.

Ekskluderingsfeltet exclude i tsconfig.ts er ikke lenger hensiktsmessig innenfor denne løsningen.

Oppgi ganske enkelt følgende plugin:

new webpack.NormalModuleReplacementPlugin(
    /darwin/,
    function (resource) {
    resource.request = resource.request.replace(
        /darwin/,
        'windows',
    );
    }
),

Dette vil overstyre enhver import til en darwin-fil til en windows-fil.

Nå, i utvikling, eksisterer begge filene - men ved kompilering - vil kun en av dem eksistere.

inner.ts blir enkelt:

import LOGGER from './inner.darwin';

export default class A {
    public static logger() {
         LOGGER();
    }
}

Selvfølgelig kan det være ganske tungvint å gå inn i webpack.config.ts ved hver bygging, så vi kunne definitivt kjøre et ekstra webpack-skript for å bestemme hvilken underliggende bygging vi skal gå for, for eksempel:

 const appTarget = env.APP_TARGET || 'darwin'; 

Og bruk deretter ganske enkelt denne variabelen i pluginen, og kjør din npm build-skript ved å angi et APP_TARGET argument.

Relaterte artikler