Как включить внешние скрипты в веб-приложение React? - PullRequest
2 голосов
/ 07 мая 2020

Я создал веб-приложение React, используя приложение create-react-app, и я занят включением в проект шаблона панели мониторинга. Мне удалось встроить большую часть HTML в различные повторно используемые компоненты React, и я смог успешно импортировать все таблицы стилей. Однако я ударился о кирпичную стену, когда попытался включить файлы шаблона JavaScript в свой проект.

Итак, я взял все необходимые файлы JavaScript и добавил их все во вспомогательные файлы. папка ресурсов (находится в папке publi c) с именем js, то есть:

/public/assets/js/{file.js}

Затем я добавил теги сценария в индекс . html в папке publi c:

<!DOCTYPE html>
<html lang="en" class="js">
   <head>
      <meta charset="utf-8" />
      <!-- other meta tags -->
      <title>My Dashboard</title>
   </head>
   <body>
      <noscript>You need to enable JavaScript to run this app.</noscript>
      <div id="root"></div>
      <script type="text/JavaScript" src="./assets/js/bundle.js"></script>
      <script type="text/JavaScript" src="./assets/js/scripts.js"></script>
   </body>
</html>

Когда я запускаю сервер разработки, приложение загружается правильно, однако со скриптами происходит что-то странное; Я добавил компонент (слайдер) на целевую страницу, который использует пакет . js и скрипты. js файлы. Когда страница изначально загружается, компонент отображается правильно (т.е. JS работает), однако через секунду компонент становится полностью сломанным - почти как если бы страница обновлялась без правильной загрузки JS во второй раз.

Когда я посмотрел на консоль, я увидел, что у меня были вызваны два JS файла с одинаковыми именами. Я понял, что как часть пакета WebPack в фоновом режиме создает собственный пакет и обслуживает его - и этот пакет также называется пакетом. js. Следовательно, я переименовал внешний файл JavaScript в externalbundle. js и, соответственно, внес изменения в атрибут sr c в теге скрипта:

<script type="text/JavaScript" src="./assets/js/externalbundle.js"></script>

Приложение компилируется и загружается успешно, и я не вижу предупреждений или ошибок в консоли, но то же самое происходит; ползунок загружается правильно в течение этой первой секунды, а затем прерывается (консоль по-прежнему не показывает никаких предупреждений или ошибок).

Я также добавил console.log('Loaded') в конце externalbundle. js файл, и он отображается в консоли, как и ожидалось, когда приложение загружено.

Поэтому я действительно хотел бы знать, неправильно ли я ссылаюсь на эти внешние сценарии, возможно, не полностью понимаю, как работает DOM и как он работает с внешними скриптами, или есть совершенно другой способ работы с внешними скриптами?

Возможно, стоит упомянуть также, что файлы JavaScript, на которые я ссылаюсь, недоступны как библиотеки в npm. Я также пробовал импортировать их внутри index. js вместо этого (конечно, перемещая файлы в каталог sr c), что вызывает всевозможные ошибки, такие как

'define' не определены

и

Ожидалось присвоение или вызов функции, и вместо этого было обнаружено выражение NodeJS "совместимый" файл (добавив exports.{filename} = function(a,b) { ... } и вызвав его внутри index. js, импортировав import { filename } from './path/to/file.js' и вызвав его с помощью filename()) дал еще худшие результаты.

Есть идеи?

1 Ответ

1 голос
/ 07 мая 2020

Вы можете использовать scriptjs

import $script from 'scriptjs';

class TaskLists extends Component  {

  UNSAFE_componentWillMount () {
    $script(['https://YOUR_SCRIPT_URL_HERE'], 'scriptidentifier');
  }
  render () {
   return (<div>Hello</div>)
  }
}

Пример из документов https://www.npmjs.com/package/scriptjs

// load jquery and plugin at the same time. name it 'bundle'
$script(['jquery.js', 'my-jquery-plugin.js'], 'bundle')

// load your usage
$script('my-app-that-uses-plugin.js')


/*--- in my-jquery-plugin.js ---*/
$script.ready('bundle', function() {
  // jquery & plugin (this file) are both ready
  // plugin code...
})


/*--- in my-app-that-uses-plugin.js ---*/
$script.ready('bundle', function() {
  // use your plugin :)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...