public/index.html 文件是一個會被 html-webpack-plugin 處理的模板。在構(gòu)建過程中,資源鏈接會被自動注入。另外,Vue CLI 也會自動注入 resource hint (preload/prefetch、manifest 和圖標(biāo)鏈接 (當(dāng)用到 PWA 插件時) 以及構(gòu)建過程中處理的 JavaScript 和 CSS 文件的資源鏈接。
因為 index 文件被用作模板,所以你可以使用 lodash template 語法插入內(nèi)容:
除了被 html-webpack-plugin 暴露的默認(rèn)值之外,所有客戶端環(huán)境變量也可以直接使用。例如,BASE_URL 的用法:
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
更多內(nèi)容可以查閱:
<link rel="preload"> 是一種 resource hint,用來指定頁面加載后很快會被用到的資源,所以在頁面加載的過程中,我們希望在瀏覽器開始主體渲染之前盡早 preload。
默認(rèn)情況下,一個 Vue CLI 應(yīng)用會為所有初始化渲染需要的文件自動生成 preload 提示。
這些提示會被 @vue/preload-webpack-plugin 注入,并且可以通過 chainWebpack 的 config.plugin('preload') 進(jìn)行修改和刪除。
<link rel="prefetch"> 是一種 resource hint,用來告訴瀏覽器在頁面加載完成后,利用空閑時間提前獲取用戶未來可能會訪問的內(nèi)容。
默認(rèn)情況下,一個 Vue CLI 應(yīng)用會為所有作為 async chunk 生成的 JavaScript 文件 (通過動態(tài) import() 按需 code splitting 的產(chǎn)物) 自動生成 prefetch 提示。
這些提示會被 @vue/preload-webpack-plugin 注入,并且可以通過 chainWebpack 的 config.plugin('prefetch') 進(jìn)行修改和刪除。
示例:
// vue.config.js
module.exports = {
chainWebpack: config => {
// 移除 prefetch 插件
config.plugins.delete('prefetch')
// 或者
// 修改它的選項:
config.plugin('prefetch').tap(options => {
options[0].fileBlacklist = options[0].fileBlacklist || []
options[0].fileBlacklist.push(/myasyncRoute(.)+?\.js$/)
return options
})
}
}
當(dāng) prefetch 插件被禁用時,你可以通過 webpack 的內(nèi)聯(lián)注釋手動選定要提前獲取的代碼區(qū)塊:
import(/* webpackPrefetch: true */ './someAsyncComponent.vue')
webpack 的運(yùn)行時會在父級區(qū)塊被加載之后注入 prefetch 鏈接。
提示
Prefetch 鏈接將會消耗帶寬。如果你的應(yīng)用很大且有很多 async chunk,而用戶主要使用的是對帶寬較敏感的移動端,那么你可能需要關(guān)掉 prefetch 鏈接并手動選擇要提前獲取的代碼區(qū)塊。
當(dāng)基于已有的后端使用 Vue CLI 時,你可能不需要生成 index.html,這樣生成的資源可以用于一個服務(wù)端渲染的頁面。這時可以向 vue.config.js 加入下列代碼:
// vue.config.js
module.exports = {
// 去掉文件名中的 hash
filenameHashing: false,
// 刪除 HTML 相關(guān)的 webpack 插件
chainWebpack: config => {
config.plugins.delete('html')
config.plugins.delete('preload')
config.plugins.delete('prefetch')
}
}
然而這樣做并不是很推薦,因為:
你應(yīng)該考慮換用 indexPath 選項將生成的 HTML 用作一個服務(wù)端框架的視圖模板。
不是每個應(yīng)用都需要是一個單頁應(yīng)用。Vue CLI 支持使用 vue.config.js 中的 pages 選項構(gòu)建一個多頁面的應(yīng)用。構(gòu)建好的應(yīng)用將會在不同的入口之間高效共享通用的 chunk 以獲得最佳的加載性能。
靜態(tài)資源可以通過兩種方式進(jìn)行處理:
當(dāng)你在 JavaScript、CSS 或 *.vue 文件中使用相對路徑 (必須以 . 開頭) 引用一個靜態(tài)資源時,該資源將會被包含進(jìn)入 webpack 的依賴圖中。在其編譯過程中,所有諸如 <img src="...">、background: url(...) 和 CSS @import 的資源 URL 都會被解析為一個模塊依賴。
例如,url(./image.png) 會被翻譯為 require('./image.png'),而:
<img src="./image.png">
將會被編譯到:
h('img', { attrs: { src: require('./image.png') }})
在其內(nèi)部,我們通過 file-loader 用版本哈希值和正確的公共基礎(chǔ)路徑來決定最終的文件路徑,再用 url-loader 將小于 4kb 的資源內(nèi)聯(lián),以減少 HTTP 請求的數(shù)量。
你可以通過 chainWebpack 調(diào)整內(nèi)聯(lián)文件的大小限制。例如,下列代碼會將其限制設(shè)置為 10kb:
// vue.config.js
module.exports = {
chainWebpack: config => {
config.module
.rule('images')
.use('url-loader')
.loader('url-loader')
.tap(options => Object.assign(options, { limit: 10240 }))
}
}
任何放置在 public 文件夾的靜態(tài)資源都會被簡單的復(fù)制,而不經(jīng)過 webpack。你需要通過絕對路徑來引用它們。
注意我們推薦將資源作為你的模塊依賴圖的一部分導(dǎo)入,這樣它們會通過 webpack 的處理并獲得如下好處:
public 目錄提供的是一個應(yīng)急手段,當(dāng)你通過絕對路徑引用它時,留意應(yīng)用將會部署到哪里。如果你的應(yīng)用沒有部署在域名的根部,那么你需要為你的 URL 配置 publicPath 前綴:
更多建議: