1. 程式人生 > 其它 >vue.config.js 學習記錄

vue.config.js 學習記錄

Vue-cli4 將webpack 深度整合,不對外展示webpack 具體配置,在vue.config.js 中可以更改配置:

Vue.config.js 的基本內容為:

module.exports = {
   publicPath: '/smart-dispatch-h5/', // 專案根路徑
     outputDir: 'dist', //  生產環境構建檔案的目錄
     assetsDir: 'static', //  outputDir 的靜態資源 (js、css、img、fonts) 目錄
     lintOnSave: !IS_PROD,
   productionSourceMap: 
false, // 如果你不需要生產環境的 source map,可以將其設定為 false 以加速生產環境構建。 devServer: { // 本地開發相關配置 port: 9020, // open: false, // 啟動後開啟瀏覽器 overlay: { // 當出現編譯器錯誤或警告時,在瀏覽器中顯示全屏覆蓋層 warnings: false, errors: false }, proxy: { '/proxy1/adm/': {
target:
'http://192.168.0.xx:xxxx/', changeOrigin: true }, } }, css: {}, // 如果 configureWebpack 是一個物件,則會通過 webpack-merge 合併到最終的配置中。 // 如果這個值是一個函式,則會接收被解析的配置作為引數。該函式既可以修改配置並不返回任何東西,也可以返回一個被克隆或合併過的配置版本。 configureWebpack: {}, // chainWebpack是一個函式,會接收一個基於 webpack-chain
ChainableConfig 例項。允許對內部的 webpack 配置進行更細粒度的修改。
chainWebpack: {}
}

 

 productionSourceMap設定生產環境的 source map 開啟與關閉。

    Type: boolean

    Default: true

 什麼是 source map?

    source map 直譯過來就是資源地圖。所以,source map的作用就是定位。source map定位的時瀏覽器控制檯輸出語句在專案檔案的位置。

 

   可以看出,開啟productionSourceMap後,瀏覽器控制檯明確的告訴我們test這條結果的輸出語句在main.js的20行。這就是source map的作用,對於開發人員差錯時非常有用的。

 

 

prefetching:webpack4.6.0以上支援prefetching 特性

        prefetch 是一種 resource hint,用來告訴瀏覽器在頁面載入完成後,利用空閒時間提前獲取使用者未來可能會訪問的內容。這樣子,豈不是和路由懶載入的理念衝突了嗎?

   那就把prefetch給關了吧:

 

 

// vue.config.js
module.exports = {
  chainWebpack: config => {
    // 移除 prefetch 外掛
    config.plugins.delete('prefetch')
    // 移除 preload 外掛
    config.plugins.delete('preload')
  }
}

preloading:webpack4.6.0以上支援preloading 特性

    preloading是一種 resource hint,用來指定頁面載入後很快會被用到的資源,所以在頁面載入的過程中,我們希望在瀏覽器開始主體渲染之前儘早 preload。

 錯誤的使用webpackPreload實際上會影響效能,因此要謹慎使用。

 

 如果把一個體積巨大的資源放在最高優先順序載入,頁面可能會長時間空白,使用者體驗體驗非常差,因此,謹慎使用。

總結:

      懶載入優化了首屏載入的速率

      prefetch預載入優化了子頁面載入的速率

 

   ④ preserveWhitespace 是 compilerOptions物件中的屬性之一。如果設定為false,標籤之間的空白將會忽略,這可能會導致效能稍好,但可能會影響嵌入式元素的佈局。true表示編譯的渲染函式將會保留HTML標記之間的所有空白字元。

      如何使用?

      在vue.config.js檔案中新增如下程式碼:

 

// set preserveWhitespace
config.module
  .rule('vue')
  .use('vue-loader')
  .loader('vue-loader')
  .tap(options => {
    options.compilerOptions.preserveWhitespace = true
    return options
  })
  .end()

 

  runtimeChunk

    根據路由驅動頁面的 runtime 程式碼預設情況是包含在 build 後的 app.hash.js 內的,如果我們改動其他路由,就會導致 runtime 程式碼改變。從而不光我們改動的路由對應的頁面 js 會變,含 runtime 程式碼的 app.hash.js 也會變,對使用者體驗是非常不友好的。

    為了解決這個問題要設定 runtime 程式碼單獨抽取打包。

 

   script-ext-html-webpack-plugin

   但是 runtime 程式碼由於只是驅動不同路由頁面的關係,程式碼量比較少,請求 js 的時間都大於執行時間了,所以使用 script-ext-html-webpack-plugin 外掛將其內鏈在 index.html 中比較友好。所有這兩個一般配合使用。

  chainWebpack:
    config
    .plugin('ScriptExtHtmlWebpackPlugin')
    .after('html')
    .use('script-ext-html-webpack-plugin', [
      {
        // `runtime` must same as runtimeChunk name. default is `runtime`
                 inline: /runtime\..*\.js$/
      }
    ])
    .end()
    config.optimization.runtimeChunk('single')

 splitChunks

   如果使用了某些長期不會改變的庫,像 element-ui ,打包完成有 600 多 KB ,包含在預設 vendor 中顯然不合適,每次使用者都要載入這麼大的檔案體驗不好,所以要單獨打包:

    config.optimization.splitChunks({
               chunks: 'all',
       cacheGroups: {
               // cacheGroups 下可以可以配置多個組,每個組根據 test 設定條件,符合 test 條件的模組
          commons: {
                         name: 'chunk-commons',
            test: resolve('src/components'),
             minChunks: 3, //  被至少用三次以上打包分離
                          priority: 5, // 優先順序
                          reuseExistingChunk: true // 表示是否使用已有的 chunk,如果為 true 則表示如果當前的 chunk 包含的模組已經被抽取出去了,那麼將不會重新生成新的。
          },
                     node_vendors: {
                          name: 'chunk-libs',
            chunks: 'initial', // 只打包初始時依賴的第三方
                          test: /[\\/]node_modules[\\/]/,
            priority: 10
          },
                    vantUI: {
                         name: 'chunk-vantUI', // 單獨將 vantUI 拆包
                         priority: 20, // 數字大權重到,滿足多個 cacheGroups 的條件時候分到權重高的
                         test: /[\\/]node_modules[\\/]_?vant(.*)/
          }
              }
      })

⑦ 配置多個代理的注意點

   在Vue專案的開發過程中,為了本地除錯方便,我們通常會在 vue.config.js 中配置 devServer 來在本地啟動一個伺服器,在這個選項中,我們會配置proxy 屬性來將指向到本地的請求(例如: /api/action) 代理到後端的開發伺服器上(例如: http://xxx.xxx.xxx/api/action)

在這個配置中,要注意以下兩點:

介面地址有重疊地址時,將匹配度低的放在後面。

例如:

 

* 將 / 匹配到 192.191.1.1;

* 將 /api 匹配到 192.191.1.2

* 將 /api/action 匹配到 192.191.1.3

如果我們像下面一樣書寫:

那麼所有到/, /api和 /api/action 的請求將全部被代理到 192.191.1.1 上面去。

原因是這裡的匹配實際上是一個正則匹配的過程,當我們請求 /api 時,首先讀取到了配置項中的第一個,拿配置中的 / 去匹配請求中的 /api , 發現請求的/api 中包含配置項/, 匹配成功,直接將請求代理到了 192.191.1.1 上面去, 對/api/action的匹配也同理。

 

也就是說,它的匹配規則是: 拿配置項中的地址去匹配請求中的地址,如果請求中的地址中包含配置中的地址,則匹配成功,否則,拿下一個配置項繼續匹配。

 

所以,配置中的地址與請求地址中匹配的字元越少,匹配度越低。 上例中配置中的地址(/)與請求地址(/api)只有一個字元是匹配的,所以匹配度低。

所以我們正確的寫法應該是:

 2. 環境配置

  .env.production 線上環境打包 // vue-cli-service serve

  .env.test  測試環境打包 // vue-cli-service test:unit

  .env.development 開發環境打包  // vue-cli-service build 和 vue-cli-service test:e2eo

  .emv.staging 使用mode 打包  -- vue-cli-service -- mode staging

  .env.local. 本地環境變數,會被 git 忽略上傳