[英]How robust is online sourcing of js scripts, and best practices
我來自R
背景,我開始學習一些javascript
用於數據可視化目的(想想leaflet
, d3
, chart
,...)。
許多教程和模板都建議加載包、CSS 甚至直接來自在線資源的數據,我試圖解決這個問題。 例如https://leafletjs.com/examples/quick-start/推薦:
在為 map 編寫任何代碼之前,您需要在頁面上執行以下准備步驟:
Include Leaflet CSS file in the head section of your document: <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==" crossorigin=""/> Include Leaflet JavaScript file after Leaflet's CSS: <:-- Make sure you put this AFTER Leaflet's CSS --> <script src="https.//unpkg.com/leaflet@1.7.1/dist/leaflet.js" integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==" crossorigin=""></script>
這並不是說您也不能在R
中做那樣的事情。 但是,來自“ R
文化”,我已經習慣了我擁有每個 package 和我的代碼所依賴的數據的本地“硬拷貝”的感覺。 然后,當我發布我的代碼時(例如,當我發布一個Shiny
應用程序時),所有必需的依賴項都會立即發布,因此它可以獨立運行。 我了解服務器存儲空間方面的缺點,但我的感覺是這可能會更快且更不可靠。
我想知道我在javascript
中對在線采購及其權衡的理解是否正確,如果是這樣,解決潛在缺點的最佳做法是什么。 尤其:
https://unpkg.com/leaflet@1.7.1/dist/leaflet.js
或https://unpkg.com/leaflet@1.7.1/dist/leaflet.css
這樣的依賴項每次都會重新加載我刷新頁面?https://unpkg.com/leaflet@1.7.1/dist/leaflet.js
而不是在本地獲取它們? 甚至,是否還有另一種最佳實踐,例如使用“更安全的提供程序”作為依賴項的來源(我是否正確理解這是https://www.jsdelivr.com/ 等服務的作用? )?我是否正確理解像https://unpkg.com/leaflet@1.7.1/dist/leaflet.js或https://unpkg.com/leaflet@1.7.1/dist/leaflet.css這樣的依賴項每次都會重新加載我刷新頁面?
HTTP號客戶端執行緩存。
因此,該頁面依賴於那些沒有中斷的鏈接,對嗎?
是的。 (其中“破壞”包括“被防火牆阻止”(對於中國用戶來說是一個特殊問題,他們經常發現他們可以訪問網站但 JS 不起作用,因為它托管在被防火牆阻止的地方)和“ CDN 服務器被惡意接管”)
人們只是生活在鏈接中斷的風險中嗎?
是的。 風險是相對的。 通常會選擇 CDN,因為提供商值得信賴。
潛在的好處包括通過使用 邊緣服務器的 CDN 更快地訪問 JS,以及(至少對於流行的庫)客戶端可能已經緩存了數據,因為另一個站點使用了相同的庫。
您還使用 CDN 主機的帶寬而不是您自己的帶寬來為 JS 提供服務,這可以節省成本。
我是否正確理解像
https://unpkg.com/leaflet@1.7.1/dist/leaflet.js
或https://unpkg.com/leaflet@1.7.1/dist/leaflet.css
這樣的依賴項每次都會重新加載我刷新頁面?
是和不是。 這里重要的是緩存。 瀏覽器會緩存已經加載的資源。 因此,如果用戶進入頁面並反復點擊刷新,他們只會下載這些資源一次,並且每次重新加載都將使用緩存的版本。 因此,不,它們不會每次都重新加載。
但是,任何時候用戶清除緩存或新用戶進來時他們的緩存中沒有資源,然后文件將被下載。 瀏覽器的緩存過期不是完全可預測的,因為它在很大程度上由用戶控制。 但是,如果用戶今天訪問並在下周使用相同的瀏覽器再次訪問,他們的緩存中可能仍會保留該項目。 然而,如果他們的緩存被刷新,或者他們使用不同的瀏覽器,或者不同的機器,或者訪問的是完全不同的用戶,那么是的——他們會再次加載資源。
因此,該頁面依賴於那些沒有中斷的鏈接,對嗎? 或者是否有一些我不知道的內部機制可以避免這種浪費的重新加載和有風險的依賴?
內部機制是從上面緩存的。 但是,如果資源鏈接因任何原因被刪除,則該頁面將無法使用它。 這可能是因為:
在所有這些情況下,結果都是相似的:如果用戶擁有所需資源的緩存副本,則他們可能可以訪問頁面的全部功能。 否則,他們不能使用它們。 不會執行腳本文件,不會應用樣式表,不會顯示圖像等。
解決這些問題的方法各不相同:
如果沒有,人們是否只能忍受鏈接中斷的風險? 或者最好的做法是保留腳本的本地副本,例如https://unpkg.com/leaflet@1.7.1/dist/leaflet.js而不是在本地獲取它們?
這里基本上有兩種方法。 每個都有自己的優點和缺點。 快速細分是:
您可以接受外部托管的資源。
您可以自己托管資源。
您當然也可以使用混合方法。 托管一些資源,從外部使用其他資源。 取決於您希望對您的應用程序執行什么操作以及您希望保留何種級別的控制權以及您希望付出多少額外的努力和成本。
綜上所述,對於許多小項目來說,選擇哪條路徑並不重要。 如果您只使用少數幾個庫,那么無論您是從 CDN 使用它們還是自己托管它們都無關緊要。 只要選擇了可靠的 CDN 提供商,中斷的可能性就很小。 如果您托管這些資源,它們很可能會占用幾百 KB(如果是的話)。
如果您的項目增長並且您擁有的依賴項列表開始變得越來越大,那么可能是時候進行評估並決定如何托管它們以及如何使用它們了。 這個問題沒有單一的答案,它可能取決於你已經擁有的東西。 也許您的主機空間很小。 或者您按下載的兆字節付費。 在這種情況下,外部托管會更有意義。 或者,也許您自己有一個強大的存儲選項,並且您有信心可以確保應用程序的可用性,在這種情況下,自托管可能更可取
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.