2016-02-18 5 views
4

Я пытаюсь использовать компоненты от http://react-components.com (например, react-youtube) в приложении на основе реагента, но, вероятно, мой наивный подход не является правильным. Я попытался установить пакеты NPM с модулем lein-npm, включить скрипт в html-страницу и использовать их через reagent/adapt-react-class, как в this Вопрос. Но за исключением этого образца я не увенчался успехом.Использование реактивов в реагенте

Обычно я получаю ошибки, такие как «require/import/module is not defined» или «Youtube is undefined» (с помощью (def yt-test [] (r/adapt-react-class js/Youtube)). Я смущен тем, что нужно делать. Я кое-что прочитал о webpack/browsify, saw cljsjs пакеты - это те, которые необходимы для того, чтобы это работало?

+0

Теоретически это должно быть проще: https://clojurescript.org/news/2017-07-12-clojurescript-is-not-an-island-integrating-node-modules, но я не уверен в некоторых деталей. См. Также этот проект тестового реагента: https://github.com/reagent-project/reagent-site-npm-deps-test – Wodin

+0

Должен был указать на этот запрос на растяжение: https://github.com/reagent-project/reagent/pull/306 – Wodin

ответ

3

Эти компоненты упакованы в модули CommonJS. Один из способов доступа к модулям CommonJS от ClojureScript - объединить их в один файл JavaScript, который может быть включен в вашу сборку ClojureScript.

Вам необходимо создать файл точки входа JavaScript, который требует ваших различных зависимостей NPM и предоставляет их ClojureScript (например, установив их на window). Создайте файл (назовем его index.js), содержащий:

window.YouTube = require('react-youtube'); 

Затем используйте инструмент, как Browserify связать файл точки входа и все зависимости требует:

npm install -g browserify 
browserify index.js --standalone window > bundle.js 

Включите bundle.js в вашем ClojureScript build, и вы сможете получить доступ к компоненту React от ClojureScript через js/YouTube

+0

Похоже, что реакция-youtube экспортируется как модуль CommonJS. https://github.com/troybetz/react-youtube/blob/master/src/YouTube.js –

+1

Для других людей - не забудьте удалить прямой импорт пакета ([SO require not defined] (http: // stackoverflow.com/questions/28696511/require-is-not-defined-error-with-browserify)), и в случае этого проигрывателя youtube мне также пришлось использовать 'require (" response-youtube "). default'. –

6

Я написал пошаговое руководство о том, как достичь этого с помощью webpack: blob.tomerweller.com/reagent-import-react-components-from-npm

Общая концепция такого же, как @scttnlsn предложил: связать все пакеты НПХ во внешнем файле JS и подвергать их через глобальную window объекта.

+0

Спасибо за это руководство. Я пытаюсь адаптировать его для https://www.npmjs.com/package/react-mathjax, но не знаю, что поставить в виде часть как код икота? У вас есть идея? – Gra

+0

Отвечая на мой собственный вопрос: '[:> ctx [:> node" 2 + 2 "]]' – Gra

+0

У меня есть еще одна проблема, для которой у вас может быть решение: https://stackoverflow.com/questions/45201315/a- это-не определено, когда-компиляции-а-cljs-Prj-с-с-NPM-модуль-под-прод-Profil – Gra