笔者在跟随
Rust
重写一切的风气下 基于Rust
实现了 napi-nanoid在
node
环境下相比原版nanoid.js
性能提升 40+%
跑分: Linux x64 gnu, Intel® Xeon® Platinum 8370C CPU @ 2.80GHz, Node.js 16.15.1 (runs: 6842925183)
目录
挑选技术栈
笔者这里选择了 napi-rs
的作为基础实现 napi-nanoid
;
选择该技术栈的原因有两方面
-
napi-rs
基于Rust
生态,在实现native NAPI
模块时可以更少考虑如C++
中内存申请释放的负担。 -
napi-rs
的官方文档非常完整,提供了多个优秀的实践示例。
官网: napi.rs
创建 napi-rs
工程
基于 napi-rs/package-template
.
├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── README.md
├── __test__ // 单元测试
├── benchmark // 性能测试
├── build.rs
├── index.d.ts
├── index.js
├── npm // 多平台入口
├── package.json
├── rustfmt.toml
├── src // source
├── tsconfig.json
└── yarn.lock
基于 Rust 实现 nanoid 生成逻辑
实现调用方法入口
调用方法设计了 .nanoid()
和 .non_secure()
高安全和非安全两个方法;
这里两个方法的设计参考了 nanoid.js
#[napi]
pub fn nanoid() -> String {
format(nanoid::rngs::default, &nanoid::alphabet::SAFE, 21)
}
#[napi]
pub fn non_secure() -> String {
format(nanoid::rngs::non_secure, &nanoid::alphabet::SAFE, 21)
}
实现最核心的 format
逻辑
实现过程中用到了宏来提供随机数生成的缓冲区;这里的实现思路也是参考了 nanoid.js