Vue CLI配置
轉載自:https://cli.vuejs.org/zh/config/
#全域性 CLI 配置
有些針對 @vue/cli
的全域性配置,例如你慣用的包管理器和你本地儲存的 preset,都儲存在 home 目錄下一個名叫 .vuerc
的 JSON 檔案。你可以用編輯器直接編輯這個檔案來更改已儲存的選項。
你也可以使用 vue config
命令來審查或修改全域性的 CLI 配置。
#目標瀏覽器
請查閱指南中的瀏覽器相容性章節。
#vue.config.js
vue.config.js
是一個可選的配置檔案,如果專案的 (和 package.json
同級的) 根目錄中存在這個檔案,那麼它會被 @vue/cli-service
package.json
中的 vue
欄位,但是注意這種寫法需要你嚴格遵照 JSON 的格式來寫。
這個檔案應該匯出一個包含了選項的物件:
// vue.config.js
module.exports = {
// 選項...
}
#baseUrl
從 Vue CLI 3.3 起已棄用,請使用publicPath
。
#publicPath
-
Type:
string
-
Default:
'/'
部署應用包時的基本 URL。用法和 webpack 本身的
output.publicPath
一致,但是 Vue CLI 在一些其他地方也需要用到這個值,所以請始終使用publicPath
output.publicPath
。預設情況下,Vue CLI 會假設你的應用是被部署在一個域名的根路徑上,例如
https://www.my-app.com/
。如果應用被部署在一個子路徑上,你就需要用這個選項指定這個子路徑。例如,如果你的應用被部署在https://www.my-app.com/my-app/
,則設定publicPath
為/my-app/
。這個值也可以被設定為空字串 (
''
) 或是相對路徑 ('./'
),這樣所有的資源都會被連結為相對路徑,這樣打出來的包可以被部署在任意路徑,也可以用在類似 Cordova hybrid 應用的檔案系統中。相對 publicPath 的限制
相對路徑的
publicPath
有一些使用上的限制。在以下情況下,應當避免使用相對publicPath
:- 當使用基於 HTML5
history.pushState
的路由時; - 當使用
pages
選項構建多頁面應用時。
這個值在開發環境下同樣生效。如果你想把開發伺服器架設在根路徑,你可以使用一個條件式的值:
module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/production-sub-path/' : '/' }
- 當使用基於 HTML5
#outputDir
-
Type:
string
-
Default:
'dist'
當執行
vue-cli-service build
時生成的生產環境構建檔案的目錄。注意目標目錄在構建之前會被清除 (構建時傳入--no-clean
可關閉該行為)。提示
請始終使用
outputDir
而不要修改 webpack 的output.path
。
#assetsDir
-
Type:
string
-
Default:
''
放置生成的靜態資源 (js、css、img、fonts) 的 (相對於
outputDir
的) 目錄。提示
從生成的資源覆寫 filename 或 chunkFilename 時,
assetsDir
會被忽略。
#indexPath
-
Type:
string
-
Default:
'index.html'
指定生成的
index.html
的輸出路徑 (相對於outputDir
)。也可以是一個絕對路徑。
#filenameHashing
-
Type:
boolean
-
Default:
true
預設情況下,生成的靜態資源在它們的檔名中包含了 hash 以便更好的控制快取。然而,這也要求 index 的 HTML 是被 Vue CLI 自動生成的。如果你無法使用 Vue CLI 生成的 index HTML,你可以通過將這個選項設為
false
來關閉檔名雜湊。
#pages
-
Type:
Object
-
Default:
undefined
在 multi-page 模式下構建應用。每個“page”應該有一個對應的 JavaScript 入口檔案。其值應該是一個物件,物件的 key 是入口的名字,value 是:
- 一個指定了
entry
,template
,filename
,title
和chunks
的物件 (除了entry
之外都是可選的); - 或一個指定其
entry
的字串。
module.exports = { pages: { index: { // page 的入口 entry: 'src/index/main.js', // 模板來源 template: 'public/index.html', // 在 dist/index.html 的輸出 filename: 'index.html', // 當使用 title 選項時, // template 中的 title 標籤需要是 <title><%= htmlWebpackPlugin.options.title %></title> title: 'Index Page', // 在這個頁面中包含的塊,預設情況下會包含 // 提取出來的通用 chunk 和 vendor chunk。 chunks: ['chunk-vendors', 'chunk-common', 'index'] }, // 當使用只有入口的字串格式時, // 模板會被推導為 `public/subpage.html` // 並且如果找不到的話,就回退到 `public/index.html`。 // 輸出檔名會被推導為 `subpage.html`。 subpage: 'src/subpage/main.js' } }
提示
當在 multi-page 模式下構建時,webpack 配置會包含不一樣的外掛 (這時會存在多個
html-webpack-plugin
和preload-webpack-plugin
的例項)。如果你試圖修改這些外掛的選項,請確認執行vue inspect
。 - 一個指定了
#lintOnSave
-
Type:
boolean
|'warning'
|'default'
|'error'
-
Default:
'default'
是否在開發環境下通過 eslint-loader 在每次儲存時 lint 程式碼。這個值會在
@vue/cli-plugin-eslint
被安裝之後生效。設定為
true
或'warning'
時,eslint-loader
會將 lint 錯誤輸出為編譯警告。預設情況下,警告僅僅會被輸出到命令列,且不會使得編譯失敗。如果你希望讓 lint 錯誤在開發時直接顯示在瀏覽器中,你可以使用
lintOnSave: 'default'
。這會強制eslint-loader
將 lint 錯誤輸出為編譯錯誤,同時也意味著 lint 錯誤將會導致編譯失敗。設定為
error
將會使得eslint-loader
把 lint 警告也輸出為編譯錯誤,這意味著 lint 警告將會導致編譯失敗。或者,你也可以通過設定讓瀏覽器 overlay 同時顯示警告和錯誤:
// vue.config.js module.exports = { devServer: { overlay: { warnings: true, errors: true } } }
當
lintOnSave
是一個 truthy 的值時,eslint-loader
在開發和生產構建下都會被啟用。如果你想要在生產構建時禁用eslint-loader
,你可以用如下配置:// vue.config.js module.exports = { lintOnSave: process.env.NODE_ENV !== 'production' }
#runtimeCompiler
-
Type:
boolean
-
Default:
false
是否使用包含執行時編譯器的 Vue 構建版本。設定為
true
後你就可以在 Vue 元件中使用template
選項了,但是這會讓你的應用額外增加 10kb 左右。更多細節可查閱:Runtime + Compiler vs. Runtime only。
#transpileDependencies
-
Type:
Array<string | RegExp>
-
Default:
[]
預設情況下
babel-loader
會忽略所有node_modules
中的檔案。如果你想要通過 Babel 顯式轉譯一個依賴,可以在這個選項中列出來。
#productionSourceMap
-
Type:
boolean
-
Default:
true
如果你不需要生產環境的 source map,可以將其設定為
false
以加速生產環境構建。
#crossorigin
-
Type:
string
-
Default:
undefined
設定生成的 HTML 中
<link rel="stylesheet">
和<script>
標籤的crossorigin
屬性。需要注意的是該選項僅影響由
html-webpack-plugin
在構建時注入的標籤 - 直接寫在模版 (public/index.html
) 中的標籤不受影響。更多細節可查閱: CORS settings attributes
#integrity
-
Type:
boolean
-
Default:
false
在生成的 HTML 中的
<link rel="stylesheet">
和<script>
標籤上啟用 Subresource Integrity (SRI)。如果你構建後的檔案是部署在 CDN 上的,啟用該選項可以提供額外的安全性。需要注意的是該選項僅影響由
html-webpack-plugin
在構建時注入的標籤 - 直接寫在模版 (public/index.html
) 中的標籤不受影響。另外,當啟用 SRI 時,preload resource hints 會被禁用,因為 Chrome 的一個 bug 會導致檔案被下載兩次。
#configureWebpack
-
Type:
Object | Function
如果這個值是一個物件,則會通過 webpack-merge 合併到最終的配置中。
如果這個值是一個函式,則會接收被解析的配置作為引數。該函式既可以修改配置並不返回任何東西,也可以返回一個被克隆或合併過的配置版本。
更多細節可查閱:配合 webpack > 簡單的配置方式
#chainWebpack
-
Type:
Function
是一個函式,會接收一個基於 webpack-chain 的
ChainableConfig
例項。允許對內部的 webpack 配置進行更細粒度的修改。更多細節可查閱:配合 webpack > 鏈式操作
#css.modules
從 v4 起已棄用,請使用css.requireModuleExtension
。 在 v3 中,這個選項含義與 css.requireModuleExtension
相反。
#css.requireModuleExtension
-
Type:
boolean
-
Default:
true
預設情況下,只有
*.module.[ext]
結尾的檔案才會被視作 CSS Modules 模組。設定為false
後你就可以去掉檔名中的.module
並將所有的*.(css|scss|sass|less|styl(us)?)
檔案視為 CSS Modules 模組。提示
如果你在
css.loaderOptions.css
裡配置了自定義的 CSS Module 選項,則css.requireModuleExtension
必須被顯式地指定為true
或者false
,否則我們無法確定你是否希望將這些自定義配置應用到所有 CSS 檔案中。更多細節可查閱:配合 CSS > CSS Modules
#css.extract
-
Type:
boolean | Object
-
Default: 生產環境下是
true
,開發環境下是false
是否將元件中的 CSS 提取至一個獨立的 CSS 檔案中 (而不是動態注入到 JavaScript 中的 inline 程式碼)。
同樣當構建 Web Components 元件時它總是會被禁用 (樣式是 inline 的並注入到了 shadowRoot 中)。
當作為一個庫構建時,你也可以將其設定為
false
免得使用者自己匯入 CSS。提取 CSS 在開發環境模式下是預設不開啟的,因為它和 CSS 熱過載不相容。然而,你仍然可以將這個值顯性地設定為
true
在所有情況下都強制提取。
#css.sourceMap
-
Type:
boolean
-
Default:
false
是否為 CSS 開啟 source map。設定為
true
之後可能會影響構建的效能。
#css.loaderOptions
-
Type:
Object
-
Default:
{}
向 CSS 相關的 loader 傳遞選項。例如:
module.exports = { css: { loaderOptions: { css: { // 這裡的選項會傳遞給 css-loader }, postcss: { // 這裡的選項會傳遞給 postcss-loader } } } }
支援的 loader 有:
另外,也可以使用
scss
選項,針對scss
語法進行單獨配置(區別於sass
語法)。更多細節可查閱:向前處理器 Loader 傳遞選項
提示
相比於使用
chainWebpack
手動指定 loader 更推薦上面這樣做,因為這些選項需要應用在使用了相應 loader 的多個地方。
#devServer
-
Type:
Object
所有
webpack-dev-server
的選項都支援。注意:- 有些值像
host
、port
和https
可能會被命令列引數覆寫。 - 有些值像
publicPath
和historyApiFallback
不應該被修改,因為它們需要和開發伺服器的 publicPath 同步以保障正常的工作。
- 有些值像
#devServer.proxy
-
Type:
string | Object
如果你的前端應用和後端 API 伺服器沒有執行在同一個主機上,你需要在開發環境下將 API 請求代理到 API 伺服器。這個問題可以通過
vue.config.js
中的devServer.proxy
選項來配置。devServer.proxy
可以是一個指向開發環境 API 伺服器的字串:module.exports = { devServer: { proxy: 'http://localhost:4000' } }
這會告訴開發伺服器將任何未知請求 (沒有匹配到靜態檔案的請求) 代理到
http://localhost:4000
。如果你想要更多的代理控制行為,也可以使用一個
path: options
成對的物件。完整的選項可以查閱 http-proxy-middleware 。module.exports = { devServer: { proxy: { '/api': { target: '<url>', ws: true, changeOrigin: true }, '/foo': { target: '<other_url>' } } } }
#parallel
-
Type:
boolean
-
Default:
require('os').cpus().length > 1
是否為 Babel 或 TypeScript 使用
thread-loader
。該選項在系統的 CPU 有多於一個核心時自動啟用,僅作用於生產構建。
#pwa
-
Type:
Object
向 PWA 外掛傳遞選項。
#pluginOptions
-
Type:
Object
這是一個不進行任何 schema 驗證的物件,因此它可以用來傳遞任何第三方外掛選項。例如:
module.exports = { pluginOptions: { foo: { // 外掛可以作為 `options.pluginOptions.foo` 訪問這些選項。 } } }
#Babel
Babel 可以通過 babel.config.js
進行配置。
提示
Vue CLI 使用了 Babel 7 中的新配置格式 babel.config.js
。和 .babelrc
或 package.json
中的 babel
欄位不同,這個配置檔案不會使用基於檔案位置的方案,而是會一致地運用到專案根目錄以下的所有檔案,包括 node_modules
內部的依賴。我們推薦在 Vue CLI 專案中始終使用 babel.config.js
取代其它格式。
所有的 Vue CLI 應用都使用 @vue/babel-preset-app
,它包含了 babel-preset-env
、JSX 支援以及為最小化包體積優化過的配置。通過它的文件可以查閱到更多細節和 preset 選項。
同時查閱指南中的 Polyfill 章節。
#ESLint
ESLint 可以通過 .eslintrc
或 package.json
中的 eslintConfig
欄位來配置。
更多細節可查閱 @vue/cli-plugin-eslint。
#TypeScript
TypeScript 可以通過 tsconfig.json
來配置。
更多細節可查閱 @vue/cli-plugin-typescript。
#單元測試
#Jest
更多細節可查閱 @vue/cli-plugin-unit-jest。
#Mocha (配合 mocha-webpack
)
更多細節可查閱 @vue/cli-plugin-unit-mocha。
#E2E 測試
#Cypress
更多細節可查閱 @vue/cli-plugin-e2e-cypress。
#Nightwatch
更多細節可查閱 @vue/cli-plugin-e2e-nightwatch。