Rust项目编译为WASM时是否会包含私有函数?
Rust编译WASM对外可见性规则说明
你需要先明确三个完全独立的边界,不要把Rust模块权限、WASM导出权限、WASM二进制内容可读性混为一谈:
- Rust里的
pub关键字是编译阶段Rust内部模块的访问控制规则,只限制Rust代码之间能不能互相引用,和最终编译产物对外暴露什么内容没有直接对应关系 - WASM能被JS直接调用的接口是固定的导出列表,只有你主动标记要导出的内容才会进这个列表,没进列表的内容JS没有直接调用的入口
- 所有被编译链接进最终WASM文件的代码,不管是公开还是私有,都存在于用户下载的WASM二进制里,不存在彻底隐藏的可能,有能力的用户可以通过反编译还原逻辑
具体到你的场景的对应结论
- mod.rs里没有标记
pub、只能被同模块内部调用的私有函数,JS绝对无法直接调用
常规Rust转WASM工具链(比如wasm-bindgen)只会给同时满足两个条件的内容生成JS可调用绑定:一是在Rust层面标记为pub,二是主动加了导出标记(比如#[wasm_bindgen])。你说的私有函数首先在Rust模块体系里就不对lib.rs可见,根本不可能被自动导出,JS侧拿不到它的调用地址。
哪怕是mod.rs里标记了pub的函数,只要你没加导出标记,JS一样调不了,只能在WASM内部的Rust逻辑里被调用。 - 不存在"站点运行需要就把整个mod.rs内容公开给JS"的机制
WASM的导出列表是编译时就固定死的,运行时JS只能调用列表里的函数,内部依赖的非导出逻辑只会在WASM内部被调用,不会暴露直接调用入口。比如你lib.rs调用mod.rs的公开函数A,A内部调用同模块私有函数B,运行时JS调A的时候WASM会自动执行B的逻辑,但JS没法跳过A直接传参调用B。 - 不要指望靠私有权限隐藏敏感逻辑
只要是打进WASM包的代码——不管是pub还是私有,不管是导出还是没导出——用户下载到WASM文件之后,都可以用反编译工具还原出接近源码的实现逻辑,甚至可以直接修改WASM指令改运行逻辑。涉及密钥校验、付费判断这类敏感逻辑绝对不要放在前端WASM里,必须放到服务端实现。
内容的提问来源于stack exchange,提问作者rewfsdv
相关产品推荐
相关产品推荐

