每周收集和 Elixir 相关的文章和讯息. 有任何对文章的补充和错误之处欢迎邮件指出: zengzhilgATgmail.com

Introducing Temple: An Elegant HTML Library for Elixir and Phoenix

Temple 是一个基于 macro 的 DSL 语言, 通过它我们可以方便的在 Elixir 代码中直接组织 html 结构. 同时它也支持类似 react ui 组件样式的结构. 如果你喜欢这样的方式, 还可以使用 Temple 作为默认的模板引擎.

Elixir GenServer Memory Issues

Nuno Marinho 实验了两种方式用以解决使用 GenServer 时遇到的内存溢出问题. 两种方案分别为

  1. 使用 GenServer.start_link(callback_module, spawn_opt: [fullsweep_after: desired_value])
  2. 返回结果中使用 {:reply, reply, new_state, :hibernate} 让 GenServer 休眠
    作者比较了两种方案的内存变化情况.

Slimming down fat Channels in Phoenix

Jorge Bejar 项目中的 Channel 模块内容有点臃肿了. 有两个问题, 模块中函数可以归类到几个步骤, 各个函数功能比较雷同. Jorge 做的第一件事就是将模块拆分出来, 然后使用 macro 将重复的函数通过 DSL 的方式组织起来. 这是一篇比较通用的文章, 并不局限于 channel.

Understanding Elixir’s Strange Module Names

Starr Horne 发现了 elixir 中模块名的奥秘. 可能你已经发现过, 在 IEx 中随便写一个不存在的模块名都不会报错, 其实定义一个模块名就相当于创建一个新的 Atom, 也就是说 MyCoolModule = :"Elixir.MyCoolModule" 是等价. 既然如此我们就可以直接使用 “atom” 的方法了, 假设 MyCoolModule 有 call 方法, 那么 :"Elixir.MyCoolModule.call/1" 也是可以的.

Why Go for Redis when You Can Use Mnesia?

Bastien Duplessier 在他们的嗯游戏项目中使用 Elixir 作为后端应用. 作为单台服务没问题, 不过后来根据需求需要加上负载均衡服务, 而且要扩充为多台服务, 原有的 Genserver 保存游戏状态就不够用了. 怎样既保证数据的一致性,又能快速高效存取呢. 作者想到了 erlang 自家的好工具 Mnesia. 这篇好文带领我们进入了 Mnesia 的世界.
PS: 不过最后作者有吐槽 Mnesia 的文档稀少, 网上资料也少的可怜. 所以算是摸着石头过河的范例.

Getting started with Scenic in Elixir — Crafting a simple snake game

我们在往期也介绍过 Scenic 这个 UI 库. Giancarlo França 在这篇教程中事无巨细的带领大家使用 Scenic 做了一个贪吃蛇游戏. 推荐!