簡體   English   中英

為什么javascript_include_tag參考無效?

[英]Why doesn't javascript_include_tag reference work?

在新的Rails應用中,它將具有以下標記,其中包括javascripts文件夾中的所有js文件:

<%= javascript_include_tag 'application'%>

它還在運行時對這些js文件創建了奇怪的引用:

<script src="/assets/cbpAnimatedHeader.self-2f56b42e64e4cd1aeca79d75fab98d1e72c4ee686ded129c7b6bd100065c0c84.js?body=1"></script>

當我使用上述文件中的頁面上的功能時,出現未找到錯誤。

如果我改為添加此引用,則一切正常:

<script src="assets/cbpAnimatedHeader.js"></script>

為什么javascript_include_tag參考無效?

在開發中,當您向Sprockets清單添加資產時,如下所示:

// app/assets/javascripts/foo.js
//= require bar
//= require baz

並使用Rails資產助手:

 <%= javascript_include_tag "foo" %>

Rails將為foo.js創建一個腳本標簽,為barbaz創建一個腳本標簽。 附加的文件名是摘要-這是一個校驗和,用作高速緩存破壞機制,因此您不必在生產中處理瀏覽器高速緩存問題。

通過使用單個腳本標簽,由於在單個文件中而不是在串聯文件中*獲得行號,因此更容易進行故障排除。

在生產中,您可以在部署之前編譯資產,或者設置執行相同功能的后期提交掛鈎。 后者通常不那么容易發生人為錯誤,並且在git歷史中產生的噪音也更少。

編譯Rails時,會將barbaz連接到foo.js <%= javascript_include_tag "foo" %>使用foo.js創建單個腳本標簽-再次包含摘要作為緩存清除機制。

那么,為什么會出現未定義的錯誤?

這很可能是因為排序不正確-如果腳本具有必須先可用的依賴項,則您不應該依賴//= require_tree . 加載它!

相反,您將執行以下操作:

//= require 'cbpAnimatedHeader'
//= require_tree .

http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets

運行時看起來奇怪的引用

它們是資產文件fingerprints

指紋識別是一種使文件名取決於文件內容的技術。 文件內容更改時,文件名也更改。 對於靜態或不經常更改的內容,這提供了一種簡單的方法來判斷文件的兩個版本是否相同,即使在不同的服務器或部署日期之間也是如此。

這是Rails功能的標准部分-在您預編譯資產並在生產中運行它們時尤其明顯。

-

為什么javascript_include_tag參考無效?

它可能會...

<%= javascript_include_tag 'application'%>

這將調用app/assets/application.js 這不是問題,但這意味着您必須確保已將所有js文件包含在sprockets manifest directives

#app/assets/javascripts/application.js
// ...
//= require jquery
//= require jquery_ujs
//= require_tree .

必須注意,上面的外觀在app/assets/javascripts文件夾中(看來cbpAnimatedHeader.jsapp/assets

考慮到您有app/assets/javascripts/cbpAnimatedHeader.js ,以上代碼應該可以正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM