【问题标题】:How to use npm packages in rails?如何在 Rails 中使用 npm 包?
【发布时间】:2016-08-04 19:21:44
【问题描述】:

我正在尝试在我的 Ruby on Rails 应用程序中使用 Ace editor,其中大部分视图由 React 组件组成。我正在使用react-rails gem,我根本没有使用助焊剂。

我找到了这个react-ace 包,但是我必须使用 npm 来安装它。我已经能够让 bower 组件与 bower-rails gem 一起工作,但从来没有让 npm 包工作。有没有办法通过资产管道(通过供应商)使用它?

顺便说一句,我没有使用 browserify 或 ES6,所以我什至没有 import。到目前为止,我一直在通过资产管道做所有事情。

谢谢!

【问题讨论】:

  • 你可以看看 browserify-rails gem

标签: ruby-on-rails reactjs npm ace-editor react-rails


【解决方案1】:

要使用资产管道在 Rails 项目中包含 npm 包,请执行以下操作:

  1. 初始化你的 package.json:npm init

  2. node_modules 添加到您的资产路径:

# config/application.rb
module YourApp
 class Application < Rails::Application
   config.assets.paths << Rails.root.join('node_modules')
 end
end

  1. 通过添加初始化程序确保npm install 在启动时运行:
# config/initializers/npm.rb
system 'npm install' if Rails.env.development? || Rails.env.test?
  1. 安装你的包:npm install YourPackage

  2. app/assets/javascripts/application.js链接到您的包:

//= require /Path/To/YourPackage

【讨论】:

  • 感谢@Gerard,但我在该目录中没有 npm.rb 我们需要手动创建它吗?
  • 这里我想补充的重要一点是:在/app/assets/javascripts/application.js 中将node_modules 添加到config.assets.paths 之后,您需要以正确的方式包含文件。例如为了在我的 Rails 应用程序中包含 riotjs,我尝试了//=require riot,但遇到了错误ActionView::Template::Error couldn't find file 'riot' in paths registered,其中包括node_modules 文件夹。然后我搜索了如何使它工作并最终在下面的帖子stackoverflow.com/a/47808273/936494 基础上将我添加的条目更改为//= require riot/riot 并且它起作用了。
  • @NeriusJok 是的,你愿意
  • @GerardSimpson,第三步是开发和测试环境,为什么我们在这里跳过 prod env?它们会在产品构建期间自动安装吗?
  • @Art713 生产构建应该是确定性和可重现的。使用 npm install 将从网络中获取 JS 资产,如果包不可用或已更新,这可能会导致损坏。对于生产,您应该在部署中捆绑 JS 资产。
【解决方案2】:

Rails 5.1 支持包含使用 Yarn 的 npm 包。

例如,假设我们要使用 moment.js 库。我们首先需要使用 Yarn 安装库:

yarn add moment

我们可以看到 package.json 被更新了:

{
  "name": "yarn_test",
  "private": true,
  "dependencies": {
    "moment": "^2.18.1"
  }
}

最后我们需要将新包包含到 application.js 中:

//= require moment/moment

Rails 5.1 and forward - Part 1: Yarn on Rails

【讨论】:

    【解决方案3】:

    简短的回答是,ACE 编辑器是为在 Node.js 而不是 Rails 中运行而构建的,因此没有简单的方法可以做到这一点。请记住,大多数 npm 包旨在用作在 Node.js 环境中运行的服务器端 javascript,并且不能直接在 Ruby 中运行。我相信 Ace Editor 需要一个 Node.js 后端,我怀疑让它在 Rails 后端运行是微不足道的。

    当然,在浏览器中运行的任何 javascript 都可以集成到 Rails 资产管道中。为此,我建议查看 Bower,它是最常用的包管理系统 (http://bower.io)。您可以直接在 Rails 应用程序中安装,但我建议您查看 Bower rails 以更好地与 Rails 约定和资产管道 https://github.com/rharriso/bower-rails 集成。

    如果您想尝试将平台无关的 javascript 移植到浏览器,您可以查看 browserify,它使用 Node.js 使用的 CommonJS require 格式简单地链接 javascript 文件。但是,它不会神奇地使 Express 或 ACE Editor 等服务器端 JavaScript 框架仅在浏览器中工作。

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 2017-06-14
      • 2015-03-23
      • 2016-08-01
      • 1970-01-01
      • 2018-04-20
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多