Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rustでオリジナルnpmパッケージを作ってみよう

Tomoya Kashifuku
September 20, 2024
130

 Rustでオリジナルnpmパッケージを作ってみよう

昨今、BiomeなどのRust製npmパッケージが話題になっています。Rust製のnpmパッケージを作ると異なるプラットフォームで利用できるようにコンパイルしてバイナリを生成したり、そのバイナリを利用者に提供したり、JavaScriptだけで実装するときにはなかった手間が必要です。このセッションでは、Rust製のnpmパッケージを作成するときに考えたことを紹介します。このセッションを聞いて、npmパッケージを作成するときにRustを使う選択肢を持ってもらえると嬉しいです。

このスライドは Money Forward Tech Day '24 で発表した LT に利用したものアップロードしています。

Tomoya Kashifuku

September 20, 2024
Tweet

Transcript

  1. • 2023.04〜
 クラウド経費フロントエンドエンジニア@福岡Frontend Engineer working for Cloud Expense at Fukuoka

    Office
 • 𝕏 @cashfooooou
 • GitHub: @tnyo43
 樫福智哉 Tomoya KASHIFUKU
  2. Biome, SWC, Turborepo のように、 Rust で実装された npm パッケージが活躍
 • パフォーマンス


    • 拡張性( JS に移植しなおさなくてよい)
 
 npm packages implemented with Rust, such as Biome, SWC, and Turborepo, are thriving
 • Performance
 • Scalability (no need to port back to JS)
 
 はじめに Introduction
  3. Rust で多言語対応するプロダクトで使える npm パッケージ“i18n-locale-lint” (翻訳 ファイルのセットのキーが正しいことをチェックする) を自作
 JS 製の npm

    パッケージとの違いとその解決方法をシェア
 
 Created an npm package 'i18n-locale-lint' for multilingual products with Rust
 Sharing the differences from JS-based npm packages and how to resolve them
 Rust で npm パッケージを自作してみた I created an npm package with Rust
  4. • 環境ごとにビルドする
 • クライアントが環境にあったバイナリをダウンロードする仕組みを作る
 
 • Builds for each environment


    • Creates a mechanism for clients to download the appropriate binary for their environment
 JS 製の npm パッケージ作成との違い Differences from JS-based npm packages
  5. 環境(OS, CPUアーキテクチャ)ごとにビルドしてバイナリを生成
 GitHub Actions で環境ごとのビルドジョブを走らせて実現
 
 Builds and generates binaries

    for each environment (OS, CPU architecture)
 Achieve this by running build jobs for each environment using GitHub Actions
 
 環境ごとにビルドする Build for each environment
  6. postinstall を使ってダウンロードする
 • GitHub の Release の Assets にアップロード
 •

    postinstall で環境にあうものをダウンロード
 
 Download using “postinstall”
 • Upload to the GitHub Release Assets
 • Download the appropriate one for the environment by “postinstall”
 
 クライアントの環境にあうバイナリをダウンロード Download the binary that matches the client's environment
  7. • npm install を実行しすぎると GitHub API の rate limit に引っかかる


    ◦ CI で同一 IP から短時間で大量にリクエストする
 • セキュリティの観点で postinstall 自体を避けたい
 
 • Running “npm install” too frequently can hit the GitHub API rate limit
 ◦ Making a large number of requests from the same IP in a short period in CI
 • From a security perspective, it's preferable to avoid postinstall itself
 postinstall を使ってダウンロードする方法の問題 Issues when downloading using postinstall
  8. Biome や SWC で活用されている方法
 環境ごとのバイナリを含む npm パッケージを作成
 
 optionalDependencies を使う方法

    Download using optionalDependencies 
 
 
 Method used by Biome and SWC 
 Create npm packages that include binaries for each environment

  9. 全て環境のパッケージをメインのパッケージの optionalDependencies に列挙
 クライアントの環境に合うものだけがインストールさ れる
 
 List packages for all

    environments in the main package's “optionalDependencies”
 Only the one that matches the client's environment will be installed
 optionalDependencies を使う方法 Download using optionalDependencies
  10. まとめ Summary Rust 製の npm パッケージに必要なステップは
 • 環境ごとにビルドし npm パッケージを作成する


    • 環境にあうバイナリを optionalDependencies でインストールさせる
 
 Steps required for creating an npm package in Rust:
 • Build for each environment and create npm packages
 • Use “optionalDependencies” to install the binary that matches the environment