简介
什么是 remux?
remux 是一个非常方便的RPC库/框架,可以将本地函数和远程函数写在同一个文件中,通过@remux
标记进行区分。
下面是一个基本示例,也可以打开stackblitz进行体验:
// @remux server
function serverFunction() {
console.log('Ouch!')
}
// @remux browser
{
// put browser code here
const btn = document.createElement('button')
btn.innerText = 'Hit me'
btn.addEventListener('click', () => serverFunction())
document.body.appendChild(btn)
}
上面的示例中,@remux browser
部分的代码创建了一个按钮,并将点击事件注册为一个调用serverFunction
的闭包,当用户点击按钮时,服务器会打印一行Ouch!
。
这个示例展示了remux的两个核心功能,无缝远程调用和区分多端代码,用@remux
注释的函数会被视为远程函数,而代码块则会被视为只在特定的端运行。至于@remux
后面分别会跟着的server
和browser
,这两个名字是随意起的,remux本身并不太关心开发者起什么名字,只要在编译时传入即可。
实现原理
remux提供了一个babel插件用于转译源码。
它会将所有被@remux
标记的函数封装为对_remuxInvoke
函数的调用,同时也会在源码的开始位置添加一个import { _remuxInvoke } from '@remux/lib'
,当然这里的@remux/lib
可以通过参数改为其他库,只是默认是使用@remux/lib。
此外,对于所有使用@remux
标记的代码块、变量声明和import
语句,如果不是本端的则会被移除。通常并不需要用于标记变量声明,因为构建时的tree-shaking会确保没有使用的变量会被移除,所以如果存在一些服务器的密钥等敏感信息,请确保构建时打开了tree-shaking,不然就加标记来确保客户端代码中不会包含敏感信息。