摘要:在上一篇文章記一次基于的項目由開發到部署一中,我們了解到了給我們提供了哪些支持,也了解到了有哪些不足。項目回顧這是一個移動端的應用,使用,,,,基于開發。可以添加到主屏幕,可以斷網條件下正常打開和訪問數據。
在上一篇文章記一次基于react、cra2、typescript的pwa項目由開發到部署(一)中,我們了解到了create-react-app 給我們提供了哪些pwa支持,也了解到了有哪些不足。雖然create-react-app會幫我們自動生成一個service-worker.js 去緩存我們的app shell,但是并沒有提供讓開發者定制service worker的方法,除非我們eject項目,這篇文章繼續往下講,把在這個項目中學到的東西分享給大家。
項目回顧這是一個移動端的pwa應用,使用react,typescript,react-redux,react-router,workbox 基于create-react-app 開發。可以添加到主屏幕,可以斷網條件下正常打開和訪問數據。項目地址:browseExpbyReact
使用typescripttypescript是JavaScript的超級,一方面在typescript中我們可以使用最新的特性,另一方面typescript給我們帶來了類型系統,可以讓我們寫出健壯的代碼,避免一些潛在的運行時錯誤。在create-react-app中使用typescript,官網推薦我們使用的是create-react-app的ts版本,他會幫你配置好typescript的相關配置,并使用react-script-ts代替react-script來驅動項目。但是這個版本的更新會稍稍滯后于原版,而且也不利于我們擴展腳手架的配置,所以這里不推薦使用。我們使用 react-app-rewired 來進行配置。
感謝讀者提醒:October 29, 2018發布的 v2.1.0 利用bebal7 添加了對typescript的支持,現在我們只要運行 create-react-app my-app --typescript 就能夠的到typescript的支持了,可以關注以下網址關注create-react-app 的更新變動create-react-app releasesreact-app-rewired
在create-react-app中修改默認配置有兩種常用的方法,
一種是 eject 項目,eject會把我們的腳手架中的配置暴露出來,然后我們就可以去修改了,但是這是一個不可逆的過程,而且講配置暴露出來也是一個不優雅的做法,所以不推薦。
第二種就是利用 react-app-rewired 去修改我們的配置,他可以讓我們在不eject項目的前提下修改我們的配置。比如配置typescript,我們可以找到對應的插件 react-app-rewire-typescript 進行配置。具體可參考本項目
利用workbox 定制自己的service worker這里到了本文的重點:如何在create-react-app中定制自己的service-worker.js。目前的cra引用了Workbox webpack plugin 代替了先前的 sw-precache-webpack-plugin。我們可以借助 react-app-rewired
去改寫默認的Workbox webpack plugin 配置。主要步驟:
在 react-app-rewired 的配置文件 config.overrides.js 中修改 Workbox webpack plugin的配置
在public文件目錄下建立自己的service-worker配置文件
首先在 config.overrides.js 中配置,替換默認的workbox-webpack-plugin配置:
/* config-overrides.js */ // typescript的配置插件 const rewireTypescript = require("react-app-rewire-typescript"); const workboxPlugin = require("workbox-webpack-plugin") const path = require("path") module.exports = { webpack: function (config, env) { // typescript的配置插件 config = rewireTypescript(config, env); if (env === "production") { // 在 ‘production’ 模式下加入自己的配置 const workboxConfigProd = { swSrc: path.join(__dirname, "public", "cus-service-worker.js"), swDest: "cus-service-worker.js", importWorkboxFrom: "disabled" } // 刪除默認的WorkboxWebpackPlugin配置 config = removePreWorkboxWebpackPluginConfig(config) // 加入我們的配置 config.plugins.push(new workboxPlugin.InjectManifest(workboxConfigProd)) } return config } } // 此函數用來找出 默認配置中的 WorkboxWebpackPlugin, 并把它刪除 function removePreWorkboxWebpackPluginConfig (config) { const preWorkboxPluginIndex = config.plugins.findIndex((element) => { return Object.getPrototypeOf(element).constructor.name === "GenerateSW" }) if (preWorkboxPluginIndex !== -1) { config.plugins.splice(preWorkboxPluginIndex, 1) } return config }
這部分的配置大概意思就是,當環境為生成環境時,找出webpack中關于workbox-webpack-plugin的配置,把它刪掉,然后用自己的配置替代它。
這里解釋一下 removePreWorkboxWebpackPluginConfig 這個函數。我們可以自己用create-react-app新建一個無用的項目,然后eject它,那么我們可以在暴露出來的config文件夾下的 webpack.config.prod.js 中看到關于 workbox-webpack-plugin 的配置
new WorkboxWebpackPlugin.GenerateSW({ clientsClaim: true, exclude: [/.map$/, /asset-manifest.json$/], importWorkboxFrom: "cdn", navigateFallback: publicUrl + "/index.html", navigateFallbackBlacklist: [ // Exclude URLs starting with /_, as they"re likely an API call new RegExp("^/_"), // Exclude URLs containing a dot, as they"re likely a resource in // public/ and not a SPA route new RegExp("/[^/]+.[^/]+$"), ], }),
所以我們可以通過下面這段代碼找到這段配置的位置:
// 對plugins數組調用findIndex方法,找到構造函數的name屬性為‘GenerateSW’的成員 const preWorkboxPluginIndex = config.plugins.findIndex((element) => { return Object.getPrototypeOf(element).constructor.name === "GenerateSW" }) // 刪除這個成員 if (preWorkboxPluginIndex !== -1) { config.plugins.splice(preWorkboxPluginIndex, 1) }
替換掉workbox-webpack-plugin的配置后,根據自己的配置在public目錄下新建cus-service-worker.js文件,這個文件會代替默認生成的service-worker.js文件,我們就可以通過配置cus-service-worker.js來定制自己的pwa配置了,而且cus-service-worker.js 里的內容也是有講究的,以本項目為例:
// 引入workbox全局變量 importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js"); if (workbox) { console.log(`Yay! Workbox is loaded
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98836.html
摘要:配置反向代理我們的項目已經在服務器上的端口運行著,所以我們需要配置一個反向代理,將我們對服務器的訪問反向代理到服務器的。 該篇文章為本系列最后一篇文章,因為最近樓主忙于畢設,所以這也是一篇被鴿了很久很久的文章。該文章主要講的是該項目的部署部分,包括: 如何部署將該項目部署到nginx服務器上。 為它配置證書,讓它運行在https協議上等。 項目回顧 這是一個基于creat-reac...
摘要:前端開發在年依然持續火熱,本文將對熱點事件做一個總結。版的和協議在前端領域,一直獨占鰲頭。年又發布了一個重大的版本更新。主要是配合使用了服務工作線程。而且還提供了供前端開發者接入。快速發布了和在悄悄地跳過之后,在月號正式發布。 譯者按: 老技術日趨成熟,新技術層出不窮。 原文: A recap of front-end development in 2017 譯者: Fundebu...
摘要:年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。自從谷歌提出后,就持續的獲得了業界的關注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應用同等的待遇與權限。但是無論都值得關注。 1.前言 2017悄然過去,2018已經來到。人在進步,技術在發展。2018年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。下面就我個人的判斷進行一個預測判斷,希望能對大家...
摘要:年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。自從谷歌提出后,就持續的獲得了業界的關注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應用同等的待遇與權限。但是無論都值得關注。 1.前言 2017悄然過去,2018已經來到。人在進步,技術在發展。2018年前端有哪些領域,技術值得關注,哪些技術會興起,哪些技術會沒落。下面就我個人的判斷進行一個預測判斷,希望能對大家...
摘要:的另一個核心特性,蘋果表示也正在開發中,按開發進度可能幾個月后就能與我們見面。是基于的本地化數據庫,支持以及瀏覽器環境。 前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎關注【前端之巔】微信公眾號(ID: frontshow),及時獲取前端每周清單。 本期是 2017 年的最后一...
閱讀 3247·2021-09-22 15:58
閱讀 1717·2019-08-30 14:17
閱讀 1716·2019-08-28 18:05
閱讀 1505·2019-08-26 13:33
閱讀 683·2019-08-26 12:20
閱讀 606·2019-08-26 12:18
閱讀 3192·2019-08-26 11:59
閱讀 1401·2019-08-26 10:36