Mientras trabajaba en mi plantilla de inicio para aplicaciones Electron, decidí abandonar por completo los módulos CommonJS y utilizar exclusivamente módulos ECMAScript (en adelante, módulos ES o ESM).
Realmente quiero tener un estilo de código consistente en todas partes. En mi proyecto, como en muchos otros, el código fuente en sí se escribe utilizando módulos ES, y todo lo demás (pruebas, archivos de configuración, scripts adicionales para la construcción) se escribe utilizando módulos CommonJS. Me molesta mucho y quiero que todo sea del mismo estilo: ESM.
Brevemente sobre los sistemas modulares en NodeJS
Desde la versión 13, NodeJS admite dos sistemas de módulos:
CommonJS: se utiliza una función para conectar un módulo
require()
;
ECMAScript:
import
se utiliza una palabra clave o función para conectar un móduloimport()
;
Es importante saber:
No puede utilizar
require
y y en el mismo archivoimport
. O uno o el otro.
En un módulo ES, puede conectar otro módulo ES o CommonJS.
En un módulo CommonJS, puede conectar exclusivamente módulos CommonJS.
Cómo elige NodeJS un sistema para un archivo específico
Aquí todo es sencillo. Hay dos extensiones para archivos: .cjs
y .mjs
que definen que se trata de un módulo CommonJS o 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 .
-
-- -
require
.eslintrc.js
..eslintrc.cjs
CommonJS.
. IDE
.eslintrc.cjs
eslint.
--
dotenv
. ESM, .
Jest , ES .
- , . , , - . . . .