You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 7中如何用esbuild打包js.erb文件并读取Stripe公钥?

用esbuild处理Rails中的.js.erb文件并注入Stripe凭据

esbuild本身不支持解析ERB模板,直接用原命令打包.js.erb文件无法替换其中的Rails凭据变量,你之前尝试的Sprockets mime类型配置无效——因为当前是用esbuild而非Sprockets处理JS资源,两者的配置互不影响。

下面提供两种可行方案:

方案一:预编译ERB模板后再打包

通过Ruby脚本先渲染.js.erb文件为纯JS,再交给esbuild处理:

  1. 创建Rake任务处理ERB预编译
    在lib/tasks/esbuild_erb.rake中添加以下内容:
namespace :esbuild do
  desc "预编译JS.erb文件并执行esbuild打包"
  task :build do
    # 遍历所有.js.erb文件,渲染为纯JS
    Dir.glob("app/javascript/**/*.js.erb").each do |erb_path|
      js_path = erb_path.sub(".erb", "")
      # 渲染ERB模板,注入Rails上下文
      rendered_content = ERB.new(File.read(erb_path)).result(binding)
      File.write(js_path, rendered_content)
    end

    # 执行原esbuild打包命令
    system("esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds")

    # 可选:删除临时生成的纯JS文件(避免污染源码目录)
    Dir.glob("app/javascript/**/*.js").each do |js_path|
      File.delete(js_path) if File.exist?("#{js_path}.erb")
    end
  end
end
  1. 修改package.json中的build命令:
"build": "rails esbuild:build"

执行npm run build时,会先预编译ERB注入凭据,再完成打包。

方案二:通过环境变量注入凭据(更简洁)

无需处理ERB模板,直接用esbuild的--define选项将Rails凭据作为环境变量注入JS:

  1. 在Rails配置中导出凭据为环境变量
    在config/application.rb或对应环境配置文件(如config/environments/production.rb)中添加:
ENV['STRIPE_PUBLIC_KEY'] = Rails.application.credentials[:stripe][:public]
  1. 修改esbuild命令注入环境变量
    更新package.json的build命令:
"build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --define:process.env.STRIPE_PUBLIC_KEY='\"'$STRIPE_PUBLIC_KEY'\"'"
  1. 修改Stimulus控制器代码
    直接使用注入的环境变量:
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  redirect(event) {
    const stripe = Stripe(process.env.STRIPE_PUBLIC_KEY);
    stripe.redirectToCheckout({...});
  }
}

这种方式跳过了ERB模板处理,更符合esbuild的原生工作流。

内容的提问来源于stack exchange,提问作者BEEK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:42:48