Lynx

更新:2025-03-07
JavaScript

概要

クロスプラットフォーム開発用のフレームワーク「Lynx」を使ってみる。

とりあえずQuick Start

https://lynxjs.org/guide/start/quick-start.html

プロジェクトの作成

/some/directory
npm create rspeedy@latest
/some/directory
Create Rspeedy Project
Project name or path
prayground <= 任意の名前
Select language
TypeScript
Select additional tools (Use <space> to select, <enter> to continue)
Add Biome for code linting and formatting
Add ESLint for code linting
Add Prettier for code formatting
Next steps ─────────────╮
1. cd prayground
2. git init (optional) │
3. npm install
4. npm run dev
├──────────────────────────╯
All set, happy coding!

以下の警告が出たが、とりあえず無視。

npm warn deprecated acorn-import-assertions@1.9.0: package has been renamed to acorn-import-attributes

Xcode

XcodeはApp Storeから取得する。Componentなし(Built-inだけ)でインストールしたらこの後のSimulator部分で進めなくなったので、[Xcode] - [Settings] - [Components]から「iOS 18.2 + iOS 18.3.1 Simulato」を選択してインストールした。

Simulator

Xcodeを起動したら[Open Developer Tool]からSimulatorを起動。[File] - [Open Simulator] - [iPhone 16 Pro]を選択すればiPhoneが立ち上がる。

LynxExplorer

LynxExplorerをダウンロードして解凍。

/some/directory
mkdir -p LynxExplorer-arm64.app && tar -zxf LynxExplorer-arm64.app.tar.gz -C LynxExplorer-arm64.app/

LynxExplorer-arm64.appディレクトリは破損した見た目になるが気にしない。作成したディレクトリをiPhoneにドラッグアンドドロップすると、ホーム画面にLynxExplorerが追加される。

開発サーバを起動する

/project_dir
npm run dev

起動したらGRコードとURLが表示されるので、LynxExplorerを起動して「Card URL」に当該URLを貼り付けて「Go」するとローカルが確認できた。Lynxのロゴはかっこいい。

/src/App.tsxを編集してみて、ホットリロードされることも確認できた。コードを見ると<text></text><view></view>などの、HTMLライクな独自要素を使って構築できるみたい。

/project_dir/src/App.tsx
import { useCallback, useEffect, useState } from '@lynx-js/react'
import './App.css'
import arrow from './assets/arrow.png'
import lynxLogo from './assets/lynx-logo.png'
import reactLynxLogo from './assets/react-logo.png'
export function App() {
const [alterLogo, setAlterLogo] = useState(false)
useEffect(() => {
console.info('Hello, ReactLynx')
}, [])
const onTap = useCallback(() => {
'background only'
setAlterLogo(!alterLogo)
}, [alterLogo])
return (
<view>
<view className='Background' />
<view className='App'>
<view className='Banner'>
<view className='Logo' bindtap={onTap}>
{alterLogo
? <image src={reactLynxLogo} className='Logo--react' />
: <image src={lynxLogo} className='Logo--lynx' />}
</view>
<text className='Title'>React</text>
<text className='Subtitle'>on Lynx</text>
</view>
<view className='Content'>
<image src={arrow} className='Arrow' />
<text className='Description'>Tap the logo and have fun!</text>
<text className='Hint'>
Edit<text style={{ fontStyle: 'italic' }}>{' src/App.tsx '}</text>
to see updates!
</text>
</view>
<view style={{ flex: 1 }}></view>
</view>
</view>
)
}

また時間ある時にドキュメントを読み進めてみる。

続く...かもね