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