Closed3

D1 + cloudflare workers + hono, CSR的な例

knaka Tech-Blogknaka Tech-Blog

概要

honoで、CSR的なReact実装メモになります

  • 今回は、環境準備編です
  • CDNで、React読み込む方法です。

環境

  • cloudflare workers
  • D1
  • hono: 3.7.2
  • React 18

関連


関連のページ

https://zenn.dev/knaka0209/scraps/3888aca04ba193


作成したコード

https://github.com/kuc-arc-f/hono_jsx4

  • 関連のパス
  • /csr1
  • /csr2

  • src/views/layout.tsx
  • 上位レイヤーで、React読み込む例です
layout.tsx
import type { FC } from 'hono/jsx'
import { html } from 'hono/html'
//
export const Layout: FC = (props) => {
  return (
    <html>
      <head>
      {html`
      <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
      <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
      <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
      `}        
      </head>
      <div>
        <a href="/">[ home ]</a>
        <a href="/test/test_index">[test]</a>
        <a href="/csr1">[ Csr1 ]</a>
        <a href="/csr2">[ Csr2 ]</a>
      </div>
      <hr />
      <body>{props.children}</body>
    </html>
  )
}


  • views/csr1/App.tsx
  • hono/htmlで、scriptタグを読み込めるようでした
  • JSコードを、フロント側に送信する例です
App.tsx
export const Csr1: FC<{ items: any[] }> = (props: { items: any[] }) => {
  const timeStamp = Date.now();
  return (
    <Layout>
      <div>
        <h1>Csr1 </h1>
        <hr />
        <div id="root"></div>
        {html`<script type="text/babel" src="/js/csr/csr1.js?${timeStamp}"></script>`}       
      </div>
    </Layout>
  )
}


  • public/js/csr/csr1.js
  • public下の、js読込ます
  • 固定文字を、reactで表示するサンプル
csr1.js
let items = [];
let message = "";
//
function App() {
    const [updatetime, setUpdatetime] = React.useState("");
    React.useEffect(() => {
        (async () => {
            console.log("#start");
            message = "hoge"; 
            updateTimestap();
        })()
    }, []);
    //
    const updateTimestap = function() {
        const dt = new Date().toString();
        setUpdatetime(dt);
    }
    //
    return (
    <div className="App">
        <h1>Hello React 123</h1>
        <hr />
        <p>updatetime:{updatetime}</p>
        <p>message: {message}</p>
        <hr />
    </div>
    );
};
//
ReactDOM.createRoot(document.getElementById('root')).render(
    <App />
);

このスクラップは2023/09/29にクローズされました