Можно ли использовать babel-standalone, если index.html является локальным сервером? (без веб-сервера)
Прежде чем я начну вопрос, вот что я уже знаю, чтобы избежать ответов в том же духе.
TL; DR: я уже знаю, что могу использовать веб-сервер и обслуживать index.html как http://localhost:8081/index.html и это будет работать.
Теперь о деталях вопроса:
Я создал минимальное приложение response-js, ссылаясь на babel-standalone в файле index.html следующим образом:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Minimal</title>
</head>
<body>
<div id='divRootComponent'></div>
<!-- react reasonably latest for oct/2018 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.2/umd/react-dom.production.min.js"></script>
<!-- babel -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
<!-- react CUSTOM component.. i.e. myApp's entry point -->
<script type="text/babel" src="index.js"></script>
</body>
</html>
и содержимое index.js:
class YoSupComponent extends React.Component {
constructor () {
super();
this.state = {
message: 'whatever...'
};
}
componentDidMount() {
console.log('YoSupComponent.componentDidMount');
}
render () {
return (
<div>
Yo ! Dude or Dudette... sup ?
</div>
);
}
}
const props = {}; //none for now...
ReactDOM.render(<YoSupComponent {...props} />
, document.getElementById('divRootComponent'))
Когда я пытался получить доступ к файлу index.html в браузере через файл:///path/to/index.html, ошибка была такой:
Доступ к XMLHttpRequest по адресу 'file:///D:/path/to/index.js' из источника 'null' был заблокирован политикой CORS: Запросы перекрестного происхождения поддерживаются только для схем протоколов: http, data, chrome, chrome расширение, https. @ babel.min.js:24
Таким образом, думая, что проблема связана с тегами сценариев, ссылающимися на файлы удаленно, я загружаю реакцию и бабел локально, и делаю ссылки локальными; затем снова я получаю доступ к файлу:///path/to/index.html.
Тем не менее получить ту же ошибку! в чем дело? а) почему babel даже использует XMLHttpRequest (согласно сообщению об ошибке), когда файл babel.js теперь локальный? б) почему нет такого сообщения для реагирующих файлов?
1 ответ
Согласно MDN, если вы укажете тег сценария с типом, который не text/javascript
, он будет игнорироваться браузером:
Внедренный контент обрабатывается как блок данных, который не будет обрабатываться браузером. Разработчики должны использовать действительный MIME-тип, который не является MIME-типом JavaScript, для обозначения блоков данных. Атрибут src будет игнорироваться.
Другими словами, браузер не загружается и не запускается index.js
в вашем примере. Это имеет смысл - в противном случае вы получите синтаксическую ошибку, так как ваш браузер не может понять JSX.
На самом деле происходит то, что babel-standalone
скрипт просматривает ваш HTML, находит все теги скрипта, помеченные text/babel
загружает их черезXMLHttpRequest
, а затем компилирует и запускает их.
Вот почему вы получаете ошибки CORS - браузер не загружает файл, скрипт есть. К сожалению, я не думаю, что вы можете решить эту проблему без использования веб-сервера или предварительной компиляции кода Babel.