es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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 ESModule export:
.../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.

Tags:  , ,

Answer

  1. Avatar for 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 archivo babel.config.js:

    module.exports = {
      presets: [
        [
          "@babel/preset-env",
          {
            targets: {
              node: "current",
            },
          },
        ],
      ],
    };
    

    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:

    npm install --save-dev @babel/cli @babel/core @babel/plugin-proposal-class-properties @babel/preset-env @babel/preset-typescript
    

    Una vez que hayas configurado Babel, puedes ejecutarlo utilizando el comando npx babel. Por ejemplo:

    npx babel src/ --out-dir artifacts/
    

    Este comando transpilará todos los archivos en el directorio src/ y los guardará en el directorio artifacts/.

    Luego, en tus pruebas o scripts de Hardhat, puedes importar el código transpilado utilizando require, de esta manera:

    const { aSymbol } = require("../artifacts/SomeContract");
    

    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.

Comments are closed.