はじめに
この記事は django advent calendar 12日目の記事です。
今回は django-teact-templatetagsを紹介させていただきたいと思います。
https://github.com/Frojd/django-react-templatetags
特徴
- サーバーサイドから django template をレスポンスを行う
- pythonのモデルを componentsに渡す データに変換可能なMixin
- SSR をサポート(未検証)
機能としてはたったこれだけですが、SPAでないアプリケーションにreactを導入したい場合やSSRしたい場合には重宝すると思いました。
使い方
基本的にREADMEの通りにすればOK
https://github.com/Frojd/django-react-templatetags/blob/develop/README.md
- installed_app に追加
INSTALLED_APPS = (
# ...
'django_react_templatetags',
)
- context_processor に追加
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'templates...',
],
'APP_DIRS': True,
'OPTIONS': {
'debug': True,
'context_processors': [
...
'django_react_templatetags.context_processors.react_context_processor',
],
},
},
]
- django templateに load react と
{% react_render component="Component" props=my_data %}
を追加
{% load react %}
<body>
<p>...something</p>
{% react_render component="Component" props=my_data %}
{% react_print %}
</body>
- modelからreact-componentに変換
READMEを参考に RepresentationMixin を実装するだけです。
https://github.com/Frojd/django-react-templatetags#working-with-models
使ってみた困った所
フロントエンドを今どきの作りにした場合は webpackやgulp からコンパイルされ、minifyされてjavascriptを読み込むと思います。
その際にはjsのトップレベルがローカルクロージャとなる場合が多く サーバに描画されたhtmlからreact-componentがスコープの対象外になりました。
最終的には(極力避けたかったのですが)ビルドされるjavascript内でブラウザのwindow変数に トップレベルの ReactComponentを代入するようにしました。
// こんなかんじのコードをrootに置く
const RootComponent = require("./Root")
window.RootComponent= RootComponent
まとめ
ライブラリそのものは薄く設計を工夫すれば捨てるのが容易で pythonのモデルからjavascriptへのデータ受け渡しまでサポートしてもらえるので個人的には結構アリな選択肢かと思いました。
特に従来のWebAppに部分的にReactを導入したい場合などは適していると思います。
また、今回は試していませんがSSRしたい場合も選択肢に入って良いと思います。
Top comments (0)