首页 web前端 js教程 Nobuild 与 Rails 和 Importmap

Nobuild 与 Rails 和 Importmap

Dec 26, 2024 am 03:53 AM

最新版本的 Ruby on Rails 重点关注框架不同方面的简单性,并承诺回归“单人框架”(单个开发人员可以有效地构建和维护整个应用程序)。

Importmap Rails 库基于现代 Web 浏览器已经赶上 ECMAScript 规范并可以解释 ES 模块(ESM)的原理。作为一项 Web 标准,Importmap 允许您控制 JavaScript 模块在浏览器中的解析方式并管理依赖项和版本,而无需转译或捆绑发送到浏览器的代码。

Importmap Web 标准的工作原理

这一切都始于应用程序主布局或网页中定义的 importmap 类型的脚本标签。在此标签内,一个 JSON 对象定义了别名及其对应的源代码路径。

<script type="importmap">
  {
    "imports": {
      "application": "/assets/application.js",
      "local-time": "https://cdn.jsdelivr.net/npm/local-time@3.0.2/app/assets/javascripts/local-time.es2017-esm.min.js",
      "utils": "/assets/utils.js"
    }
  }
</script>

登录后复制
登录后复制
登录后复制

在同一个地图中,您可以混合指向 CDN 或使用本地资源的库路径。要使用此地图中的库,请引用别名。

<!-- Below the importmap script -->
<script type="module">import "application"</script>

登录后复制
登录后复制
登录后复制

并在您的application.js中,导入所需的依赖项:

// application.js

import LocalTime from "local-time";
LocalTime.start();

import "utils";

登录后复制
登录后复制
登录后复制

浏览器 Chrome 89 、 Safari 16.4 、 Firefox 108 和 Edge 89 均支持导入地图。对于较旧的浏览器,请包含一个polyfill:

<script
  async
  src="https://ga.jspm.io/npm:es-module-shims@1.10.1/dist/es-module-shims.js"
></script>

登录后复制
登录后复制
登录后复制

Importmap 在 Ruby on Rails 中的工作原理

Ruby on Rails 中的导入映射功能遵循上述相同标准,并提供了一种创建映射和版本文件的简单方法。使用名为 heroImage 的 Web 应用程序作为示例(源代码可在 Github 上获取),让我们探索一下实现。

Nobuild with Rails and Importmap

当您创建新的 Rails 8 应用程序时,默认情况下会添加并安装 importmap-rails gem。将创建一个文件config/importmap.rb,您可以在其中固定应用程序中所需的JavaScript代码。

pin "application"

pin "@hotwired/turbo-rails", to: "turbo.min.js"
pin "@hotwired/stimulus", to: "stimulus.min.js"
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"

pin_all_from "app/javascript/controllers", under: "controllers", preload: false

登录后复制
登录后复制
登录后复制

pin 关键字最多需要三个参数。第一个是必需的,因为它是 JavaScript 代码的别名。 pin“application”是文件 application.js 的快捷方式,别名为 application:

pin "application", to: "application.js"

登录后复制
登录后复制

当别名和文件名不同时,使用关键字::

pin "@hotwired/turbo-rails", to: "turbo.min.js"

登录后复制

pin_all_from 关键字有助于一次引用多个文件。第一个参数是 JavaScript 文件所在的路径,under: 参数是每个文件的别名的前缀。生成的别名使用下的前缀和文件名,例如alert_controller.js文件的controllers/alert-controller。

要可视化 Importmap JSON 文件,请执行:

<script type="importmap">
  {
    "imports": {
      "application": "/assets/application.js",
      "local-time": "https://cdn.jsdelivr.net/npm/local-time@3.0.2/app/assets/javascripts/local-time.es2017-esm.min.js",
      "utils": "/assets/utils.js"
    }
  }
</script>

登录后复制
登录后复制
登录后复制

Rails 通过 Propshaft gem 解析所有 JavaScript,它解析 JavaScript 代码的物理路径,映射到 /assets Web 路径,并将摘要添加到每个文件中,以实现更好的缓存和失效。

Propshaft 从资产配置中发现物理路径:

<!-- Below the importmap script -->
<script type="module">import "application"</script>

登录后复制
登录后复制
登录后复制

确保您的文件存在于任何已注册的路径中,或添加您自己的路径以供 Propshaft 和 Importmap 发现。

Rails 中的 Importmap 允许您指定浏览器应如何加载 JavaScript 文件。有两个选项:预加载(默认)和无预加载。预加载告诉浏览器尽快下载文件。 Importmap 生成一个带有 rel="modulepreload":
的链接标签

// application.js

import LocalTime from "local-time";
LocalTime.start();

import "utils";

登录后复制
登录后复制
登录后复制

如果将 preload 参数设置为 false,则不会生成链接标签,浏览器会在需要时下载文件。

使用 Rails 的 Importmap,您还可以使用 URL 的 to: 参数固定 CDN 中的 JavaScript 代码:

<script
  async
  src="https://ga.jspm.io/npm:es-module-shims@1.10.1/dist/es-module-shims.js"
></script>

登录后复制
登录后复制
登录后复制

Importmap 包含一个 CLI,用于将固定取消固定 JavaScript 代码到config/importmap.rb 文件中。它还包括更新、审核和检查版本的命令:

pin "application"

pin "@hotwired/turbo-rails", to: "turbo.min.js"
pin "@hotwired/stimulus", to: "stimulus.min.js"
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"

pin_all_from "app/javascript/controllers", under: "controllers", preload: false

登录后复制
登录后复制
登录后复制

当对 JavaScript 包使用 pin 命令时,Importmap 不会将 to: 参数设置为 CDN,而是解析包依赖项并将包和依赖项下载到 vendor/javascript ,允许 Rails 应用程序提供这些文件:

pin "application", to: "application.js"

登录后复制
登录后复制

当您的包在 JavaScript 包中具有简单的依赖项或定义良好的依赖项时,此方法效果很好。如果情况并非如此,则使用 Importmap 在 vendor/javascript 供应代码会变得具有挑战性。它可能与 URL 和手动依赖项添加一起使用,或者您可以调整供应商的代码以使其工作。

如何使用 Rails Gems - 引擎 - 和 Importmap?

有两种方法可以创建与 Importmap 兼容的 Ruby on Rails gem。第一种方法允许您的 gem 提供 JavaScript 代码,您可以选择将其固定在 Importmap 配置中。这就是 turbo-railsstimulus-rails gem 的实现方式。

将 JavaScript 代码放入 gem 的 app/assets/javascripts 文件夹中。您可能需要一个额外的过程来缩小 JavaScript 文件并生成 JavaScript 映射文件。然后,在 Engine 类中,定义一个初始化器钩子以使用 Propshaft 声明 JavaScript 代码:

<script type="importmap">
  {
    "imports": {
      "application": "/assets/application.js",
      "local-time": "https://cdn.jsdelivr.net/npm/local-time@3.0.2/app/assets/javascripts/local-time.es2017-esm.min.js",
      "utils": "/assets/utils.js"
    }
  }
</script>

登录后复制
登录后复制
登录后复制

第二个选项使用 Importmap 配置文件。如果您的引擎有其布局模板,并且视图与主机应用程序隔离,并且引擎不需要与主机应用程序共享 JavaScript 代码,您可以在 config/importmap.rb 创建一个 Importmap 配置文件,设置引脚,将 JavaScript 代码放置在 app/javascript,并使用初始值设定项配置引擎。

打开您的engine.rb Ruby 文件并添加Importmap 配置文件和扫描器:

<!-- Below the importmap script -->
<script type="module">import "application"</script>

登录后复制
登录后复制
登录后复制

指定要在引擎布局模板中使用的导入映射:

// application.js

import LocalTime from "local-time";
LocalTime.start();

import "utils";

登录后复制
登录后复制
登录后复制

要与主机应用程序共享 JavaScript 代码(例如 Stimulus 控制器),请创建部分 Importmap 配置文件并将引擎设置为将其与主机应用程序中的主文件合并。

config/importmap.rb 创建一个 Importmap 配置文件,并添加 JavaScript 引脚以与主机应用程序共享。如果您有外部包的依赖项,请通过生成器或安装程序将它们添加到主机应用程序:

<script
  async
  src="https://ga.jspm.io/npm:es-module-shims@1.10.1/dist/es-module-shims.js"
></script>

登录后复制
登录后复制
登录后复制

打开你的engine.rb 文件并添加一个初始化器:

pin "application"

pin "@hotwired/turbo-rails", to: "turbo.min.js"
pin "@hotwired/stimulus", to: "stimulus.min.js"
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"

pin_all_from "app/javascript/controllers", under: "controllers", preload: false

登录后复制
登录后复制
登录后复制

使用 Importmap 有什么优点?

从 Ruby on Rails 开发人员的角度来看,使用 Importmap 的主要优点是不需要类似 JavaScript 运行时的节点,并且不受 node_modules 依赖关系。

此外,您不需要在开发模式下进行额外的过程来转译和缩小 JavaScript 代码。您依靠 Web 标准将代码提供给浏览器。在反向代理后面部署 Rails 应用程序有几个好处。首先,如果您启用 HTTP/2 协议,您的浏览器可以通过单个 HTTP 连接获取多个文件,并且下载许多小 JavaScript 文件不会影响性能。

Nobuild with Rails and Importmap

启用代理使用 gzip 或 brotli 压缩可确保您发送非常小的文件,同时在使用浏览器开发人员工具时保持可读性。如果更改一个文件,只需使浏览器下载的该特定文件失效即可。由于 Propshaft 添加到所有文件的指纹,浏览器知道文件已被修改。

使用像 Thruster 这样的反向代理以及 Puma 可以卸载 Rails 应用程序提供的资源。 Thruster 可以缓存资源并在客户端请求文件时提供它们。

何时不使用导入映射

在某些情况下,您应该避免在 Rails 应用程序中使用 Importmap。如果您正在使用 React、Vue 或任何其他类似工具构建 SPA 应用程序,那么您很可能正在使用 TypeScript 编写代码。在这种情况下,您应该坚持捆绑策略。

此外,如果您需要支持较旧的浏览器,与代码转译捆绑在一起是更好的选择。

以上是Nobuild 与 Rails 和 Importmap的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

前端开发中如何实现类似 VSCode 的面板拖拽调整功能? 前端开发中如何实现类似 VSCode 的面板拖拽调整功能? Apr 04, 2025 pm 02:06 PM

探索前端中类似VSCode的面板拖拽调整功能的实现在前端开发中,如何实现类似于VSCode...

See all articles