Следующий динамический импорт JS для именованного экспорта

#javascript #reactjs #webpack #next.js

Вопрос:

Я изучаю следующий js. Я хочу вызвать функцию getItem https://www.npmjs.com/package/encrypt-storage

Используя приведенный ниже код, но я получаю TypeError: EncryptStorage.getItem is not a function

 import dynamic from 'next/dynamic';
const EncryptStorage = dynamic(() => import('encrypt-storage').then((mod) => mod.EncryptStorage(process.env.NEXT_PUBLIC_SKK)), { ssr: false });
console.log(EncryptStorage.getItem('aa'));
 

пожалуйста, помогите мне разобраться с этим.

Ответ №1:

tl;dr: Вам нужно использовать await import(...) вместо dynamic(() => import(...)) , так как последнее предназначено только для компонентов.

Более длинная версия:

Это сбивало меня с толку , так как в документах прямо не указано, что вы не можете импортировать модули dynamic(...) , только то, что они должны использоваться для импорта компонентов:

Компоненты React также можно импортировать с помощью динамического импорта, но в этом случае мы используем его в сочетании с next/dynamic , чтобы убедиться, что он работает так же, как и любой другой компонент React.

И действительно, глядя на этот комментарий сопровождающего, вы не можете использовать dynamic(...) его для импорта модулей, только компонентов.

Учитывая это, вот возможное решение:

Кроме того, обратите внимание, что .getItem(...) это метод, который необходимо вызвать для экземпляра EncryptStorage .

     // Needs to be ran in an `async` context or environment that supports top-level `await`s
    const EncryptStorage = (await import("encrypt-storage")).defau<
    const encryptStorage = EncryptStorage(process.env.NEXT_PUBLIC_SKK);
    console.log(encryptStorage.getItem("aa"));
 

И вот песочница с полным рабочим примером.

Комментарии:

1. Огромное спасибо.. ты спас мне жизнь ! Но зачем нужен .default ? после импорта ?

2. Использование .default гарантирует, что вы импортируете экспорт по умолчанию из модуля. Это технически не требуется здесь (если вы посмотрите на источник , EncryptStorage это экспорт по умолчанию), однако я считаю, что это хорошая практика. Информация о Javascript содержит хороший учебник по динамическому импорту, если вам все еще интересно!