Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Building markdown editor using Rust’s parser
Search
HiroyukiYagihashi
November 27, 2021
Technology
2.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Building markdown editor using Rust’s parser
HiroyukiYagihashi
November 27, 2021
More Decks by HiroyukiYagihashi
See All by HiroyukiYagihashi
2024年度SecHack365 アシスタントを囲む会
yagipy
0
120
LLMの活用方法と課題
yagipy
0
380
What is Soft Memory Limit?
yagipy
1
740
簡易的な推薦機能を実装する
yagipy
0
180
GitHub oneliner command
yagipy
0
120
Other Decks in Technology
See All in Technology
視野はAIに、視座は人に / ai-for-breadth-humans-for-perspective
nkzn
3
1.8k
Autonomous AI Lakehouse - Live AI Hubから始めるセキュアなAIデータ活用 -
oracle4engineer
PRO
2
170
ビジネス部門からPOを迎えての半年間の進歩と課題
zozotech
PRO
0
160
クラウドエージェントの先駆け Devin。今も最先端を走る、他との違い
kinopeee
1
500
[FECONF-2026] 신대륙을 향한 카카오페이증권 프론트엔드 항해기 (이주승)
l1ghthouse
0
280
Filter What the LLM Reads: RAG Governance with AgentCore Gateway
yakumo
1
130
Content Mapper APIの応用例~CSS Modules、言語ファイル~
uhyo
2
150
AI秘書と毎日働くのはもう当たり前。開発以外の業務に足りない機能をどう埋める?
minorun365
PRO
4
1.9k
kintoneで在庫管理システムを作るときの要件定義・設計ポイント
kai0707
0
170
生き様としてのSRE
hokkai7go
0
130
200人の配信コメント、 全部Jevが仕分けます 〜 マサカリガードを作ってみた 〜
katayamatg
1
440
Technical Project Manager の役割とやりがい、少しだけ AI
yoshiiryo1
0
240
Featured
See All Featured
Site-Speed That Sticks
csswizardry
13
1.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
Color Theory Basics | Prateek | Gurzu
gurzu
1
500
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
340
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
The browser strikes back
jonoalderson
0
1.9k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
360
Practical Orchestrator
shlominoach
192
12k
Product Roadmaps are Hard
iamctodd
55
13k
Transcript
Building markdown editor using Rust’s parser @yagipy JS Conf JP
2021
自己紹介 @yagipy(Hiroyuki Yagihashi) - 所属: からくり株式会社/エンジニア - TypeScript/Next.jsでフロントエンドや、 Go/Node.jsで APIサーバー、AWSでインフラ構築、Figmaでデザイン作成、
Java/KotlinでAndroid等 - エンジニア募集中です - Twitter: @yagipy_ - GitHub: @yagipy - Blog: https://blog.yagipy.me
本セッションのゴール - wasmのユースケースの一部を理解できるようになる - Rustのコードからwasm pkgを生成できるようになる - wasm pkgをReactで使用できるようになる -
マークダウンエディタが構築できるようになる
本セッションで話すこと - 作ったもの - アーキテクチャ - アーキテクチャのモチベーション - フロントエンド複雑化の流れ -
問題点 - 解決策 - 実装の紹介 - Rustのライブラリをwasm pkg化する - wasm pkgをdependenciesに追加する - wasm pkgをロードするReact Hookを定義する - 定義したReact Hookを呼び出す - まとめ
作ったもの
https://editor.yagipy.me - 3種類のプレビュー形式に対応 - デフォルト - マインドマップ - スライド -
3種類のレイアウトに対応 - 2カラム(textarea,preview) - textareaのみ - Previewのみ - 本セッションでは、デフォルト/スライドで使用しているRustコード(マー クダウンパーサー)をReactで使用するまでのアーキテクチャを紹介します
アーキテクチャ
RustコードがReactアプリで使用できるまで Reactアプリ wasm pkg Rustコード wasm-pack import マークダウンパー サー tsの型定義
Jsのラッパー wasm
アーキテクチャのモチベーション
前提: フロントエンド大規模化の流れ - ロジックがフロントエンドに寄ってきている - 主なメリット: 無駄な通信の削減、サーバーリソースの削減 - よりユーザーの近くで計算した方が良い -
エッジコンピューティングやフォグコンピューティングの流れ - サーバーに戻そう、という動きもあるにはあるが ...(React Server Components等)
問題点 - サーバーに書いていた処理をフロントエンド用に書き直す必要がある - 今までサーバーサイドはデータストアの役割に加えて、共通ロジックの置き場所として働い ていたがそうではなくなってきている
解決策 - 色々ある - blitz, Kotlin Multiplatform, wasm, etc.. -
様々な言語の資産を活用したい場合はwasmが選択肢に入る - 今回は、実験としてRustのコードをwasmにしてWeb上で使用するという実 装を行った
実装の紹介
1. Rustのコードをwasm pkg化する 2. wasm pkgをdependenciesに追加する 3. wasm pkgをロードするReact Hookを定義する
4. 定義したReact Hookを呼び出す RustコードをReactアプリで使用するまでの手順
Rustのコードをwasm pkg化する - wasm-packを使用 - wasm_bindgen + package.json等を出力(npm publishする場合にスムーズに対応でき る)
- wasm_bindgen: #[wasm_bindgen]アトリビュートを付けた関数の wasmとJavaScript のラッパーとTypeScriptの型定義を生成する - https://developer.mozilla.org/ja/docs/WebAssembly/Rust_to_wasm#buildi ng_the_package use pulldown_cmark::{html, Options, Parser}; use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn pulldown_cmark(source_text: &str) -> String { // ~~~ 省略 ~~~ html_output }
wasm pkgをdependenciesに追加する - package.jsonのdependenciesに追加 - 直接/pkgのパスを指定する形でも可能 { "dependencies": { "markdown-parser":
"file:./markdown-parser/pkg" } }
wasm pkgをロードするReact Hookを定義する - wasmを含んだJavaScriptは動的に読み込む必要があるので、その読み込み を待ってrerenderする import { pulldown_cmark }
from 'markdown-parser' export interface IPullDownCmark { pulldown_cmark: typeof pulldown_cmark } export const usePullDownCmark = () => { const [state, setState] = useState<IPullDownCmark | null>(null) useEffect(() => { (async () => { const wasmContainer = await import('markdown-parser') setState(wasmContainer) })() }, []) return state }
定義したReact Hookを呼び出す - 作成したHookを呼ぶ - wasm_bindgenした関数が呼べる interface IProps { text:
string } export const DefaultPreview = ({ text }: IProps): ReactElement => { const instance = usePullDownCmark() return ( <div dangerouslySetInnerHTML={{ __html: instance?.pulldown_cmark(text) ?? '', }} /> ) }
まとめ
まとめ - wasm-packを使用することで、簡単にRustで書いたコードをWeb上で使用 できた - その他のwasmがサポートされている言語のコードも、wasmを介することで Web上で使用できるようになるため、既存の言語資産をWeb上で使用できる
Thank you for listening!