Есть ли какой-либо способ, кроме использования eval/handleAs: "javascript" для динамического извлечения скриптов (через XMLHttpRequest)

Здесь Я задал вопрос, относящийся к исключениям, возникающим при динамической загрузке скриптов через XMLHttpRequest (другими словами, когда выполняется через eval)

В связанном вопросе я хотел знать, как динамически загружать сценарии как таковые, с самого начала считается плохой практикой. В моем конкретном случае у меня есть элемент HTML Canvas, и вместо того, чтобы загружать все возможные фигуры, я хочу их динамически импортировать, не перезагружая страницу и не запуская их при возврате. Проблема, с которой я столкнулась, заключается в том, что если код, связанный с этой формой, неверен, отображаемое сообщение об ошибке не очень полезно (указывает расположение оператора eval, а не неверный оператор). Есть ли другой способ динамически извлекать код с сервера и выполнять его, а лучше информировать о местоположении исключения, когда это происходит.

Ответ 1

Если вы хотите загрузить script, используйте элемент <script>. Если вы хотите динамически загружать script, создайте элемент <script> динамически.

var script = document.createElement('SCRIPT');
script.src = "<url to load>";
document.getElementsByTagName("HEAD")[0].appendChild(script);

Не гарантируется синхронный способ eval с синхронным XHR, но в идеале вы бы структурировали свой код, чтобы воспользоваться асинхронностью.

Ответ 2

Добавляя к ответу Майка, если вы хотите, чтобы хорошая поддержка отладчика, включая тег script, вероятно, это путь, так как это то, что отладчики привыкли работать. Основные отличия от eval, о которых вам нужно знать:

  • Eval запускается в области, где ее вызываемые теги script включены в глобальную область.
  • Eval является синхронным, в то время как теги включены асинхронно. (Вам нужно будет использовать что-то вроде JSONP и dojo. io.script, если вам нужно запустить код после завершения тега script).

Если скрипты исправлены, вы можете также рассмотреть возможность их отладки, включив теги script и развернув их по своему усмотрению.