Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Fresh(Deno)で 画像投稿サイトを作ってみよう! with Cloudflare x Tora Viewer
Search
虎の穴ラボ株式会社
December 16, 2022
Technology
0
570
Fresh(Deno)で 画像投稿サイトを作ってみよう! with Cloudflare x Tora Viewer
Deno のWebフレームワーク Freshを使用して、
画像投稿サイトの作成
キーワード
- Deno
- Fresh
- Cloudflare
- Tora Viewer
- esm.sh
虎の穴ラボ株式会社
December 16, 2022
Tweet
Share
More Decks by 虎の穴ラボ株式会社
See All by 虎の穴ラボ株式会社
FreshとHonoでDeno KVを使い倒す
toranoana
1
43
サブカル業界Developers_実践_開発業務でのAIの活用
toranoana
1
270
「エンジニアリングマネージャーのしごと」勉強してみた
toranoana
2
250
【OSC2024 Online/Spring】とらのあなラボの Deno イベント開催の取り組み
toranoana
0
280
【toranoana.deno#15】WebGPUで遊ぼう
toranoana
0
310
App Router による Web 開発について
toranoana
0
93
Fresh(Deno)をプラグインで拡張しよう!
toranoana
0
210
Freshプラグインのテストもプラグインを使うと捗る!
toranoana
0
120
個人開発アプリにスキーマ 駆動開発を取り入れた話
toranoana
0
80
Other Decks in Technology
See All in Technology
NgRx Signal Store
rainerhahnekamp
0
150
マルチアカウント環境への発見的統制の導入
ch1aki
1
1.3k
エンジニア候補者向け資料2024.04.24.pdf
macloud
0
3.3k
TechFeed Experts Night#27 〜 フロントエンドフレームワーク最前線 (Svelte)
baseballyama
1
380
SPI原点回帰論:事業課題とFour Keysの結節点を見出す実践的ソフトウェアプロセス改善 / DevOpsDays Tokyo 2024
visional_engineering_and_design
4
1.9k
ユーザーストーリーのレビューを自動化したみたの
bun913
1
410
MySQL の SQL クエリチューニングの要所を掴む勉強会
andpad
2
6.1k
複雑な構成要素を持つUIとの向き合い方 〜新・支出グラフでの実例〜 / B43 TECH TALK
nakamuuu
0
140
Postman v10リリース後を振り返る / Looking back at Postman v10 after release
yokawasa
1
160
Azure Container Apps + Bicep 〜 こんな感じで運用しています
kaz29
2
450
VSCodeの拡張機能を作っている話
ebarakazuhiro
1
300
On Your Data を超えていく!
hirotomotaguchi
2
660
Featured
See All Featured
A designer walks into a library…
pauljervisheath
200
23k
Robots, Beer and Maslow
schacon
PRO
155
7.9k
Building Applications with DynamoDB
mza
88
5.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
37
2.5k
A Philosophy of Restraint
colly
197
16k
Side Projects
sachag
451
41k
Bash Introduction
62gerente
604
210k
VelocityConf: Rendering Performance Case Studies
addyosmani
320
23k
What's in a price? How to price your products and services
michaelherold
237
11k
[RailsConf 2023] Rails as a piece of cake
palkan
23
3.9k
Rails Girls Zürich Keynote
gr2m
91
13k
BBQ
matthewcrist
80
8.8k
Transcript
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. 2022/12/14 toranoana.deno
#10 虎の穴ラボ 奥谷 一陽 Fresh(Deno)で 画像投稿サイトを作ってみよう! with Cloudflare x Tora Viewer
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. 自己紹介 奥谷
一陽 所属:虎の穴ラボ株式会社 担当:Fantiaなど新規事業系の開発 興味:TypeScript、Deno おすすめコンテンツ: 『暴太郎戦隊ドンブラザーズ』 『STAR WARS 小説 』 Twitter:@okutann88
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. Fresh 使ってますか?
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. さっと作って、 Deno
Deployに上げるのもカンタン
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. ですが、あえてFreshを使って ちょっと込み入ったことをしてみました
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. Freshで 画像投稿をやろう
- Freshをベースに開発する - 機能 - 画像のアップロード - 画像の一覧表示 - 画像の詳細表示 これらを実装する方針
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. イメージが湧きにくいと思うので、先にできたものを -
Freshをベースに開発する - 機能 - 画像のアップロード - 画像の一覧表示 - 画像の詳細表示 これらを実装する方針
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. イメージが湧きにくいと思うので、先にできたものを -
Freshをベースに開発する - 機能 - 画像のアップロード - 画像の一覧表示 - 画像の詳細表示 これらを実装する方針
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. 利用技術/サービス -
Deno - Fresh - Cloudflare - Tora Viewer
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. 利用技術サービス -
Deno - Fresh - Cloudflare - Tora Viewer ?
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. Tora Viewer
https://www.npmjs.com/package/@toralab/tora-viewer
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. Tora Viewer
- 漫画、写真集など画像一覧を閲覧できるビューアー - 虎の穴ラボ発のOSSです - Freshでも使えます。 // import_map.json { "imports": { "$fresh/": "https://deno.land/x/
[email protected]
/", "preact": "https://esm.sh/
[email protected]
", "preact/": "https://esm.sh/
[email protected]
/", "preact-render-to-string": "https://esm.sh/*
[email protected]
", "@preact/signals": "https://esm.sh/*@preact/
[email protected]
", "@preact/signals-core": "https://esm.sh/*@preact/
[email protected]
", "twind": "https://esm.sh/
[email protected]
", "twind/": "https://esm.sh/
[email protected]
/", "dotenv/": "https://deno.land/
[email protected]
/dotenv/", "huid/": "https://deno.land/x/
[email protected]
/", "tora-viewer": "https://esm.sh/v99/@toralab/
[email protected]
/es2022/tora-viewer.js", "body-scroll-lock": "https://esm.sh/body-scroll-lock", "simple-dropzone": "https://esm.sh/simple-dropzone" }
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. 全体構成 deno
cli APPサーバー 画像 アップロード ・ダウンロード ページアクセス 画像ID登録 APIサーバー DB
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. その他追加導入しているモジュール -
huid:文字列のハッシュをつくるのに使用 - body-scroll-lock:ビューアーを開いたときのスクロールロック - simple-dropzone:画像ドラッグ&ドロップ操作用 body-scroll-lock と simple-dropzone は、esm.sh経由での導入
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. ソースコード //
routes/index.tsx import Uploader from "../islands/Uploader.tsx"; import Images from "../islands/Images.tsx"; export default function Home() { return ( <div class="p-4 mx-auto max-w-screen-md"> <Uploader /> <Images /> </div> ); }
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. ソースコード //
app/islands/Uploader.tsx (前半) import { JSX } from "preact"; import { useEffect, useRef } from "preact/hooks"; import { mode } from "../util/signal.ts"; import { SimpleDropzone } from "simple-dropzone"; import UploaderIcon from "../components/UpLoadIcon.tsx"; export default function Uploader(_props: JSX.HTMLAttributes) { const inputRef = useRef<HTMLInputElement>(null); const dropzoneRef = useRef<HTMLDivElement>(null); const upload = async (file: File) => { if (!inputRef.current) return; const result = await fetch("/api/get_temp_post_url"); const resultJson = await result.json(); const formData = new FormData(); formData.append("file", file); const uploadResult = await fetch(resultJson.url, { method: "POST", body: formData, }); const uploadedResultJson = await uploadResult.json(); await fetch("/api/image_updated", { method: "POST", body: JSON.stringify(uploadedResultJson), }); inputRef.current.value = ""; mode.value = 1; };
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. ソースコード //
app/islands/Uploader.tsx (後半) useEffect(() => { const dropCtrl = new SimpleDropzone(dropzoneRef.current, inputRef.current); dropCtrl.on("drop", ({ files }: { files: Map<number, File> }) => { for (const [_key, value] of files) { upload(value); } }); }, []); return ( <div class="container"> <div id="dropzone" ref={dropzoneRef}> <label class="flex justify-center w-full h-32 px-4 transition bg-white border-4 border-gray-300 border-dashed rounded-lg hover:border-gray-600"> <div class="flex flex-col items-center m-2"> <div> <UploaderIcon /> </div> <div> <span class="font-medium text-gray-600">Drop or Select</span> </div> </div> <input type="file" ref={inputRef} class="hidden" multiple /> </label> </div> </div> ); }
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. ソースコード //
app/islands/Images.tsx (tora-viewer部分抜粋) import toraViewer from "tora-viewer"; export default function Images(_props: JSX.HTMLAttributes) { const openViewer = (index: number) => { const viewer = toraViewer( originalImages.map((image: Image, index: number) => { return { url: image.url, thumbnailUrl: miniImages[index].url }; }), { pageStyle: "normal"}, ); viewer.goTo(index); const originDispose = viewer.dispose; const boundDispose = originDispose.bind(viewer); const newDispose = () => { clearAllBodyScrollLocks(); boundDispose(); }; viewer.dispose = newDispose; }; return ( <div class="flex justify-center container"> <div class="flex flex-wrap w-full justify-center container"> {!miniImages ? "" : miniImages.map((image: Image, index: number) => ( <div class="my-2 px-1 w-32 w-full" key={`key-${image.key}`} style="background-image: url(/logo.svg); background-repeat: no-repeat; background-position: center center;" > <img src={image.url} onClick={() => openViewer(index)} /> </div> ))} </div> </div> ); }
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. esm.sh 小ネタ
開発中のこと - esm.sh経由で Tora Viewer を読み込むと、どうも毎回ビルドをしているような動 きをしていて動きが遅かった - ビルド結果を直接インポートするようにすると改善 同じように、esm.shから読み込みが遅いものは同じ対応ができるかも "https://esm.sh/v99/@toralab/
[email protected]
/es2022/tora-viewer.js" "https://esm.sh/@toralab/tora-viewer"
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. まとめ -
Fresh x Cloudflare x Tora Viewer で画像投稿サイトを作ってみました。 - ユーザー認証、ローディングアニメーションなど拡張すれば、 画像投稿サイトとして十分使えそうです。 - 今回の実装は islands2つだけを使ったサイトでした。 islandsを使いこなせるといろんなことができます。
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. お知らせ 今回取り扱った
画像投稿サイトの実装の詳細な解説が入ったブログが明日公開 省略した箇所の解説も入ってますので、ご期待ください!!
Copyright (C) 2021 Toranoana Inc. All Rights Reserved. ありがとうございました