Desafio JavaScript

Import dinâmico condicional

Enunciado

Crie um módulo mensagens.mjs que exporta duas funções: dia() retornando "Bom dia!" e noite() retornando "Boa noite!". Em index.mjs, receba um argumento de linha de comando (process.argv[2]) que pode ser "dia" ou "noite". Use import dinâmico para carregar o módulo e chamar a função correspondente. Se o argumento for inválido, exiba "Período inválido".

Requisitos

  • O módulo mensagens.mjs deve exportar as funções dia e noite (exportação nomeada).
  • O arquivo index.mjs deve usar import() dinâmico para carregar o módulo.
  • A escolha da função deve ser baseada no argumento process.argv[2].
  • A saída deve ser exatamente a mensagem correspondente ou Período inválido.

Código inicial

// mensagens.mjs
// TODO: exporte as funções dia e noite

// index.mjs
// TODO: use import dinâmico conforme o argumento

Saída esperada

Bom dia!
Ver dica

Use const modulo = await import('./mensagens.mjs'); dentro de uma função async. Acesse modulo.dia ou modulo.noite.

Mostrar solução
// mensagens.mjs
export function dia() {
  return 'Bom dia!';
}

export function noite() {
  return 'Boa noite!';
}
// index.mjs
async function main() {
  const periodo = process.argv[2]; // pega o argumento da linha de comando

  if (periodo !== 'dia' && periodo !== 'noite') {
    console.log('Período inválido');
    return;
  }

  // import dinâmico: carrega o módulo sob demanda
  const modulo = await import('./mensagens.mjs');

  // escolhe a função com base no período
  const mensagem = periodo === 'dia' ? modulo.dia() : modulo.noite();
  console.log(mensagem);
}

main();

Passo a passo

  1. No módulo mensagens.mjs, exportamos duas funções nomeadas: dia e noite, cada uma retornando uma string.
  2. No index.mjs, definimos uma função async chamada main para podermos usar await.
  3. Lemos process.argv[2], que contém o primeiro argumento passado na linha de comando (após node index.mjs).
  4. Verificamos se o argumento é 'dia' ou 'noite'. Se não for, exibimos 'Período inválido' e encerramos.
  5. Usamos await import('./mensagens.mjs') para carregar o módulo dinamicamente. O resultado é um objeto com as exportações.
  6. Escolhemos a função apropriada com um operador ternário e chamamos, exibindo o retorno.

Por que funciona

O import() dinâmico retorna uma Promise que resolve para o namespace do módulo. Como só carregamos o módulo após validar o argumento, evitamos trabalho desnecessário. O escopo do módulo mensagens.mjs mantém as funções isoladas até serem importadas. A verificação condicional garante que apenas argumentos válidos acionem o carregamento.

Erros comuns

  • Esquecer de usar await ou .then(): const modulo = import('./mensagens.mjs'); retorna uma Promise, não o módulo. Acessar modulo.dia falha.
  • Não tratar o caso inválido: se periodo for undefined, a comparação periodo === 'dia' é falsa, mas o código tentaria chamar modulo.noite() sem validar, gerando erro se o módulo não tiver noite.
  • Usar import estático dentro de if: if (x) { import { dia } from './mensagens.mjs'; } é sintaxe inválida. Import estático só no topo do módulo.

Outra forma de resolver

Poderia usar const { dia, noite } = await import('./mensagens.mjs'); para desestruturar as funções diretamente. Isso é preferível quando você já sabe quais exportações vai usar e quer um código mais limpo.

Saída esperada

Bom dia!