M谩 experi锚ncia de migra莽茫o do aplicativo Electron para m贸dulos ECMAScript

Enquanto trabalhava no meu template inicial para aplica莽玫es Electron, decidi abandonar completamente os m贸dulos CommonJS e usar exclusivamente m贸dulos ECMAScript (doravante m贸dulos ES ou ESM).





Eu realmente quero ter um estilo de c贸digo consistente em todos os lugares. Em meu projeto, como em muitos outros, o c贸digo-fonte em si 茅 escrito usando m贸dulos ES, e todo o resto (testes, arquivos de configura莽茫o, scripts adicionais para constru莽茫o) 茅 escrito usando m贸dulos CommonJS. Me incomoda muito e quero que tudo fique no mesmo estilo - ESM.





Resumidamente sobre sistemas modulares em NodeJS

Desde a vers茫o 13, o NodeJS oferece suporte a dois sistemas de m贸dulo:





  • CommonJS: uma fun莽茫o 茅 usada para conectar um m贸dulo require()



    ;





  • ECMAScript: uma palavra-chave import



    ou fun莽茫o 茅 usada para conectar um m贸dulo import()



    ;





脡 importante saber:





  • Voc锚 n茫o pode usar require



    e e no mesmo arquivo import



    . Um ou outro.





  • Em um m贸dulo ES, voc锚 pode conectar outro m贸dulo ES ou CommonJS.





  • Em um m贸dulo CommonJS, voc锚 pode conectar exclusivamente m贸dulos CommonJS.





Como o NodeJS escolhe um sistema para um arquivo espec铆fico

Tudo 茅 simples aqui. Existem duas extens玫es para arquivos: .cjs



e .mjs



que definem que este 茅 um m贸dulo CommonJS ou ES, respectivamente.





, package.json



type



commonjs



module



- .js



.





Electron

Electron ? main.js



( background.js



) -- , , , , api . , :





const { app, BrowserWindow } = require('electron')

app.whenReady().then(() =>
  new BrowserWindow().loadFile('index.html')
)

app.on('window-all-closed', () => app.quit())
      
      



: .





ESM, package.json



"type": "module"



main.js



:





- const { app, BrowserWindow } = require('electron')
+ import { app, BrowserWindow } from 'electron'
      
      



:





Error [ERR_REQUIRE_ESM]: Must use import to load ES Module
      
      



. electron v12 NodeJS 14.15. ESM .





CommonJS

, electron, , JavaScript . -- require



:









electron /path/to/main.js
      
      



- , electron





require('/path/to/main.js')
      
      



electron CommonJS . main.js



-- ES . CommonJS ES . .





ESM-.





ES - Electron. , - .





, . , ESM CommonJS Electron. nodeJS .cjs



.





, .





JavaScript .js



. , .





tsc



esbuild



, , . .js



.





/ JavaScript .js



. .cjs



.





Vite, , [filename].[hash].cjs



. loader .cjs



. PR ( ) .cjs



JavaScript.





electron-builder

. ES , Vite CommonJS Electron.





, . electron-builder



. :





  • electron-builder



    read-config-file



    .





  • read-config-file



    CommonJS , require('/path/to/config.js')



    .





  • CommonJS ES .





, electron-builder



ES .





electron-builder



CommonJS .cjs



. CommonJS .





, .





, read-config-file



.cjs



JavaScript:





if (config.endsWith('.js')) {
    require(config)
} else {
    // ...   ,   JavaScript
}
      
      



PR , .





electron-builder



JavaScript package.json



"type": "module"



.





.js



.json



, .





, , ES .





  • eslint. eslint ESM. .





    -- - require



    .eslintrc.js



    . .eslintrc.cjs



    CommonJS.





    . IDE .eslintrc.cjs



    eslint.





  • -- dotenv



    . ESM, .





  • Jest , ES .





- , . , , - . . . .








All Articles