成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

記一次基于react、cra2、typescript的pwa項目由開發(fā)到部署(二)

Prasanta / 3191人閱讀

摘要:在上一篇文章記一次基于的項目由開發(fā)到部署一中,我們了解到了給我們提供了哪些支持,也了解到了有哪些不足。項目回顧這是一個移動端的應(yīng)用,使用,,,,基于開發(fā)??梢蕴砑拥街髌聊唬梢詳嗑W(wǎng)條件下正常打開和訪問數(shù)據(jù)。

在上一篇文章記一次基于react、cra2、typescript的pwa項目由開發(fā)到部署(一)中,我們了解到了create-react-app 給我們提供了哪些pwa支持,也了解到了有哪些不足。雖然create-react-app會幫我們自動生成一個service-worker.js 去緩存我們的app shell,但是并沒有提供讓開發(fā)者定制service worker的方法,除非我們eject項目,這篇文章繼續(xù)往下講,把在這個項目中學到的東西分享給大家。

項目回顧

這是一個移動端的pwa應(yīng)用,使用react,typescript,react-redux,react-router,workbox 基于create-react-app 開發(fā)??梢蕴砑拥街髌聊?,可以斷網(wǎng)條件下正常打開和訪問數(shù)據(jù)。項目地址:browseExpbyReact

使用typescript

typescript是JavaScript的超級,一方面在typescript中我們可以使用最新的特性,另一方面typescript給我們帶來了類型系統(tǒng),可以讓我們寫出健壯的代碼,避免一些潛在的運行時錯誤。在create-react-app中使用typescript,官網(wǎng)推薦我們使用的是create-react-app的ts版本,他會幫你配置好typescript的相關(guān)配置,并使用react-script-ts代替react-script來驅(qū)動項目。但是這個版本的更新會稍稍滯后于原版,而且也不利于我們擴展腳手架的配置,所以這里不推薦使用。我們使用 react-app-rewired 來進行配置。

感謝讀者提醒:October 29, 2018發(fā)布的 v2.1.0 利用bebal7 添加了對typescript的支持,現(xiàn)在我們只要運行 create-react-app my-app --typescript 就能夠的到typescript的支持了,可以關(guān)注以下網(wǎng)址關(guān)注create-react-app 的更新變動create-react-app releases
react-app-rewired

在create-react-app中修改默認配置有兩種常用的方法,

一種是 eject 項目,eject會把我們的腳手架中的配置暴露出來,然后我們就可以去修改了,但是這是一個不可逆的過程,而且講配置暴露出來也是一個不優(yōu)雅的做法,所以不推薦。

第二種就是利用 react-app-rewired 去修改我們的配置,他可以讓我們在不eject項目的前提下修改我們的配置。比如配置typescript,我們可以找到對應(yīng)的插件 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
  }
}
// 此函數(shù)用來找出 默認配置中的 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
}

這部分的配置大概意思就是,當環(huán)境為生成環(huán)境時,找出webpack中關(guān)于workbox-webpack-plugin的配置,把它刪掉,然后用自己的配置替代它。

這里解釋一下 removePreWorkboxWebpackPluginConfig 這個函數(shù)。我們可以自己用create-react-app新建一個無用的項目,然后eject它,那么我們可以在暴露出來的config文件夾下的 webpack.config.prod.js 中看到關(guān)于 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數(shù)組調(diào)用findIndex方法,找到構(gòu)造函數(shù)的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的配置后,根據(jù)自己的配置在public目錄下新建cus-service-worker.js文件,這個文件會代替默認生成的service-worker.js文件,我們就可以通過配置cus-service-worker.js來定制自己的pwa配置了,而且cus-service-worker.js 里的內(nèi)容也是有講究的,以本項目為例:

// 引入workbox全局變量
importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js");

if (workbox) {
  console.log(`Yay! Workbox is loaded            
               
                                           
                       
                 

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98836.html

相關(guān)文章

  • 一次基于react、cra2typescriptpwa項目開發(fā)部署(三)

    摘要:配置反向代理我們的項目已經(jīng)在服務(wù)器上的端口運行著,所以我們需要配置一個反向代理,將我們對服務(wù)器的訪問反向代理到服務(wù)器的。 該篇文章為本系列最后一篇文章,因為最近樓主忙于畢設(shè),所以這也是一篇被鴿了很久很久的文章。該文章主要講的是該項目的部署部分,包括: 如何部署將該項目部署到nginx服務(wù)器上。 為它配置證書,讓它運行在https協(xié)議上等。 項目回顧 這是一個基于creat-reac...

    Betta 評論0 收藏0
  • 2017前端發(fā)展回顧

    摘要:前端開發(fā)在年依然持續(xù)火熱,本文將對熱點事件做一個總結(jié)。版的和協(xié)議在前端領(lǐng)域,一直獨占鰲頭。年又發(fā)布了一個重大的版本更新。主要是配合使用了服務(wù)工作線程。而且還提供了供前端開發(fā)者接入。快速發(fā)布了和在悄悄地跳過之后,在月號正式發(fā)布。 譯者按: 老技術(shù)日趨成熟,新技術(shù)層出不窮。 原文: A recap of front-end development in 2017 譯者: Fundebu...

    lmxdawn 評論0 收藏0
  • 2018前端值得關(guān)注技術(shù)

    摘要:年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會興起,哪些技術(shù)會沒落。自從谷歌提出后,就持續(xù)的獲得了業(yè)界的關(guān)注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應(yīng)用同等的待遇與權(quán)限。但是無論都值得關(guān)注。 1.前言 2017悄然過去,2018已經(jīng)來到。人在進步,技術(shù)在發(fā)展。2018年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會興起,哪些技術(shù)會沒落。下面就我個人的判斷進行一個預(yù)測判斷,希望能對大家...

    xiao7cn 評論0 收藏0
  • 2018前端值得關(guān)注技術(shù)

    摘要:年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會興起,哪些技術(shù)會沒落。自從谷歌提出后,就持續(xù)的獲得了業(yè)界的關(guān)注,熱度可見一斑。就在今年,谷歌也宣布將獲得與安卓原生應(yīng)用同等的待遇與權(quán)限。但是無論都值得關(guān)注。 1.前言 2017悄然過去,2018已經(jīng)來到。人在進步,技術(shù)在發(fā)展。2018年前端有哪些領(lǐng)域,技術(shù)值得關(guān)注,哪些技術(shù)會興起,哪些技術(shù)會沒落。下面就我個人的判斷進行一個預(yù)測判斷,希望能對大家...

    用戶84 評論0 收藏0
  • 前端每周清單第 45 期: Safari 支持 Service Worker, Parcel 完整教

    摘要:的另一個核心特性,蘋果表示也正在開發(fā)中,按開發(fā)進度可能幾個月后就能與我們見面。是基于的本地化數(shù)據(jù)庫,支持以及瀏覽器環(huán)境。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點;分為新聞熱點、開發(fā)教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎關(guān)注【前端之巔】微信公眾號(ID: frontshow),及時獲取前端每周清單。 本期是 2017 年的最后一...

    趙春朋 評論0 收藏0

發(fā)表評論

0條評論

Prasanta

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<