¿Cómo utilizo las importaciones de módulos ES con hardhat (que utiliza CommonJS)?
El tutorial de pruebas de Hardhat utiliza require
para las importaciones, y no import
.
Este sitio describe CommonJS usando require
y ESModule como usando import
.
Tengo un código que utiliza el estilo ESModule
(exportaciones e importaciones), y no puedo usarlo fácilmente en el código de Hardhat.
¿Cómo puedo utilizar el código en estilo ESModule en Hardhat?
Cuando ejecuto npx hardhat test
- Si uso el estilo ESModule
import
en el código de Hardhat, obtengo el error que se esperaría:
Un error inesperado ocurrió:
.../solidity/test/some_code.js:6
import { aSymbol } from "../blah/src/utils/helpers"
^^^^^^
- Si uso
require
en el código de Hardhat, obtengo las quejas que se esperarían sobre el estilo ESModuleexport
:
.../blah/src/utils/helpers.js:35
export async function aSymbol() {
^^^^^^
SyntaxError: Token inesperado 'export'
en Object.compileFunction (node:vm:352:18)
en wrapSafe (node:internal/modules/cjs/loader:1031:15)
en Module.<em>compile (node:internal/modules/cjs/loader:1065:27)
en Object.Module.</em>extensions..js (node:internal/modules/cjs/loader:1153:10)
en Module.load (node:internal/modules/cjs/loader:981:32)
en Function.Module.<em>load (node:internal/modules/cjs/loader:822:12)
en Module.require (node:internal/modules/cjs/loader:1005:19)
en require (node:internal/modules/cjs/helpers:102:18)
en Object.<anonymous> (.../solidity/test/some</em>code.js:5:6)
EDITAR: Esto puede estar relacionado, todavía lo estoy leyendo.
davy.ai
Para utilizar código en formato ESModule en Hardhat, es necesario transpilar el código en formato ESModule a código en formato CommonJS (que utiliza
require
para las importaciones).Una forma de hacer esto es utilizar una herramienta como Babel para transpilar el código. Puedes configurar Babel para transpilar el código y guardarlo en el directorio
artifacts/
(donde Hardhat busca los contratos compilados). Aquí tienes un ejemplo de archivobabel.config.js
:En este ejemplo, estamos utilizando el preset
@babel/preset-env
para apuntar a la versión actual de NodeJS. Puedes configurar esto para apuntar a otros entornos si es necesario.También es necesario instalar los plugins y presets de Babel requeridos:
Una vez que hayas configurado Babel, puedes ejecutarlo utilizando el comando
npx babel
. Por ejemplo:Este comando transpilará todos los archivos en el directorio
src/
y los guardará en el directorioartifacts/
.Luego, en tus pruebas o scripts de Hardhat, puedes importar el código transpilado utilizando
require
, de esta manera:Ten en cuenta que debes importar el archivo del contrato compilado (por ejemplo,
SomeContract.js
), no el archivo fuente (por ejemplo,SomeContract.sol
). Además, debes especificar la ruta correcta hacia el archivo compilado, relativa al archivo en el que lo estás importando.