这是一份面向 Rails 教程作者的约束说明,用于判断某项功能或 gem 在浏览器 WASM 环境中是否可行,并指导课程设计。
可用能力:通过 PGLite 完整支持 ActiveRecord 增删改查、查询与作用域、迁移与 schema 管理(rails db:migrate)、控制器与路由、ERB 视图、表单助手与校验、模型关联、脚手架与生成器、Propshaft 资源管线(Importmaps、Stimulus、Turbo)、Rails 控制台,以及基于 has_secure_password 的会话式基础认证。ActionMailer 与 Active Storage 仅部分可用,投递和图像处理为空操作。
硬性限制:无出站网络(socket 相关类不可用,Net::HTTP、open-uri 会报错);无进程派生(system、反引号、exec、fork、Open3 无效);无多线程(Thread.new 实际为 Fiber);无 IO.select(影响 nio4r、Puma、ActionCable);无 chmod/fchmod。后台任务与 WebSocket 均不可用。因此课程不应依赖外部 API、下载文件或并发处理,可改为讲解控制器/模型模式并模拟响应。
Gem 兼容:纯 Ruby 无原生扩展的 gem 可用(如 devise、pagy、pundit、kaminari);部分原生扩展已被打桩(nokogiri、io-console、bcrypt);需网络的 gem(pg、mysql2、redis、sidekiq、puma)不可用。新增 gem 需编辑 ruby-wasm/Gemfile 并运行 bin/build-wasm 重新构建,耗时数分钟;随后用 npm run dev 本地测试。
数据库为 PGLite(浏览器内 PostgreSQL)。标准迁移、种子与关联均可用,但数据不跨页面刷新保留,需在每个课程通过 prepareCommands 中的 ['node scripts/rails.js db:prepare', 'Prepare development database'] 自行准备状态并提供种子数据。首次加载需 15-40 秒(npm install 约 10-30s,WASM 编译与 Rails 启动各 2-5s),建议在课程开头提示加载正常。
集成测试可用 get/post/patch/delete、assert_response、assert_difference 与 fixtures,但依赖 Nokogiri 的 assert_select、css_select、assert_dom 不可用,应改用 response.body 字符串匹配(如增加 assert_text 助手)。需禁用测试并行化,因为没有线程和进程。Ruby 代码只能访问 /workspace 预开放路径。
部分教学操作仅为概念性:bundle install 在 WASM 中是空操作,gem 需预先烘焙进二进制;课程中展示 rails server 即可,frontmatter 的 mainCommand 应使用 node scripts/rails.js server;database.yml 由 wasmify-rails 自动配置为 pglite 适配器。