Загрузка uppy с помощью Rails 7, stimulus и importmaps

Можно ли загрузить Uppy в ванильное приложение Rails через карты импорта Rails 7?

Если вы в конечном итоге закрепите @uppy/core, вы получите много зависимостей, добавленных в ваш файл importmap:

bin/importmap pin @uppy/core

... но когда вы пытаетесь получить к нему доступ через контроллер Stimulus, например:

import Uppy from '@uppy/core';

Вы получаете множество не очень полезных ошибок.

Сафари показывает:

syntaxerror: Importing binding name 'default' cannot be resolved by star export entries.

И у Chrome есть несколько разных ответов:

SyntaxError: The requested module 'classnames' does not provide an export named 'default'

(Я также видел, что это проблема для mime-match вместо classnames.

Я немного запутался с отладкой этого - сложно понять, откуда может возникнуть проблема. Это тип ответа «не могу использовать импортные карты Rails 7»?

🤔 А знаете ли вы, что...
Ruby on Rails популярен для быстрого создания MVP (Minimum Viable Product) стартапов и прототипов.


1
106
1

Ответ:

Решено

Я думаю, это связано с разными стилями импорта, поддерживаемыми в разных окружениях. Сопровождающие jspm и importmap-rails призывают пользователей сообщать о проблемах или исправлениях с зависимостями. например

Мне удалось воспроизвести проблему Failed to register controller: uppy (controllers/uppy_controller) SyntaxError: The requested module 'mime-match' does not provide an export named 'default', которую вы видели при использовании unpkg.

У JSPM, похоже, нет проблем, и я думаю, что он делает немного больше, чтобы сгладить их. Вы можете попробовать переключиться с помощью флага --from jspm. Хотя, я считаю, что это по умолчанию.

❯ ./bin/importmap pin @uppy/core @uppy/drag-drop --from jspm

Мне этого было достаточно, чтобы получить базовый контроллер для загрузки Uppy и его плагина перетаскивания:

import { Controller } from "@hotwired/stimulus"
import { Uppy } from "@uppy/core"
import { default as DragDrop }  from "@uppy/drag-drop"

// Connects to data-controller = "uppy"
export default class extends Controller {
  connect() {
    const uppy = new Uppy({ })
      .use(DragDrop, {
        target: "#drag-drop"
      })
    window.uppy = uppy;

Я не стал экспериментировать дальше. Может быть нужно больше.