Closed22

RustのYewというフレームワークを使ってブログ作る

まよねーづまよねーづ

現状

  • md to text (SSG)
    • そもそもstd::fs::read_to_string()でファイル読み込んで文字列にできない。パスの指定変えてもResultの結果がErrになる。
  • md to html

原因(?)

  • Webフレームワークだからstdが使えない??
  • componentのview関数内でmdファイルの取得をしているが、ランタイムでよばれているためおかしい??

Rustの日本コミュニティで質問投げたから、回答してくれる方がいたらありがたい。
少しまってみる

まよねーづまよねーづ

その他にできていること

  • ルーティング
  • Tailwind CSSの導入
  • レイアウトコンポーネントの追加
まよねーづまよねーづ

https://rust-jp.slack.com/archives/C8FLSR5F1/p1640739102120500?thread_ts=1640734580.120100&cid=C8FLSR5F1

Slackでコミュニティの方が回答してくださった。ありがたい。ありがとうございます!
やはりstd::fs::read_to_stringがwasmとして実行されているためエラーになっていたらしい。
ビルド時にファイルの内容を文字列として扱いたい場合はinclude_str!という標準のマクロをつかえば、無事ファイルの内容を文字列で取得できた。
https://doc.rust-lang.org/stable/std/macro.include_str.html

まよねーづまよねーづ

pulldown-cmarkをつかってmdをhtmlに変換するのはできたけど、--- ---で囲われた部分をmeta情報として読み込めない。
CommonMarkという仕様?に準拠しているらしいので、シンプルなことしかできなそう。
meta情報をmdで自分で扱いたかったら、別のライブラリを探すか、シンプルに自分で実装 or なにか別のアイデアを考えるしかなさそう

まよねーづまよねーづ

結局これは正規表現用のクレート導入したりして無理やり文字列置換とかで解決

それとMeta用のstruct用意してそこに情報もたせてーみたいなこととかした

記事一覧はブログコンテンツ用のリポジトリでjson吐き出すようshell script書いて、GitHub APIから返すようした
それをシリアライズして〜ってかんじ

まよねーづまよねーづ

https://github.com/yewstack/yew/issues/1281
↑のコードを参考に、html文字列をそのままレンダリングするコンポーネントを作った。↓
https://github.com/mayone-du/yew-blog/blob/main/src/components/row_html.rs
やってることとしては、

  1. propsinner_htmlという名前で文字列を受け取る
  2. view関数内でDOMを生成し、そこにset_inner_htmlpropsでうけとった値をセット
  3. 生成したDOMを仮想DOMにセット(?)
    大体こんな感じ。あとはmeta情報どうするかと、スタイリング。
まよねーづまよねーづ

あとやること

  • mdファイル一括取得
  • ファイル名をslugにルーティング & ナビゲーション作成
  • それぞれのURL(slug)での内容を表示
まよねーづまよねーづ

std::fs::read_dir相当のことをしたいのだけれど、WASMでやるのはなかなか難しそう

  • jsファイルで取得した結果をRust側で受け取る
  • 別のAPIサーバーからmdの内容を返す
    このどっちかになるかも
まよねーづまよねーづ

一旦方向性を変えてみる。
ブログのコンテンツは同じプロジェクト内で管理せずに、別途リポジトリを作成して管理し、GitHub APIを使って取得することにする。
GraphQLを使えるとこは使いたいけど、上手くできるかわからない&ファイルの内容自体はまだRESTじゃないと取得できなそうだから、色々試してみる。

まよねーづまよねーづ

https://github.com/graphql-rust/graphql-client
↑のgraphql_clientというライブラリ試そうと思ったけど、いい感じに上手くうごかせなかった。。
挫折したのでGraphQLは諦める。そもそもwasmでどこまでできるのかとか、どのライブラリで何をすればいいかごっちゃになり始めたから一度整理する。

  • GraphQLは使わない
  • web_sysでfetchする(?)
    とりあえずこれでREST APIたたけるか試す。できれば非同期にしたいけど、また挫折したくないから一度なんでもいいから動かす
まよねーづまよねーづ

https://github.com/yewstack/yew/tree/dd2db93996e9168116cedc731f0ef6fa09b9b2fc/examples/futures/src
examplesみていい感じにとりあえず動いた。一覧の取得とかはまだだけど、まぁいい感じにできそうな気配ではある。
ということで一回デプロイについて考えることにした

GitHub Actionsでビルドしたものを、GitHub Pagesでホスティングしてみようと思う。ビルドで生成されるのは静的なHTMLWASMJSCSSだけだから、静的なホスティングで大丈夫なはず?

↓これから試すやつ。GitHub Actionsでソースをクローン&ビルドして、Gitの設定後にforce pushする感じぽい?もう少し調べたり試してみる
https://duinaru.github.io/ja/posts/2020-09-11-deloy-github-pages-with-actions/

まよねーづまよねーづ

GitHub Actions上でRustのセットアップができなそう問題がでてきた
できないなんてことはないんだろうけど、公式のsetupがなさそうで自分にできるかあやしい・
最悪普通にビルド成果物もpushするでもいいかな、、

まよねーづまよねーづ

ていうかGitHub Actions使ったら色々選択肢広がりそう。
実行したタイミングでAPI叩いてファイル自動生成→それを読んでなにかするとか、
別のリポジトリ(ブログのコンテンツ)でGitHub Actions設定して、内容を更新した際になにかする〜とか

まよねーづまよねーづ

GitHub ActionsでビルドしてそれをGitHub Pagesへデプロイできた、、
と思ったけどそんなに甘くない。↓のブランチにはちゃんとひつようなファイルがあるんだけど、いざ公開されたURLへアクセスしてもHTML以外のファイルが上手く読み込めてない🥺
https://github.com/mayone-du/yew-blog/tree/gh-pages

なんでだ?ちゃんとGitHub Pagesの設定でgh-pagesブランチ指定にもなってるし、なによりHTMLはちゃんとビルド後のがよみこまれてる。謎だ
https://mayone-du.github.io/yew-blog/

まよねーづまよねーづ

原因はシンプルにビルド結果のhtmlからのパスが間違っていた。
GitHub PagesのURLがhttps://mayone-du.github.io/yew-blog だから、絶対パスでの指定がだめだったぽい
ビルド結果のhtmlのscriptやらなんやらの指定を相対パスに書き換えたら上手く行った(?)
あとの課題は、

  • Yewのアプリ自体のルーティングを /profileとかにしてたから、このままだと全部404になる(ベースに/yew-blogを指定しなきゃいけない)
  • 毎回ビルド後のhtmlのパスを手動で書き換えなきゃいけない

からこれらなんとかする

まよねーづまよねーづ

デザイン決められなさすぎて一向に進まない問題
今回に限ったことじゃないけど、これのせいで今まで何度もモチベが削られてきた。今回こそは頑張る!!

現状

  • デザイン決まってなくて色々辛い
  • 無理やり感あるけどCD環境整った
  • とりあえず大体いい感じに動いて落ち着いた
このスクラップは2022/02/11にクローズされました