如何在 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 包?的主要内容,如果未能解决你的问题,请参考以下文章