workbox-build 模組會整合到以節點為基礎的建構程序中,並產生完整的 Service Worker,或只產生要預先快取的資產清單,供現有 Service Worker 使用。
大多數開發人員會使用 generateSW 和 injectManifest 這兩種模式。回答下列問題,有助於選擇合適的模式和設定。
要使用的模式
generateSW
generateSW 模式會為您建立服務工作人員檔案,並透過設定選項自訂該檔案,然後寫入磁碟。
使用時機 generateSW
- 您想要預先快取檔案。
- 您只需要簡單的執行階段快取。
不應使用 generateSW 的情況
- 您想使用其他 Service Worker 功能 (即 Web Push)。
- 您想匯入其他指令碼,或為自訂快取策略新增其他邏輯。
injectManifest
injectManifest 模式會產生要預先快取的網址清單,並將該預先快取資訊清單新增至現有的服務工作站檔案。否則檔案會維持原狀。
使用時機 injectManifest
- 您想進一步控管服務工作人員。
- 您想要預先快取檔案。
- 您需要自訂路徑和策略。
- 您想將 Service Worker 與其他平台功能 (例如 Web Push) 搭配使用。
不應使用 injectManifest 的情況
- 您希望以最簡單的方式將 Service Worker 新增至網站。
generateSW 模式
您可以在節點式建構指令碼中使用 generateSW 模式,並使用最常見的設定選項,如下所示:
// Inside of build.js:
const {generateSW} = require('workbox-build');
// These are some common options, and not all are required.
// Consult the docs for more info.
generateSW({
dontCacheBustURLsMatching: [new RegExp('...')],
globDirectory: '...',
globPatterns: ['...', '...'],
maximumFileSizeToCacheInBytes: ...,
navigateFallback: '...',
runtimeCaching: [{
// Routing via a matchCallback function:
urlPattern: ({request, url}) => ...,
handler: '...',
options: {
cacheName: '...',
expiration: {
maxEntries: ...,
},
},
}, {
// Routing via a RegExp:
urlPattern: new RegExp('...'),
handler: '...',
options: {
cacheName: '...',
plugins: [..., ...],
},
}],
skipWaiting: ...,
swDest: '...',
}).then(({count, size, warnings}) => {
if (warnings.length > 0) {
console.warn(
'Warnings encountered while generating a service worker:',
warnings.join('\n')
);
}
console.log(`Generated a service worker, which will precache ${count} files, totaling ${size} bytes.`);
});
這會為設定檔和提供的執行階段快取規則所選取的所有檔案,產生預先快取設定的 Service Worker。
如需完整的設定選項,請參閱參考說明文件。
injectManifest 模式
您可以在節點式建構指令碼中使用 injectManifest 模式,並使用最常見的設定選項,如下所示:
// Inside of build.js:
const {injectManifest} = require('workbox-build');
// These are some common options, and not all are required.
// Consult the docs for more info.
injectManifest({
dontCacheBustURLsMatching: [new RegExp('...')],
globDirectory: '...',
globPatterns: ['...', '...'],
maximumFileSizeToCacheInBytes: ...,
swDest: '...',
swSrc: '...',
}).then(({count, size, warnings}) => {
if (warnings.length > 0) {
console.warn(
'Warnings encountered while injecting the manifest:',
warnings.join('\n')
);
}
console.log(`Injected a manifest which will precache ${count} files, totaling ${size} bytes.`);
});
這會根據設定檔擷取的檔案建立預先快取資訊清單,並將其插入現有的 Service Worker 檔案。
如需完整的設定選項,請參閱參考說明文件。
其他模式
我們預期 generateSW 或 injectManifest 可滿足大多數開發人員的需求。不過,workbox-build 支援另一種模式,可能適合特定用途。
getManifest 模式
這在概念上與 injectManifest 模式類似,但不會將資訊清單新增至來源服務工作站檔案,而是傳回資訊清單項目陣列,以及項目數量和總大小的相關資訊。
您可以在節點式建構指令碼中使用 injectManifest 模式,並使用最常見的設定選項,如下所示:
// Inside of build.js:
const {getManifest} = require('workbox-build');
// These are some common options, and not all are required.
// Consult the docs for more info.
getManifest({
dontCacheBustURLsMatching: [new RegExp('...')],
globDirectory: '...',
globPatterns: ['...', '...'],
maximumFileSizeToCacheInBytes: ...,
}).then(({manifestEntries, count, size, warnings}) => {
if (warnings.length > 0) {
console.warn(
'Warnings encountered while getting the manifest:',
warnings.join('\n')
);
}
// Do something with the manifestEntries, and potentially log count and size.
});
如需完整的設定選項,請參閱參考說明文件。
類型
BasePartial
屬性
-
additionalManifestEntries
(string | ManifestEntry)[] 選用
除了建構設定產生的項目外,還有一份要預先快取的項目清單。
-
dontCacheBustURLsMatching
規則運算式 選填
系統會假設符合這項條件的資產是透過網址進行版本控制,因此在填入預先快取時,會免除正常 HTTP 快取清除作業。雖然不是必要條件,但建議您提供可偵測該值的 RegExp,因為這樣可減少預先快取時消耗的頻寬。
[hash] -
manifestTransforms
ManifestTransform[] 選用
一或多個函式,將依序套用至產生的資訊清單。如果也指定
modifyURLPrefix或dontCacheBustURLsMatching,系統會先套用對應的轉換。 -
maximumFileSizeToCacheInBytes
數字 選填
預設值為:2097152
這個值可用於判斷預先快取的檔案大小上限。這樣可避免您不慎預先快取可能意外符合其中一個模式的超大檔案。
-
modifyURLPrefix
object 選填
這個物件會將字串前置字元對應至替換字串值。舉例來說,如果網路代管設定與本機檔案系統設定不符,您可以使用這項功能從資訊清單項目中移除或新增路徑前置字串。如要使用更具彈性的替代方案,可以採用
manifestTransforms選項,並提供函式,透過您提供的任何邏輯修改資訊清單中的項目。使用範例:
// Replace a '/dist/' prefix with '/', and also prepend // '/static' to every URL. modifyURLPrefix: { '/dist/': '/', '': '/static', }
BuildResult
類型
Omit<GetManifestResult"manifestEntries"
> & object
屬性
-
filePaths
string[]
GeneratePartial
屬性
-
babelPresetEnvTargets
字串陣列 選用
預設值為:["chrome >= 56"]
要傳遞至
babel-preset-env的目標,用於轉譯服務工作人員套件。 -
cacheId
字串 選填
可選用的 ID,會加在快取名稱的前面。這項功能主要適用於本機開發,因為多個網站可能會從同一個
http://localhost:port來源放送。 -
cleanupOutdatedCaches
布林值 選填
預設值為 false
Workbox 是否應嘗試找出並刪除舊版不相容版本建立的任何預先快取。
-
clientsClaim
布林值 選填
預設值為 false
服務工作人員是否應在啟動後,立即開始控管任何現有用戶端。
-
directoryIndex
字串 選填
如果以
/結尾的網址導覽要求無法與預先快取的網址相符,系統會將這個值附加至網址,並檢查是否與預先快取的網址相符。這項設定應與網路伺服器用於目錄索引的內容一致。 -
disableDevLogs
布林值 選填
預設值為 false
-
ignoreURLParametersMatching
RegExp[] 選填
系統會先移除與這個陣列中其中一個 RegExp 相符的任何搜尋參數名稱,再尋找預先快取相符項目。如果使用者可能會要求含有網址參數 (例如用於追蹤流量來源) 的網址,這項功能就非常實用。如未提供,預設值為
[/^utm_/, /^fbclid$/]。 -
importScripts
字串陣列 選用
應傳遞至所產生服務工作人員檔案內
importScripts()的 JavaScript 檔案清單。如果您想讓 Workbox 建立頂層服務工作人員檔案,但又想加入一些額外程式碼 (例如推送事件監聽器),這項功能就非常實用。 -
inlineWorkboxRuntime
布林值 選填
預設值為 false
是否應將 Workbox 程式庫的執行階段程式碼納入頂層服務工作人員,或分成個別檔案,與服務工作人員一併部署。將執行階段分開,表示使用者不必在每次頂層服務工作人員變更時,重新下載 Workbox 程式碼。
-
模式
字串 選填
預設值為「production」
如果設為「production」,系統會產生排除偵錯資訊的最佳化 Service Worker 套件。如果未在此處明確設定,系統會使用
process.env.NODE_ENV值,如果該值不存在,則會改用'production'。 -
字串 選填
預設值為:null
如果指定了這個屬性,系統會使用提供的網址中的 HTML,滿足所有導覽要求 (網址並未預先快取)。您必須傳遞預先快取資訊清單中列出的 HTML 文件網址。這項功能適用於單頁應用程式情境,您希望所有導覽都使用通用的 App Shell HTML。
-
RegExp[] 選填
選用規則運算式陣列,可限制設定的
navigateFallback行為適用的網址。如果只有部分網站網址應視為單頁應用程式的一部分,這項功能就非常實用。如果同時設定navigateFallbackDenylist和navigateFallbackAllowlist,系統會優先採用拒絕清單。注意:系統可能會在導覽期間,針對每個目的地網址評估這些 RegExps。請避免使用複雜的 RegExps,否則使用者瀏覽網站時可能會遇到延遲問題。
-
RegExp[] 選填
選用規則運算式陣列,可限制設定的
navigateFallback行為適用的網址。如果只有部分網站網址應視為單頁應用程式,這項功能就非常實用。如果同時設定navigateFallbackDenylist和navigateFallbackAllowlist,系統會優先採用拒絕清單。注意:系統可能會在導覽期間,針對每個目的地網址評估這些 RegExps。請避免使用複雜的 RegExps,否則使用者瀏覽網站時可能會遇到延遲問題。
-
布林值 選填
預設值為 false
是否要在產生的 Service Worker 中啟用瀏覽預先載入。如果設為 true,您也必須使用
runtimeCaching設定適當的回應策略,以符合導覽要求,並使用預先載入的回應。 -
offlineGoogleAnalytics
boolean | GoogleAnalyticsInitializeOptions optional
預設值為 false
控制是否要納入對離線 Google Analytics 的支援。 當
true時,對workbox-google-analytics的initialize()呼叫會新增至產生的 Service Worker。如果設為Object,該物件會傳遞至initialize()呼叫,方便您自訂行為。 -
runtimeCaching
RuntimeCaching[] 選用
使用 Workbox 的建構工具產生 Service Worker 時,可以指定一或多個執行階段快取設定。然後,系統會使用您定義的比對和處理常式設定,將這些呼叫轉換為
workbox-routing.registerRoute呼叫。如要瞭解所有選項,請參閱
workbox-build.RuntimeCaching說明文件。以下範例顯示典型的設定,其中定義了兩條執行階段路徑: -
skipWaiting
布林值 選填
預設值為 false
是否要將無條件呼叫新增至產生的服務工作人員
skipWaiting()。如果是false,則會改為新增message監聽器,讓用戶端網頁透過在等待中的 Service Worker 上呼叫postMessage({type: 'SKIP_WAITING'}),觸發skipWaiting()。 -
sourcemap
布林值 選填
預設值為 true
是否要為產生的 Service Worker 檔案建立來源對應。
GenerateSWOptions
類型
GetManifestOptions
GetManifestResult
屬性
-
數量
數字
-
manifestEntries
-
大小
數字
-
項警告
string[]
GlobPartial
屬性
-
globFollow
布林值 選填
預設值為 true
決定產生預先快取資訊清單時是否要追蹤符號連結。詳情請參閱
glob說明文件中的follow定義。 -
globIgnores
字串陣列 選用
預設值為:["**\/node_modules\/**\/*"]
一組模式,用於比對在產生預先快取資訊清單時一律要排除的檔案。詳情請參閱
glob說明文件中的ignore定義。 -
globPatterns
字串陣列 選用
預設值為:["**\/*.{js,wasm,css,html}"]
符合這些模式的檔案會納入預先快取資訊清單。詳情請參閱
glob入門指南。 -
templatedURLs
object 選填
如果網址是根據某些伺服器端邏輯算繪,其內容可能取決於多個檔案或其他獨特的字串值。這個物件中的鍵是伺服器算繪的網址。如果值是字串陣列,系統會將其解譯為
glob模式,並使用符合模式的任何檔案內容,為網址建立專屬版本。如果搭配單一字串使用,系統會將其解讀為您為特定網址產生的專屬版本資訊。
InjectManifestOptions
InjectPartial
屬性
-
injectionPoint
字串 選填
預設值為:"self.__WB_MANIFEST"
要在
swSrc檔案中尋找的字串。找到後,系統會以產生的預先快取資訊清單取代。 -
swSrc
字串
在建構程序期間讀取的服務工作人員檔案路徑和檔案名稱,相對於目前的工作目錄。
ManifestEntry
屬性
-
完整性
字串 選填
-
修訂
字串
-
網址
字串
ManifestTransform()
workbox-build.ManifestTransform(
manifestEntries: (ManifestEntry & object)[],
compilation?: unknown,
): Promise<ManifestTransformResult> | ManifestTransformResult
類型
函式
參數
-
manifestEntries
(ManifestEntry & object)[]
-
大小
數字
-
-
合輯
不明 選填
傳回
-
Promise<ManifestTransformResult> | ManifestTransformResult
ManifestTransformResult
屬性
-
資訊清單
(ManifestEntry & object)[]
-
大小
數字
-
-
項警告
字串陣列 選用
OptionalGlobDirectoryPartial
屬性
-
globDirectory
字串 選填
您要比對的本機目錄
globPatterns。路徑是相對於目前目錄。
RequiredGlobDirectoryPartial
屬性
-
globDirectory
字串
您要比對的本機目錄
globPatterns。路徑是相對於目前目錄。
RequiredSWDestPartial
屬性
-
swDest
字串
建構程序建立的服務工作人員檔案路徑和檔案名稱,相對於目前的工作目錄。必須以「.js」結尾。
RuntimeCaching
屬性
-
handler
這會決定執行階段路徑如何產生回應。 如要使用其中一個內建
workbox-strategies,請提供其名稱,例如'NetworkFirst'。或者,這也可以是具有自訂回應邏輯的workbox-core.RouteHandler回呼函式。 -
method
HTTPMethod 選用
預設值為「GET」
要比對的 HTTP 方法。除非您明確需要比對
'POST'、'PUT'或其他類型的要求,否則'GET'的預設值通常就已足夠。 -
選項
object 選填
-
backgroundSync
object 選填
設定完成後,系統會將
workbox-background-sync.BackgroundSyncPlugin執行個體新增至handler中設定的workbox-strategies。-
名稱
字串
-
選項
QueueOptions optional
-
-
broadcastUpdate
object 選填
設定完成後,系統會將
workbox-broadcast-update.BroadcastUpdatePlugin執行個體新增至handler中設定的workbox-strategies。-
channelName
字串 選填
-
-
cacheName
字串 選填
如果提供這項資訊,系統會設定
handler中設定的workbox-strategies的cacheName屬性。 -
cacheableResponse
設定此項目會將
workbox-cacheable-response.CacheableResponsePlugin執行個體新增至handler中設定的workbox-strategies。 -
到期
ExpirationPluginOptions optional
設定此項目會將
workbox-expiration.ExpirationPlugin執行個體新增至handler中設定的workbox-strategies。 -
fetchOptions
RequestInit 選填
設定此屬性後,系統會將
fetchOptions值傳遞至handler中設定的workbox-strategies。 -
matchOptions
CacheQueryOptions 選用
設定此屬性後,系統會將
matchOptions值傳遞至handler中設定的workbox-strategies。 -
networkTimeoutSeconds
數字 選填
如果提供這項資訊,系統會設定
handler中設定的workbox-strategiesnetworkTimeoutSeconds屬性。請注意,只有'NetworkFirst'和'NetworkOnly'支援networkTimeoutSeconds。 -
外掛程式
WorkboxPlugin[] 選填
設定此選項後,即可使用一或多個沒有「捷徑」選項的 Workbox 外掛程式 (例如
expiration的workbox-expiration.ExpirationPlugin)。這裡提供的外掛程式會新增至handler中設定的workbox-strategies。 -
precacheFallback
object 選填
設定此項目會將
workbox-precaching.PrecacheFallbackPlugin執行個體新增至handler中設定的workbox-strategies。-
fallbackURL
字串
-
-
rangeRequests
布林值 選填
啟用這項功能後,系統會將
workbox-range-requests.RangeRequestsPlugin執行個體新增至handler中設定的workbox-strategies。
-
-
urlPattern
字串 | RegExp | RouteMatchCallback
這項比對條件會判斷設定的處理常式是否要為任何與預先快取網址不符的要求產生回應。如果定義了多個
RuntimeCaching路由,系統會使用第一個urlPattern相符的路由來回應。這個值會直接對應至傳遞至
workbox-routing.registerRoute的第一個參數。建議使用workbox-core.RouteMatchCallback函式,以獲得最大彈性。
StrategyName
列舉
「CacheFirst」
「CacheOnly」
「NetworkFirst」
「NetworkOnly」
「StaleWhileRevalidate」
WebpackGenerateSWOptions
WebpackGenerateSWPartial
屬性
-
importScriptsViaChunks
字串陣列 選用
一或多個 Webpack 區塊的名稱。這些區塊的內容會透過呼叫
importScripts()納入產生的 Service Worker。 -
swDest
字串 選填
預設值為「service-worker.js」
這個外掛程式建立的 Service Worker 檔案資產名稱。
WebpackInjectManifestOptions
WebpackInjectManifestPartial
屬性
-
compileSrc
布林值 選填
預設值為 true
如果設為
true(預設值),webpack 會編譯swSrc檔案。如果false,系統不會進行編譯 (且無法使用webpackCompilationPlugins)。如要將資訊清單插入 JSON 檔案等,請設為false。 -
swDest
字串 選填
這個外掛程式建立的 Service Worker 檔案資產名稱。如果省略,名稱會依據
swSrc名稱。 -
webpackCompilationPlugins
any[] 選填
編譯
swSrc輸入檔案時要使用的選用webpack外掛程式。只有在compileSrc為true時才有效。
WebpackPartial
屬性
-
區塊
字串陣列 選用
一或多個區塊名稱,其對應的輸出檔案應納入預先快取資訊清單。
-
排除
(string | RegExp | function)[] optional
用於從預先快取資訊清單排除一或多個資產的指定符。 這項設定的解讀方式與
webpack標準exclude選項遵循相同規則。如未提供,則預設值為[/\.map$/, /^manifest.*\.js$]。 -
excludeChunks
字串陣列 選用
一或多個區塊名稱,對應的輸出檔案應從預先快取資訊清單中排除。
-
包括
(string | RegExp | function)[] optional
用於在預先快取資訊清單中加入一或多個資產的指定符。 系統會按照與
webpack標準include選項相同的規則解讀這項設定。 -
模式
字串 選填
如果設為「production」,系統會產生排除偵錯資訊的最佳化 Service Worker 套件。如果未在此處明確設定,系統會使用目前
webpack編譯中設定的mode值。
方法
copyWorkboxLibraries()
workbox-build.copyWorkboxLibraries(
destDirectory: string,
): Promise<string>
這會將 Workbox 使用的一組執行階段程式庫複製到本機目錄,並與 Service Worker 檔案一併部署。
除了部署這些本機副本,您也可以改用官方 CDN 網址中的 Workbox。
公開這個方法是為了讓使用 workbox-build.injectManifest 的開發人員受益,他們可能不想使用 Workbox 的 CDN 副本。使用 workbox-build.generateSW 的開發人員不需要明確呼叫這個方法。
參數
-
destDirectory
字串
新程式庫目錄的父項目錄路徑。
傳回
-
Promise<string>
新建立的目錄名稱。
generateSW()
workbox-build.generateSW(
config: GenerateSWOptions,
): Promise<BuildResult>
這個方法會根據您提供的選項,建立要預先快取的網址清單,也就是「預先快取資訊清單」。
此外,它也會採用其他選項來設定 Service Worker 的行為,例如應使用的任何 runtimeCaching 規則。
根據預先快取資訊清單和其他設定,這個外掛程式會在 swDest 將可供使用的 Service Worker 檔案寫入磁碟。
// The following lists some common options; see the rest of the documentation
// for the full set of options and defaults.
const {count, size, warnings} = await generateSW({
dontCacheBustURLsMatching: [new RegExp('...')],
globDirectory: '...',
globPatterns: ['...', '...'],
maximumFileSizeToCacheInBytes: ...,
navigateFallback: '...',
runtimeCaching: [{
// Routing via a matchCallback function:
urlPattern: ({request, url}) => ...,
handler: '...',
options: {
cacheName: '...',
expiration: {
maxEntries: ...,
},
},
}, {
// Routing via a RegExp:
urlPattern: new RegExp('...'),
handler: '...',
options: {
cacheName: '...',
plugins: [..., ...],
},
}],
skipWaiting: ...,
swDest: '...',
});
參數
-
config
傳回
-
Promise<BuildResult>
getManifest()
workbox-build.getManifest(
config: GetManifestOptions,
): Promise<GetManifestResult>
這個方法會根據您提供的選項,傳回要預先快取的網址清單 (稱為「預先快取資訊清單」),以及項目數量和大小的詳細資料。
// The following lists some common options; see the rest of the documentation
// for the full set of options and defaults.
const {count, manifestEntries, size, warnings} = await getManifest({
dontCacheBustURLsMatching: [new RegExp('...')],
globDirectory: '...',
globPatterns: ['...', '...'],
maximumFileSizeToCacheInBytes: ...,
});
參數
-
config
傳回
-
Promise<GetManifestResult>
getModuleURL()
workbox-build.getModuleURL(
moduleName: string,
buildType: BuildType,
): string
參數
-
moduleName
字串
-
buildType
BuildType
傳回
-
字串
injectManifest()
workbox-build.injectManifest(
config: InjectManifestOptions,
): Promise<BuildResult>
這個方法會根據您提供的選項,建立要預先快取的網址清單,也就是「預先快取資訊清單」。
資訊清單會插入 swSrc 檔案,而預留位置字串 injectionPoint 則會決定資訊清單在檔案中的位置。
最終的 Service Worker 檔案 (已插入資訊清單) 會寫入磁碟的 swDest。
這個方法不會編譯或組合 swSrc 檔案,只會處理資訊清單的插入作業。
// The following lists some common options; see the rest of the documentation
// for the full set of options and defaults.
const {count, size, warnings} = await injectManifest({
dontCacheBustURLsMatching: [new RegExp('...')],
globDirectory: '...',
globPatterns: ['...', '...'],
maximumFileSizeToCacheInBytes: ...,
swDest: '...',
swSrc: '...',
});
參數
-
config
傳回
-
Promise<BuildResult>