Использование TWE-React с ClojureScript (import() в cljs)

В настоящее время я пытаюсь использовать TailWindElements-React в сценарии Clojure. В JS пример будет выглядеть так:

import React, { useState } from "react";
import { TECollapse, TERipple } from "tw-elements-react";

export default function App(): JSX.Element {
  const [show, setShow] = useState(false);

  const toggleShow = () => setShow(!show);

  return (
    <>
      <TERipple rippleColor = "light">
        <a
          className = "inline-block rounded bg-primary mr-2 px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
          role = "button"
          onClick = {toggleShow}
        >
          Link
        </a>
      </TERipple>
      <TERipple rippleColor = "light">
        <button
          type = "button"
          className = "inline-block rounded bg-primary px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
          onClick = {toggleShow}
        >
          Button
        </button>
      </TERipple>

      <TECollapse show = {show}>
        <div className = "block rounded-lg bg-white p-6 shadow-lg dark:bg-neutral-700 dark:text-neutral-50">
          Some placeholder content for the collapse component. This panel is
          hidden by default but revealed when the user activates the relevant
          trigger.
        </div>
      </TECollapse>
    </>
  );
}

Однако (на самом деле) TWE использует/требует функцию import(). Кажется, это создает проблемы для CLJS, и обходной путь:

(ns my.app
  (:require
    [shadow.esm :refer (dynamic-import)]
    [shadow.cljs.modern :refer (js-await)]))

(defn foo []
  (js-await [mod (dynamic-import "https://cdn.pika.dev/preact@^10.0.0")]
    (js/console.info "loaded module" mod)))

как показано здесь с использованием ES.

Поэтому я адаптировал это к

(ns my.app
  (:require
    [shadow.esm :refer (dynamic-import)]
    [shadow.cljs.modern :refer (js-await)]))

(defn TERipple []
  (js-await [mod (dynamic-import "tw-elements-react")]
    (js/console.info "loaded module" mod)))

Однако в результате CLJS говорит мне shadow_esm_import is not defined. Думаю, мне нужно изменить цель в конфигурации на :esm, но тогда я не смогу смонтировать свое приложение в DOM. Я новичок в CLJS, так что все это очень запутанно. Кто-нибудь может мне помочь?

Редактировать: Томас Хеллер отметил, что это не использование import(), а только базовый синтаксис import. Что приведет к импорту через

(:require ["tw-elements-react" :refer (TECollapse TERipple)])

а затем использовать его как

[:> TERipple
...
]

Однако это дает мне

[:app] Build failure:
Closure compilation failed with 1 errors
--- node_modules/tw-elements-react/dist/js/tw-elements-react.umd.min.js:13
Dynamic import expressions cannot be transpiled.
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В примере JS не используется import(). Это обычный импорт . Я знаю, что они похожи, но они совершенно разные.

В документации Shadow-cljs есть множество распространенных примеров перевода.

Итак, import { TECollapse, TERipple } from "tw-elements-react"; переводится как

(ns my.app
  (:require ["tw-elements-react" :refer (TECollapse TERipple)]))

Между прочим, пакет tw-elements-react действительно использует import() внутри себя. Это не меняет способа :require использования CLJS, но для этого требуется shadow-cljs версия 2.26.6+.

Спасибо за ответ. Я уже пробовал это и получил эту ошибку [:app] Build failure: Closure compilation failed with 1 errors node_modules/tw-elements-react/dist/js/tw-elements-react.umd‌​.min.js:13 Dynamic import expressions cannot be transpiled.

Burning_Beef 07.05.2024 14:17

Какую версию Shadow-CLJS вы используете? Поддержка этого была добавлена ​​в 2.26.6, поэтому старые версии не будут работать.

Thomas Heller 07.05.2024 22:16

Я действительно использовал версию 2.26.2. Я увеличил его, и теперь все скомпилировано и импортировано, но если я использую [:> TERipple [:div ... ]], браузер выдает ошибку Minified React 40: целевой контейнер не является элементом DOM.

Burning_Beef 14.05.2024 09:51

Кажется, ошибка связана с недопустимым вызовом перехватчика, но я не знаю, что не так с моим синтаксисом.

Burning_Beef 14.05.2024 10:02

Наверное, хорошо задать это отдельным вопросом к коду, который вы пробовали.

Thomas Heller 14.05.2024 10:28

Спасибо, я сделаю это. Возможно, вы можете добавить подсказку с версией к своему основному ответу. Тогда этот пост решает все проблемы моего первоначального поста, и я могу принять его как ответ.

Burning_Beef 14.05.2024 12:47

Другие вопросы по теме