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.
