En travaillant sur mon template de départ pour les applications Electron, j'ai décidé d'abandonner complètement les modules CommonJS et d'utiliser exclusivement des modules ECMAScript (ci-après modules ES ou ESM).
Je veux vraiment avoir un style de code cohérent partout. Dans mon projet, comme beaucoup d'autres, le code source lui-même est écrit à l'aide de modules ES, et tout le reste (tests, fichiers de configuration, scripts supplémentaires pour la construction) est écrit à l'aide de modules CommonJS. Cela me dérange beaucoup et je veux que tout soit dans le même style - ESM.
En bref sur les systèmes modulaires dans NodeJS
Depuis la version 13, NodeJS prend en charge deux systèmes de modules:
CommonJS: une fonction est utilisée pour connecter un module
require()
;
ECMAScript: un mot-clé
import
ou une fonction est utilisé pour connecter un moduleimport()
;
Il est important de savoir:
Vous ne pouvez pas utiliser à la fois
require
et et dans le même fichierimport
. L'un ou l'autre.
Dans un module ES, vous pouvez connecter un autre module ES ou CommonJS.
Dans un module CommonJS, vous pouvez connecter exclusivement des modules CommonJS.
Comment NodeJS choisit un système pour un fichier spécifique
Tout est simple ici. Il existe deux extensions pour les fichiers: .cjs
et .mjs
qui définissent qu'il s'agit d'un module CommonJS ou ES, respectivement.
, 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 .
-
-- -
require
.eslintrc.js
..eslintrc.cjs
CommonJS.
. IDE
.eslintrc.cjs
eslint.
--
dotenv
. ESM, .
Jest , ES .
- , . , , - . . . .