我喜欢花时间学习新技术。然而,使用新技术的最大缺点往往是早期采用时不可避免的痛点。我在“ 如何在 2022 年从全栈开发人员转型为 Web3 先驱”中快速了解 Web3 时,经常看到这种情况。
作为软件工程师,我们在试用新技术时习惯于接受这些早期采用者的挑战。对我来说最有效的方法是保留一份我执行过的笔记和命令的列表,因为看似不合逻辑的步骤不会留在我的记忆中。
除了 Web3,我还在 JavaScript 领域发现了这一挑战,它有使用 Node.js 和 Webpack 的半标准要求。我想找到一种解决方案,让我可以按原样使用 JavaScript,而不必费力使用 Node.js 和 Webpack。我最近读到 Rails 7 版本是如何解决这一问题的。所以,这就是我将在本文中介绍的用例。
坦白说,我对 Ruby 和 Ruby on Rails 几乎一无所知。我记得几年前看到有人发出一些命令来创建功能齐全的服务,当时我想,“哇,这看起来很棒。”但我从未花时间尝试过这种方法来构建服务和应用程序。
我很确定我在 2006 年初看过那个演示,因为 Rails 最早是在 2005 年底出现的。就像我在演示中看到的那样,最终结果是一项支持模型-视图-控制器 (MVC) 设计模式的服务,我早期使用 Spring、Struts、JSF 和 Seam 框架时对这种模式很熟悉。
Rails 承诺在遵循 DRY(不要重复自己)实践的同时保持简单。为了兑现这一承诺,Ruby 使用 Gems 帮助工程师将共享依赖项引入他们的项目。
2021 年末,Rails 的第七个主要版本引入了一些令人兴奋的功能:
最后一个特点就是促使我写这篇文章的动力。
从高层次来看, importmaps-rails Gem 允许开发人员将地图导入其应用程序。使用/bin/importmap
允许工程师根据需要更新、固定或取消固定依赖项。这类似于 Maven 和 Gradle 在基于 Java 的项目中的工作方式。
这样就无需处理与捆绑包和转译 ES6 和 Babel 相关的复杂性。再见 Webpack!再见 Node.js!
由于我近二十年来从未接触过 Ruby on Rails,所以我需要做的第一件事就是按照本指南在我的 MacBook Pro 上安装 Ruby 3.3。安装完成后,我只需要将Ruby 插件作为我的 IntelliJ IDEA IDE 的一部分进行安装。
然后,我在 IntelliJ 中创建了一个名为import-map
的新 Ruby on Rails 项目,并指定使用 JavaScript 框架的Importmap
:
创建项目后,我首先想看看使用本地 JavaScript 库有多么容易。因此,我创建了一个名为/public/jvc_utilities.js
的新 JavaScript 文件,其中包含以下内容:
export default function() { console.log('*****************'); console.log('* jvc-utilities *'); console.log('* version 0.0.1 *'); console.log('*****************'); }
默认函数只是将一些命令回显到 JavaScript 控制台。
接下来,我创建了一个 HTML 文件( /public/jvc-utilities.html
),其内容如下:
<!DOCTYPE html> <html> <head> <title>jvc-utilities</title> </head> <script type="importmap"> { "imports": { "jvc_utilities": "./jvc_utilities.js"} } </script> <script type="module"> import JvcUtilities from "jvc_utilities"; JvcUtilities(); </script> <h3>jvc-utilities.html</h3> <p>Open the console to see the output of the <code>JvcUtilities()</code> function. </p> </html>
此示例演示了如何将本地 JavaScript 文件与公共 HTML 文件一起使用——无需任何额外的工作。
接下来,我创建了一个名为Example
新控制器:
bin/rails generate controller Example index
我想在这个例子中使用Lodash 库,因此我使用以下命令将该库添加到我的import-map
项目中:
bin/importmap pin lodash
为了向控制器添加一些基于 JavaScript 的功能,我更新了javascript/controllers/example_controller.js
使其如下所示:
import { Controller } from "@hotwired/stimulus" import _ from "lodash" export default class extends Controller { connect() { const array = [1, 2, 3] const doubled = _.map(array, n => n * 2) console.log('array', array) // Output: [1, 2, 3] console.log('doubled', doubled) // Output: [2, 4, 6] this.element.textContent = `array=${array} doubled=${doubled.join(', ')}` } }
此逻辑建立一个包含三个值的数组,然后将值加倍。我使用 Lodash map()
方法来执行此操作。
最后,我更新了views/example/index.html.erb
以包含以下内容:
<h3>Example Controller</h3> <div data-controller="example"></div>
此时,以下 URI 可用:
/jvc-utilities.html
/example/index
与其在本地运行 Rails 服务,我考虑使用 Heroku。这样,我可以确保其他用户可以访问我的服务。
使用我的 Heroku 帐户,我按照“使用 Ruby 开始使用 Heroku ”指南进行操作。根据我的项目,我的第一步是添加一个名为Procfile
的文件,其内容如下:
web: bundle exec puma -C config/puma.rb
接下来,我使用 Heroku CLI 在 Heroku 中创建一个新的应用程序:
heroku login heroku create
使用create
命令,我启动并运行了以下应用程序:
Creating app... done, ⬢ lit-basin-84681 https://lit-basin-84681-3f5a7507b174.herokuapp.com/ | https://git.heroku.com/lit-basin-84681.git
此步骤还创建了 Heroku 生态系统使用的 Git 远程。
现在,我需要做的就是将最新更新推送到 Heroku 并部署应用程序:
git push heroku main
这样,我的代码就被推送到 Heroku,然后 Heroku 编译并部署了我的应用程序。不到一分钟,我就看到了下面的内容,让我知道我的应用程序已经可以使用了:
remote: Verifying deploy... done. To https://git.heroku.com/lit-basin-84681.git fe0b7ad..1a21bdd main -> main
然后,我使用我的 Heroku URL(该 URL 对我的应用程序来说是唯一的,但我已将其删除)导航到/example/index
页面: https://lit-basin-84681-3f5a7507b174.herokuapp.com/example/index
://lit-basin-84681-3f5a7507b174.herokuapp.com/example/index
这是我所看到的:
当我在浏览器中查看 JavaScript 控制台时,出现了以下日志:
导航到/jvc-utilities.html
,我看到以下信息:
当我在浏览器中查看 JavaScript 控制台时,我看到了以下日志:
成功了。我能够在我的 Rails 7 应用程序中使用一个独立的 JavaScript 库以及公共的 Lodash JavaScript 库 — 所有这些都通过使用 Import Maps 来实现,而无需处理 Webpack 或 Node.js。再见,Webpack 和 Node.js!
我的读者可能还记得我的个人使命宣言,我觉得它适用于任何 IT 专业人士:
“将时间集中在提供能够扩展知识产权价值的功能上。其他一切都可以利用框架、产品和服务。” — J. Vester
在本文中,我深入研究了 Rails 7,并使用 Import Maps 展示了如何轻松使用 JavaScript 库,而无需额外使用 Webpack 和 Node.js。尽管距离我上次看到 Rails 的实际应用已经过去了二十多年,但我对完成目标所需的时间之短感到非常惊讶。
从部署角度来看,将 Rails 应用程序部署到 Heroku 平台的工作包括创建Procfile
和三个 CLI 命令。
在这两种情况下,Rails 和 Heroku 都遵循我的使命宣言,让我能够专注于为客户提供价值,而不会被 Webpack、Node.js 甚至 DevOps 任务的挑战所困扰。
虽然我确信在探索新技术时我们将继续面临不那么理想的痛点,但我也相信,随着时间的推移,我们将看到类似我在本文中所展示的成就。
与往常一样,我的源代码可以在 GitLab上找到。
祝您度过愉快的一天!