feat: WASMビルド完全対応+finiシステム修正 🎉

## WASMビルド対応
- TimerBox、AudioBox等の問題のあるBoxをWASM環境では条件付きコンパイルで除外
- WebBox (WebDisplayBox, WebConsoleBox, WebCanvasBox) にas_anyメソッド追加
- プラグイン関連コードに#[cfg]ガードを追加
- web-sysフィーチャーを追加(Performance、MouseEvent等)
- projects/nyash-wasmのビルドが完全に通るように!

## finiシステム修正
- フィールド差し替え時の自動fini削除(Nyashの明示的哲学に従う)
- スコープ離脱時のみfini実行(meは除外)
- ドキュメント更新で正しいfiniルールを明記

## その他
- CLAUDE.mdにWASMビルド方法を追記(wasm-pack build --target web)
- 開発サーバー起動方法を記載(python3 -m http.server 8010)
- cargo testで全テスト成功を確認

これでNyashがブラウザで動作可能に!🐱

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-20 07:33:18 +09:00
parent 83d3914e46
commit 670615d1de
18 changed files with 209 additions and 78 deletions

View File

@ -66,38 +66,14 @@ use web_sys::{
#[derive(Debug, Clone)]
pub struct AudioBox {
base: BoxBase,
#[cfg(target_arch = "wasm32")]
context: Option<AudioContext>,
#[cfg(target_arch = "wasm32")]
gain_node: Option<GainNode>,
#[cfg(target_arch = "wasm32")]
analyser_node: Option<AnalyserNode>,
volume: f64,
is_playing: bool,
}
impl AudioBox {
pub fn new() -> Self {
#[cfg(target_arch = "wasm32")]
let context = AudioContext::new().ok();
#[cfg(target_arch = "wasm32")]
let (gain_node, analyser_node) = if let Some(ctx) = &context {
let gain = ctx.create_gain().ok();
let analyser = ctx.create_analyser().ok();
(gain, analyser)
} else {
(None, None)
};
Self {
base: BoxBase::new(),
#[cfg(target_arch = "wasm32")]
context,
#[cfg(target_arch = "wasm32")]
gain_node,
#[cfg(target_arch = "wasm32")]
analyser_node,
volume: 1.0,
is_playing: false,
}