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.mjsdeve exportar as funçõesdiaenoite(exportação nomeada). - O arquivo
index.mjsdeve usarimport()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
- No módulo
mensagens.mjs, exportamos duas funções nomeadas:diaenoite, cada uma retornando uma string. - No
index.mjs, definimos uma funçãoasyncchamadamainpara podermos usarawait. - Lemos
process.argv[2], que contém o primeiro argumento passado na linha de comando (apósnode index.mjs). - Verificamos se o argumento é
'dia'ou'noite'. Se não for, exibimos'Período inválido'e encerramos. - Usamos
await import('./mensagens.mjs')para carregar o módulo dinamicamente. O resultado é um objeto com as exportações. - 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
awaitou.then():const modulo = import('./mensagens.mjs');retorna uma Promise, não o módulo. Acessarmodulo.diafalha. - Não tratar o caso inválido: se
periodoforundefined, a comparaçãoperiodo === 'dia'é falsa, mas o código tentaria chamarmodulo.noite()sem validar, gerando erro se o módulo não tivernoite. - Usar
importestático dentro deif: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!