Babel polyfill: запуск кода ES6 из ajax

Я пытаюсь настроить страницу, которая загружает HTML-страницы с помощью ajax и устанавливает содержимое элемента на главной странице в HTML-код, полученный с сервера. HTML может содержать теги сценария.

Это отлично работает для обычных элементов сценария (ES5 или «текст/javascript»), но когда я устанавливаю тип «текст/бабель», код не запускается.

Если я захожу на эту страницу напрямую (т.е. ajaxing не происходит), код "text/babel" работает нормально. Есть ли что-то, что мешает Babel узнать об этих элементах сценария?


person Hassan    schedule 07.08.2016    source источник
comment
Также не запускаются обычные теги сценария, когда они создаются путем установки innerHTML.   -  person Tamas Hegedus    schedule 07.08.2016
comment
Может быть, вы используете фреймворк, который выполняет теги скрипта в ajaxed dom?   -  person Tamas Hegedus    schedule 07.08.2016
comment
Может быть. Я использую метод jquery .load() для загрузки новых страниц. Я посмотрю на это больше.   -  person Hassan    schedule 07.08.2016
comment
Да, я только что просмотрел документы для .load(), и да, кажется, что он запускает сценарии для меня. Я не знал, как это работает. Спасибо.   -  person Hassan    schedule 07.08.2016
comment
Кроме того, даже если он запускал скрипты ES6 локально, что означало бы, что вы настроили свой браузер для этого, на большинстве компьютеров этого не произошло бы. Если это предназначено для общего потребления, вы должны транспилировать.   -  person Dave Newton    schedule 07.08.2016
comment
@DaveNewton Он не предназначен для общего пользования, но должен работать на нескольких машинах. Какая конфигурация необходима? Я надеялся, что он просто запустится на этих компьютерах без дополнительной настройки.   -  person Hassan    schedule 07.08.2016
comment
@Hassan Нужно ли запускать его в браузерах, отличных от Chrome? IIRC Chrome поддерживает ES6 (ES7?) Начиная с v52, но это всего лишь Chrome. Я даже не знал, что text/babel это то, что понимают обычные браузеры.   -  person Dave Newton    schedule 07.08.2016
comment
Для запуска text/babel ему пришлось использовать какой-то очень старый пакет, который транспилировал код на лету. Такого пакета нет уже много лет.   -  person Tamas Hegedus    schedule 07.08.2016
comment
Или нет, просто браузеры игнорировали тег неизвестного типа и запускали его как обычный javascript, и использовались только поддерживаемые функции es6, так что...   -  person Tamas Hegedus    schedule 07.08.2016
comment
Я использую что-то под названием babel-standalone.   -  person Hassan    schedule 07.08.2016


Ответы (2)


По умолчанию теги сценария не запускаются при создании путем установки элемента innerHTML. Функция jQuery-s load делает это за вас, она проходит через dom и выполняет вновь созданные теги скрипта (используя eval). babel-browser не интегрирован с load jQuery. Вот почему это не работает.

Решение: не используйте babel-browser, browser-transforms или babel-browser-transform. Они либо не поддерживаются годами, либо даже удаляются. Используйте rollupjs или webpack для предварительной компиляции и объединения ваших исходных кодов, даже для разработки.

ИЗМЕНИТЬ

Если вы используете только функции es6, поддерживаемые всеми вашими целевыми браузерами, вам вообще не нужно транспилировать. Просто используйте теги type="text/javascript", а еще лучше голые теги <script>.

person Tamas Hegedus    schedule 07.08.2016

Это именно та проблема, с которой я сталкиваюсь, когда пытаюсь использовать компонент реакции на старом веб-сайте jquery.

Я попробовал два способа заставить его работать: 1. Используйте webpack для компиляции компонента, мой webpack.config.js выглядит примерно так:

 var HtmlWebpackPlugin = require('html-webpack-plugin');
 module.exports = {
 entry: {
     main: [
         'es6-shim',
         'promise-polyfill',
         'whatwg-fetch',
         './form_component.js' // Path to your app's entry file
     ]
 },
 output: {
     path: __dirname,
     filename: "bundle.js"
 },
 module: {
     rules: [
         {
             test: /\.js$/,
             use: {
                 loader: 'babel-loader',
                 options: {
                     presets: [
                         ['es2015', {
                             loose: true,
                             modules: false
                         }],
                         'react'
                     ]
                 }
             }
         }
     ]
 },
 plugins: [new HtmlWebpackPlugin()]
 };

Это работает, но bundle.js весит около 880 КБ, что слишком много только для компонента формы.

  1. Поскольку проблема связана с тем, что скрипт babel не выполняется в функции jquery globalEval, я попытался предварительно скомпилировать его с помощью babel и использовать предварительно скомпилированный js, он также работает, и предварительно скомпилированный js имеет примерно тот же размер, что и исходный файл js. :

    babel form_component.js --presets react,es2015 > precompiled.js

person Xiong Yufan    schedule 27.12.2017