如何在 Rails 中使用 npm 包?

Posted

技术标签:

【中文标题】如何在 Rails 中使用 npm 包?【英文标题】:How to use npm packages in rails? 【发布时间】: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 【参考方案1】:

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

    初始化你的 package.json:npm init

    node_modules 添加到您的资产路径:

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

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

    安装你的包:npm install YourPackage

    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 文件夹。然后我搜索了如何使它工作并最终在下面的帖子***.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 框架仅在浏览器中工作。

【讨论】:

以上是关于如何在 Rails 中使用 npm 包?的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应组件中使用npm包javascript

如何在 laravel 应用程序中使用 npm 安装包?

在react typescript项目中如何使用没有@type定义的npm包

如何发布一个npm包?

如何在 npm 脚本中获取包版本和日期?

如何在 HTML 中将 NPM 包用作普通的 javascript