まず、text/babel
は本番環境では使用しないことを理解していますが、.jsx
ファイルに変更を加えると、何もしなくてもDjangoの開発ウェブサーバーが再読み込みされるので、開発には非常に便利です(つまり、変更するたびにJSXをJSにコンパイルします。
これは私が開発していない大規模なシステム用の小さなプラグインであるため、私はビルド環境(Djangoなど)を制御できません。
問題はこれです:
<script type="text/babel" src="{% static "myapp/js/main.jsx" %}"></script>
<script>
$(function() {
console.log(mything);
}
</script>
mything
はmain.jsx
にあり、次のように単純です。
var mything = "hello";
main.jsx
がjavascriptである場合(およびスクリプトタグのタイプがそれに応じて変更される場合)、これは問題なく機能します。 text/babel
と同様に、mything
がスコープ内にないため機能しません。
Uncaught ReferenceError: mything is not defined
これは、さまざまな種類のスクリプトタグがスコープを共有することを期待しないため、私には理にかなっていますが、これを回避して開発を支援するための巧妙な方法があるかどうか疑問に思っています。
以前はすべてのコードを単一のtext/babel
ブロックに入れていましたが、それが大きくなるにつれて、それをいくつかのJSXファイルに分離するといいでしょう。
Babelソースを深く掘り下げることなく( https://github.com/babel/babel/blob/master/packages/babel/src/api/browser.js を見て)、私はJSXソースを読み取り、ソースで変換を実行してから、何らかの方法でソースをeval
s実行すると推測します。変換されたコード(ES6の標準)にバベルが'use strict';
を付加するため、スコープは共有されません。
本当に変数を公開する必要がある場合は、変数をwindow
にアタッチできます(つまり、mything
の代わりにJSXでwindow.mything
を使用します)。理想的には、コードを複数のファイルに分割するときにモジュールを使用する必要があります。ビルドステップを利用してBabelを介してコードを変換し、browserify/webpackを使用して依存関係を管理できます。