首頁 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)

熱門話題

Java教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1231
24
神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

See all articles