Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.01.2023, 22:57
Новичок на форуме
Отправить личное сообщение для ichor Посмотреть профиль Найти все сообщения от ichor
 
Регистрация: 11.05.2019
Сообщений: 8

Динамический импорт
Подскажите, пожалуйста, как решить следующую задачу. Я пишу приложение для новостей. Содержание каждого поста частично (название, несколько иллюстраий, дата создания, раздел, аннотация, часть текста) вносятся в базу MongoDB. Каждая новость соответственно содержит уникальный id. Все это сделать, несложно.

Однако каждая новость также должна иметь часть уникального кода (html + js, как правило), который я планирую вносить вручную. К примеру, элементы canvas.
Таким образом вносить в каждую новость оригинальные элементы дизайна.

Эту задачу я планировал решить путем создания под каждую новость js файла, содержащего компонент. Файл создается вручную, оборачивается в компонент, скажем, ArtBlock и загружается на сервер в отдельную папку в ходе создания статьи (uploader), методом как и иллюстрации к статье.
Название файла должно совпадать с id статьи, чтобы через пропсы автоматически найти его в соответствующей папке и импортировать на страницу статьи.

Для этих целей я планировал использовать динамический import @loadable/component:
const Post = ({ post }) => {
  const { loading, error, data } = useQuery(IS_LOGGED_IN);
  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error!</p>;
  let arr = post._id;
  const ArtPage = loadable(post => import(`../arts/${arr}`));

  return (
    <article>
    <ArtPage />
    <div id={post._id}></div>
    <ImgStyle>
      <img src={post.imageUrl} />
    </ImgStyle>
      <H2>{post.title}</H2>
      <Link style={linkStyle} to={`/cats/${idcat}`}>
        <H4R>{post.category.catname}</H4R>
      </Link>
      <H4R>{post.createdAt}</H4R>
      <Link style={linkStyle} to={`/users/${iduser}`}>
        <H4R>{`author ${post.author.name}`}</H4R>
      </Link>
      <H4R>{`views ${post.viewsCount}`}</H4R>
      <PRiv4>
        <ReactMarkdown children={post.body}  />
      </PRiv4>
    </article>
  );
};


Но код упорно отказывается работать. При этом если убрать переменную и вставить конкретно название файла, но компонент подгружается.
const ArtPage = loadable(post => import(`../arts/63addc830407bc4b94f5d965`));


Почему все-таки импорт не грузит переменную?
const ArtPage = loadable(post => import(`../arts/${arr}`));

Несколько дней уже убил на поиск решения, но никак((
Ответить с цитированием
  #2 (permalink)  
Старый 04.01.2023, 09:33
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

import в системах сборки работает на этапе компиляции, соответственно он может импортировать только то, что уже есть в папках на этом этапе.
Выражение вида
import(`../arts/${arr}`)
на самом деле означает "загрузить в бандл всё из папки ../arts/ и во время исполнения выбирать из загруженного".

Решения два:
1. делать сборку с выходной целью esm.
2. не использовать import для файлов которых нет на момент сборки, использовать для них руками fetch + eval или что-то в этом духе.

Сразу скажу: первый вариант не пробовал(т.к. в основном все проекты у меня требуют поддержки брраузеров не умеющих в модули), так что какие там подводные камни не скажу.(но уверен, что на немаленький холмик хватит)
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 04.01.2023, 17:57
Новичок на форуме
Отправить личное сообщение для ichor Посмотреть профиль Найти все сообщения от ichor
 
Регистрация: 11.05.2019
Сообщений: 8

Так мы исходим из того, что файл есть в папке. Если его указать напрямую, без переменной то он грузится из папки. Через переменную, пишет что не может его найти(((
Ответить с цитированием
  #4 (permalink)  
Старый 04.01.2023, 18:55
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

ichor, ну сделай чистый проект, куда скопируй только один этот файл, сбилди с отключённым optimize\minimize и посмотри что у тя там в итоге в сырцах...¯\_(ツ)_/¯
Если что-то не работает - надо отлаживать, вестимо.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 04.01.2023, 23:30
Новичок на форуме
Отправить личное сообщение для ichor Посмотреть профиль Найти все сообщения от ichor
 
Регистрация: 11.05.2019
Сообщений: 8

я только учусь и сленг пока не понимаю))) т.е. код что я опубликовал по импорту корректен? и надо искать причину в другом месте?
Ответить с цитированием
  #6 (permalink)  
Старый 04.01.2023, 23:35
Новичок на форуме
Отправить личное сообщение для ichor Посмотреть профиль Найти все сообщения от ichor
 
Регистрация: 11.05.2019
Сообщений: 8

Мне нужен способ простого импорт js файла в компонент, который позволяет использовать в пути к файлу переменную. Все!
Ответить с цитированием
  #7 (permalink)  
Старый 05.01.2023, 06:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

ichor, завесит от системы сборки, но в терии должно работать, возможно надо добавить .js в конец.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт данных с Facebook/Twtter при регистрации? Имя AJAX и COMET 1 22.09.2011 15:10
Сделать динамический option prowoke jQuery 1 18.08.2011 20:45
Динамический список из DIV`ов и INPUT`ов Andrew_li jQuery 5 09.06.2011 15:23
Динамический массив vah-smile Элементы интерфейса 2 30.03.2011 15:19
Как узнать динамический код страницы? gosha13 Общие вопросы Javascript 5 27.07.2009 13:31