js給靜態文件添加cdn,js 動態加載js

本文目錄一覽:

create-react-app腳手架項目打包CDN部署

因為react項目多為SPA項目,用於生產部署時,存在首屏響應過慢導致用戶難以忍受等待時間從而流失問題。一般導致首頁響應過慢的原因有很多,網絡問題是其中之一。本文記錄通過七牛雲免費CDN部署react項目。

1.create-react-app創建react項目,並啟動項目。

2.項目打包。

此時如果只是普通部署,不要求體驗效果時,把build文件下的文件拷貝到靜態服務器即可。

接下來考慮如何靜態文件CDN部署。

3.修改webpack文件,打包文件的引用路徑省車過為CDN路徑。

     1. config文件夾下paths.js(修改pathname為cnd的域名)

    2. config文件夾下webpack.config.js 修改output文件名,使用絕對路徑。

修改後重新打包,發現index.html中引入css,js的路徑皆改成cdn路徑。

附加: 上傳打包文件至七牛雲CDN。(upload.js)

如何將大量的HTML中的js和css整體的切換到cdn的服務器上去

方法一:修改html裡面js, css引用鏈接,指向cdn服務器(這些都有規律,直接替換應該可行)

方法二:在服務器做rewrite,將*.js, *.css的訪問301到cdn

方法三:將所有的css, js引用改為xx.php,在xx.php裡面集中處理這些請求,替換鏈接。

建議使用第一種。

把web靜態資源放在cdn上怎麼弄

1. max-age = x (單位秒) 緩存新鮮期.對所有代理有效,包括用戶代理(也就是我們的瀏覽器)

2. s-maxage = x (單位秒) 緩存的新鮮期,僅對緩存代理有效(不包括我們的瀏覽器)

3. no-cache 請求頭中出現這個是告知緩存代理不要拿你的緩存副本來騙我,請你回源. 說白了就是,我的期望是,服務器端直接返回給我一個最新鮮的版本.(對應名詞:端對端重載)

如何將靜態資源緩存在cdn節點上

首先要糾正這個問題,動態內容是沒辦法緩存的。

動態內容需要的是信息的實時交互,如果採用了緩存,會影響正常業務。

舉個例子,國航官網,訂票內容就是動態的,如果這時候將這部分進行緩存,那當用戶訂票的時候,官網顯示剩餘10張票,並且在緩存過期內,會一直顯示10張票。而實際數據庫里已經沒有票了。這時候勢必會影響到客戶體驗。

動態內容的CDN加速其實還是鏈路和協議的優化。

首先,國內ISP複雜,南北互通的問題,會導致訪問速度慢,CDN廠商有覆蓋全國的PBL網絡(可以理解為CDN提供商自己的私有網絡,獨立的ISP),當採用動態加速時,將內容引入CDN供應商的網絡內,再根據分布在全國的CDN節點作為接入和落地口,達到鏈路的最優。

其次,CDN供應商會針對TCP等協議進行優化和調整,使正常的TCP三次握手減少到1次,從而減少計算機與計算機、路由之間的信息傳遞環節,從而達到加速目的。

webpack使用HtmlWebpackPlugin進行cdn配置

在前面的 文章 中我們介紹了cdn的實現原理,現在我們來實現如何在正式開發中使用cdn功能。要使用cdn功能,就需要cdn服務商,我們可以自己搭建,也可以使用一些比較知名的服務商,慶幸的是市面上有不少的免費cdn服務商,如:

其中BootCDN 是 Bootstrap 中文網 支持並維護的前端開源項目免費 CDN 服務,項目資源同步於 cdnjs 倉庫。界面相對比較好看,且支持搜索功能,可以在線測試cdn是否正常,所以下面以 Bootcdn 為例說明。

在前段項目開發中,我們經常使用webpack進行項目搭建, 主要作用有兩個,分別是

在webpack中使用cdn是在打包生成靜態資源的時候做處理,主要原理是使用 html-webpack-plugin 動態插入cdn鏈接。

關於webpack的使用這裡不做過多的介紹,將以vue–cli 2.x生成的默認項目為例做介紹

html-webpack-plugin 是webpack的一個插件,可以動態的創建和編輯html內容,在html中使用 esj語法 可以讀取到配置中的參數,簡化了html文件的構建。

我們這次主要是使用它來動態插入cdn鏈接,如link標籤和script標籤。

在線項目地址

vue-cli 2.x

創建名為 webpack-cdn-demo ,類型為webpack的 vue 項目,如果安裝的vue-cli是3.x版本,命令不太一樣,詳細可看 vue-cli 3 。

安裝依賴

啟動項目

下面簡單介紹一下目錄結構

其中build文件夾中的 webpack.prod.conf.js 是我們主要注意的文件,我們在該文件中動態設置不需要被打包的模塊並構建出合適的鏈接。

在webpack項目中,所引入的第三方資源會被統一打包進vender文件中,我們通過webpack的 externals 屬性可以設置打包時排除該模塊,詳情說明見 外部擴展(externals) 。

在前面的步驟中,我們創建的項目包括vue、vue-router,在正式開發在還會有ui庫,如element-ui,為了方便演示,我們再安裝element-ui和axios兩個模塊,並實現在構建是把這是個模塊以cdn的形式引入。

注意安裝時記得 -S ,它的作用是安裝完後在 package.json 項目文件中插入記錄,後續操作需要讀取已安裝模塊

對於cdn,我們可以自己搭建,也可以使用專業的cdn服務商,這裡使用免費的cdn bootcdn 。選用免費cdn有很多好處,但畢竟有隱患,那就是服務有可能會奔潰。

依次搜索出前面模塊,結果如下

按照規律,得出cdn資源路徑規則為

其他cdn服務商同理

使用cdn其實也就是在webpack熱啟動和打包項目的時候動態插入script和style鏈接 ,為了方便維護,我們通過在 build/utils.js 文件上添加幾個方法,將來在 webpack.dev.conf.js 和 webpack.prod.conf.js 上可以使用。

如果沒有build/utils.js,可以在其他文件上添加,只要在後續步驟中能操作到就行

name 模塊名稱,與package.json同名

scope 模塊作用域命名

js js地址

css css地址

這裡特別注意scope,它是webpack配置的external參數下的信息,比如vue的作用域命名是Vue,vue-router的作用域命名是VueRouter,element-ui的作用域命名是ELEMENT,同理,jq的作用域命名是JQuery, 具體做法是先引入該資源,然後在控制台依次輸入近似的值,一個個匹配 (目前沒找到更好的做法)。

在webpack熱啟動本地調試的時候,我們可以使用cdn。

在 build/webpack.dev.conf.js 中,默認已經引入了 utils.js ,所以可以直接調用相關方法,如果是自定義的文件,記得引入。

我們可以往裡面添加點自定義屬性,方便在index.html中調用。 ,修改如下:

其中 cdnConfig 和 onlyCss 自定義屬性,在html上通過 htmlWebpackPlugin.options 可以讀取到。

更多html-webpack-plugin配置情況官網,這裡暫時不需要更多。

在打包的時候,我們使用cdn,配置和前面dev的差不多,只不過需要做多一步。

注意此處的 externalModules ,後面用到,也就是比dev多的步驟。

加入和dev一樣的兩個配置,不過需要把onlyCss改為 true ,因為我們希望打包時不單單使用css。

webpack配置已經完成,在html-webpack-plugin中已經添加了相關參數,我們再在頁面上可以直接使用,使用語法是 ejs ,和asp.net,jsp,php類似。

通過 % % 和 htmlWebpackPlugin.options 用js遍歷 插入 link標籤和script標籤。

ps: 修改了webpack配置,需要重啟項目才會生效

打包項目

可以看到打包體積大大減小了

頁面上也正確引入了cdn資源。

最後奉上git地址:

比悲傷更悲傷的分割線

原來兩年前已經有人做了一個類型的webpack-cdn-plugin

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/254990.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:14
下一篇 2024-12-15 12:14

相關推薦

  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • QML 動態加載實踐

    探討 QML 框架下動態加載實現的方法和技巧。 一、實現動態加載的方法 QML 支持從 JavaScript 中動態指定需要加載的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常問題的解決

    本文旨在解決vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常的問題,提供完整的代碼示例供參考。 一、分析問題 首先,需了解vue中下載文件的情況。一般情況下,我們…

    編程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • 為什麼用cmd運行Java時需要在文件內打開cmd為中心

    在Java開發中,我們經常會使用cmd在命令行窗口運行程序。然而,有時候我們會發現,在運行Java程序時,需要在文件內打開cmd為中心,這讓很多開發者感到疑惑,那麼,為什麼會出現這…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • Python zipfile解壓文件亂碼處理

    本文主要介紹如何在Python中使用zipfile進行文件解壓的處理,同時詳細討論在解壓文件時可能出現的亂碼問題的各種解決辦法。 一、zipfile解壓文件亂碼問題的根本原因 在P…

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • Python如何導入py文件

    Python是一種開源的高級編程語言,因其易學易用和強大的生態系統而備受青睞。Python的import語句可以幫助用戶將一個模塊中的代碼導入到另一個模塊中,從而實現代碼的重用。本…

    編程 2025-04-29

發表回復

登錄後才能評論