最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue2中項(xiàng)目打包優(yōu)化的方法詳解

 更新時(shí)間:2025年02月17日 16:14:44   作者:秋天的一陣風(fēng)  
這篇文章主要為大家詳細(xì)介紹了vue2項(xiàng)目的打包優(yōu)化方法,包括減少打包代碼體積和提升編譯時(shí)間等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

之前的開(kāi)發(fā)工作中對(duì)vue2項(xiàng)目也有做過(guò)不同的優(yōu)化,但是都比較零散且沒(méi)有系統(tǒng)化的記錄下來(lái)。

正好最近接手了一個(gè)老項(xiàng)目,雖然項(xiàng)目不大性能也還過(guò)得去,但是我覺(jué)得可優(yōu)化的空間還是比較多的。

所以也趁此機(jī)會(huì)能把vue打包,編譯,啟動(dòng)時(shí)間的一些優(yōu)化方法記錄下。在閱讀之前你需要確保以下幾點(diǎn):

  • 本項(xiàng)目是基于vue2.x + vue-cli4.x的,不適用于vue3.x+vite項(xiàng)目
  • 本文一些配置的寫(xiě)法可能因插件或者loader版本差異不同而報(bào)錯(cuò),如出現(xiàn)錯(cuò)誤,請(qǐng)查閱官方文檔最新配置信息
  • 文章不會(huì)一次性把全部配置代碼貼出來(lái),目的是為了讓讀者們能夠真正熟悉每一項(xiàng)優(yōu)化配置
  • 文章介紹了多種優(yōu)化方式,希望讀者不要全部照抄,而是應(yīng)該根據(jù)自己項(xiàng)目和實(shí)際情況進(jìn)行選擇配置。沒(méi)有最完美的配置,只有最適合自己的配置~

好了,閑話不多說(shuō)了。在開(kāi)始之前我們先看下打包體積大小和時(shí)間,這樣有利于我們優(yōu)化后進(jìn)行對(duì)比。

優(yōu)化前

1. 打包體積:6.38M

2. 冷啟動(dòng)耗費(fèi)時(shí)間:61.39秒

3. 編譯耗費(fèi)時(shí)間:50.13秒

準(zhǔn)備工作

1. 安裝speed-measure-webpack-plugin

npm i speed-measure-webpack-plugin

const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

module.exports = { 
configureWebpack: {
 plugins: [
      new BundleAnalyzerPlugin(),
      new SpeedMeasurePlugin(),
   ]
   }
};

2. 安裝webpack-bundle-analyzer

npm i webpack-bundle-analyzer

 const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; 

module.exports = { 
configureWebpack: {
plugins: [
   + new BundleAnalyzerPlugin(),
     new SpeedMeasurePlugin(),
  ]
  }
};

一、減少打包代碼體積

1. 使用externals和CDN

externals允許我們?cè)诰幾g過(guò)程中排除那些已經(jīng)在運(yùn)行時(shí)環(huán)境存在的全局變量或CDN加載的庫(kù),而不是將它們包含在最終的bundle文件內(nèi)。

當(dāng)配置了externals字段后,Webpack會(huì)在生成的bundle中引用這些全局變量,而不是把它們實(shí)際打包進(jìn)去。這樣做的好處有:

(1)減小bundle體積:如果你的應(yīng)用依賴了一些大型第三方庫(kù)(如jQuery、Vue自身、React、大型UI框架等),并且你確定用戶在訪問(wèn)你的應(yīng)用時(shí)已經(jīng)通過(guò)其他方式(比如在HTML頭部引入CDN鏈接)加載了這些庫(kù),那么就沒(méi)有必要在每個(gè)用戶的請(qǐng)求中重復(fù)加載這些庫(kù)。

(2)加快頁(yè)面加載速度:由于第三方庫(kù)直接從CDN加載,通常情況下CDN會(huì)提供更快的加載速度和更好的緩存機(jī)制。

externals缺點(diǎn):直接在html內(nèi)引入的,失去了按需引入的功能,只能引入組件庫(kù)完整的js和css

// vue.config.js
 configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name,
    resolve: {
      alias: {
        '@': resolve('src'),
      },
    },
    externals: {
      axios: 'axios',
      'vue-router': 'VueRouter',
      'vue': 'Vue',
      'Vuex': 'Vuex',
      'element-ui': 'ELEMENT',
    }
  }
// index.html
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.18.1/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
    <script src="https://unpkg.com/vuex@3.1.0/dist/vuex.global.js"></script>
    <script src="https://unpkg.com/vue-router@3.0.6/dist/vue-router.js"></script>
    <script src="https://unpkg.com/element-ui@2.15.12/lib/index.js"></script>

2. 圖片壓縮

使用image-webpack-loader

  npm i image-webpack-loader 
  
  chainWebpack: config => {
    config.module
      .rule('images')
      .test(/.(png|jpe?g|gif|svg)(?.*)?$/)
      .use('image-webpack-loader')
        .loader('image-webpack-loader')
        .options({
          bypassOnDebug: true })
        .end()
  }, 

在安裝image-webpack-loader會(huì)遇到一個(gè)大坑就是安裝失敗,如果安裝或者使用過(guò)程中遇到錯(cuò)誤請(qǐng)嘗試以下步驟解決

1.刪除: npm uninstall image-webpack-loader

2.使用cnpm重新安裝:cnpm install image-webpack-loader

兩種方式對(duì)比

壓縮網(wǎng)站:一個(gè)從600KB壓縮到了144KB,一個(gè)從98KB壓縮到了18KB

image-webpack-loader插件: 一個(gè)從600KB壓縮到了148KB,一個(gè)從98KB壓縮到了10KB

3.啟用gzip壓縮

在Vue.js項(xiàng)目中開(kāi)啟Gzip壓縮是一種常見(jiàn)的性能優(yōu)化手段,它能夠顯著減小靜態(tài)資源(如JavaScript、CSS和HTML文件)在網(wǎng)絡(luò)傳輸過(guò)程中的大小,從而提高頁(yè)面加載速度。

線上的項(xiàng)目,一般都會(huì)結(jié)合構(gòu)建工具 webpack 插件或服務(wù)端配置 nginx,來(lái)實(shí)現(xiàn) http 傳輸?shù)?gzip 壓縮,目的就是把服務(wù)端響應(yīng)文件的體積盡量減小,優(yōu)化返回速度。html、js、css資源,使用 gzip 后通??梢詫Ⅲw積壓縮70%以上

const CompressionWebpackPlugin = require("compression-webpack-plugin");
  chainWebpack: config => {
    // 生產(chǎn)環(huán)境,開(kāi)啟js\css壓縮
    if (process.env.NODE_ENV === "production") {
      config.plugin("compressionPlugin").use(
        new CompressionWebpackPlugin({
          test: /.(js|css|less)$/, // 匹配文件名
          threshold: 10240, // 對(duì)超過(guò)10k的數(shù)據(jù)壓縮
          minRatio: 0.8,
          deleteOriginalAssets: true // 刪除源文件
        })
      );
    }
  }

服務(wù)器配置: Gzip壓縮后的文件需要服務(wù)器支持并正確返回給客戶端。對(duì)于Nginx服務(wù)器,你需要在Nginx的配置文件中添加如下內(nèi)容以啟用Gzip:

//nginx.conf

http { 
    gzip on;
    gzip_vary on; 
    gzip_min_length 1k; 
    gzip_comp_level 6; 
    gzip_buffers 16 8k; 
    gzip_proxied any; 
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 

}

4.uglyifyjs

打包后的 JavaScript 代碼進(jìn)行混淆壓縮,從而減少文件大小以優(yōu)化網(wǎng)頁(yè)加載速度。這個(gè)插件基于 UglifyJS 庫(kù),可以執(zhí)行多種優(yōu)化操作,包括但不限于刪除無(wú)用代碼、簡(jiǎn)化變量名、內(nèi)聯(lián)函數(shù)調(diào)用等。

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

  config.plugins.push(
          new UglifyJsPlugin({
              uglifyOptions: {
                  compress: {
                      drop_debugger: true,//生產(chǎn)環(huán)境自動(dòng)刪除debugger
                      drop_console: true, //生產(chǎn)環(huán)境自動(dòng)刪除console
                  },
                  warnings: false,
              },
              sourceMap: false,   //關(guān)掉sourcemap 會(huì)生成對(duì)于調(diào)試的完整的.map文件,但同時(shí)也會(huì)減慢打包速度
              parallel: true, //使用多進(jìn)程并行運(yùn)行來(lái)提高構(gòu)建速度。默認(rèn)并發(fā)運(yùn)行數(shù):os.cpus().length - 1。
          }),

5.路由懶加載

Vue.js 中的路由懶加載是一種優(yōu)化技術(shù),它允許我們?cè)谟脩魧?dǎo)航到特定路由時(shí)異步加載對(duì)應(yīng)的組件,而不是在應(yīng)用程序啟動(dòng)時(shí)一次性加載所有組件。這樣可以顯著減少初始加載時(shí)間、減小打包后的文件體積,并提升用戶體驗(yàn)。

// 使用 `import()` 動(dòng)態(tài)導(dǎo)入
// router/index.js 

import Vue from 'vue' 
import Router from 'vue-router'
Vue.use(Router) 
export default new Router({ 
    routes: [ 
    { path: '/about', component: () => import('@/views/About.vue'), // 懶加載 About 組件 }, 
    { path: '/contact', component: () => import(/* webpackChunkName: "contact" */ '@/views/Contact.vue'),  // 命名代碼塊 
    }, 
  ],
})
// 使用異步組件聲明
// router/index.js 
    import Vue from 'vue' 
    import Router from 'vue-router' 
    Vue.use(Router) 

export default new Router({ 
   routes: [ { 
   path: '/example', 
       component: { 
       // 使用異步組件定義 
       async component() { 
       const {  default: ExampleComponent  } = await import('@/views/Example.vue'); 
       return ExampleComponent; 
       }, 
     }, 
   }, 
   // 其他路由... 
   ],
   })

這兩種方式都可以確保當(dāng)用戶首次訪問(wèn)相應(yīng)路由時(shí),Vue Router 才會(huì)去加載對(duì)應(yīng)的組件資源。這樣不僅提高了應(yīng)用的響應(yīng)速度,也降低了初次加載時(shí)對(duì)網(wǎng)絡(luò)帶寬的需求。

6. preload預(yù)加載

瀏覽器自己提供的一種機(jī)制,在頁(yè)面加載的時(shí)候,預(yù)先請(qǐng)求資源,一邊在需要的時(shí)候可以更快的獲取這些資源。

也就是設(shè)置文件中的黑名單,配置文件,添加一個(gè)數(shù)組,用來(lái)儲(chǔ)存黑名

npm install --save-dev script-ext-html-webpack-plugin


const blackList = ['script1.js', 'script2.js'];


plugins: [
  new ScriptExtHtmlWebpackPlugin({
    preload: {
      test: /.js$/,
      excludeChunks: blackList
    }
  })
]

// 刪除文件中各個(gè)腳本都在使用的腳本命令,然后統(tǒng)一在html頁(yè)面中進(jìn)行封裝,需要用到的時(shí)候,去html頁(yè)面中進(jìn)行獲取,這樣就可以減少http的請(qǐng)求

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

7. DllPlugin 動(dòng)態(tài)鏈接庫(kù)

DllPlugin 與 externals 的作用相似,都是將依賴抽離出去,節(jié)約打包時(shí)間。區(qū)別是 DllPlugin 是將依賴單獨(dú)打包,這樣以后每次只構(gòu)建業(yè)務(wù)代碼,而 externals 是將依賴轉(zhuǎn)化為 CDN 的方式引入

當(dāng)公司沒(méi)有很好的 CDN 資源或不支持 CDN 時(shí),就可以考慮使用 DllPlugin ,替換掉 externals

//1. 創(chuàng)建 dll.config.js 配置文件
import { DllPlugin } from "webpack";

export default {
    // 需要抽離的依賴
    entry: {
        vendor: ["vue", "vue-router", "axios", "echarts"]
    },
    mode: "production",
    optimization: {
        splitChunks: {
            cacheGroups: {
                vendor: {
                    chunks: "all",
                    name: "vendor",
                    test: /node_modules/
                }
            }
        }
    },
    output: {
        filename: "[name].dll.js", // 輸出路徑和文件名稱(chēng)
        library: "[name]", // 全局變量名稱(chēng):其他模塊會(huì)從此變量上獲取里面模塊
        path: AbsPath("dist/static") // 輸出目錄路徑
    },
    plugins: [
        new DllPlugin({
            name: "[name]", // 全局變量名稱(chēng):減小搜索范圍,與output.library結(jié)合使用
            path: AbsPath("dist/static/[name]-manifest.json") // 輸出目錄路徑
        })
    ]
};
// package.json 配置腳本

"build:dll": "webpack --config ./dll.config.js",
// 使用 `DllReferencePlugin` 將打包生成的dll文件,引用到需要的預(yù)編譯的依賴上來(lái),并通過(guò) `html-webpack-tags-plugin` 在打包時(shí)自動(dòng)插入dll文件

// vue.config.js 配置如下

import { DllReferencePlugin } from "webpack";
import HtmlTagsPlugin from "html-webpack-tags-plugin";

export default {
  configureWebpack: {
    plugins: [
      new DllReferencePlugin({
        manifest: AbsPath("dist/static/vendor-manifest.json") // manifest文件路徑
      }),
      new HtmlTagsPlugin({
        append: false, // 在生成資源后插入
        publicPath: "/", // 使用公共路徑
        tags: ["static/vendor.dll.js"] // 資源路徑
      })
    ]
  }
};

先運(yùn)行 npm run build:dll 打包生成依賴文件,以后只用運(yùn)行 npm run build 構(gòu)建業(yè)務(wù)代碼即可

8. 處理Moment中語(yǔ)言包

一般如果項(xiàng)目引入了moment.js或者引入的某個(gè)第三方插件包使用了moment.js, 通常情況下,會(huì)全部引入了所有語(yǔ)言包,體積過(guò)大,我們需要對(duì)其進(jìn)行處理。

configureWebpack: config => { 
    config.plugins.push(new webpack.ContextReplacementPlugin(/moment[/\]locale$/, /zh-cn/)) 
}

9. 使用dayjs代替momentjs

Day.js 和 Moment.js 是 JavaScript 中兩個(gè)非常流行的時(shí)間日期處理庫(kù),它們具有相似的API設(shè)計(jì)和功能特性,但又存在一些關(guān)鍵的區(qū)別:

Moment.js

  • 功能全面:Moment.js 提供了豐富的日期時(shí)間操作功能,包括解析、格式化、比較、計(jì)算(加減日期)、時(shí)區(qū)轉(zhuǎn)換等。
  • 體積較大:Moment.js 的大小相對(duì)較大,尤其是包含所有功能的情況下。在資源優(yōu)化方面可能存在劣勢(shì),特別是在移動(dòng)應(yīng)用或?qū)虞d速度有嚴(yán)格要求的項(xiàng)目中。
  • 國(guó)際化支持:Moment.js 提供強(qiáng)大的國(guó)際化支持,可以方便地處理不同語(yǔ)言環(huán)境下的日期格式和顯示問(wèn)題。

Day.js

  • 輕量級(jí):Day.js 設(shè)計(jì)初衷是為了提供一個(gè)與 Moment.js API 兼容但更輕量的替代方案,其體積比 Moment.js 小得多,有助于減少打包后的文件大小,提高頁(yè)面加載速度。
  • 性能優(yōu)化:由于其輕量化的設(shè)計(jì),Day.js 在性能上通常會(huì)優(yōu)于 Moment.js,尤其是在內(nèi)存占用和執(zhí)行效率方面。
  • 同樣全面的功能:盡管 Day.js 更輕巧,但它仍然提供了大部分 Moment.js 的核心功能,如解析、格式化、比較等操作,并且也支持插件擴(kuò)展以實(shí)現(xiàn)更多功能。
  • 國(guó)際化支持:同樣,Day.js 也具備良好的國(guó)際化支持,通過(guò)引入相應(yīng)的語(yǔ)言包即可實(shí)現(xiàn)多種語(yǔ)言環(huán)境下的日期處理。

總結(jié)起來(lái),如果你需要一個(gè)功能強(qiáng)大、歷史悠久且廣泛使用的日期庫(kù),Moment.js 是一個(gè)很好的選擇。然而,如果對(duì)代碼大小和性能有較高要求,或者只是進(jìn)行基礎(chǔ)的日期時(shí)間操作,Day.js 可能更適合你的項(xiàng)目需求。隨著技術(shù)的發(fā)展,越來(lái)越多的新項(xiàng)目可能會(huì)傾向于使用 Day.js 這種更為現(xiàn)代和輕量的解決方案。

10. splitChunks單獨(dú)打包第三方包

項(xiàng)目中的第三方庫(kù)默認(rèn)會(huì)被打包到一個(gè)文件名含vendors的bundle中,如果你的項(xiàng)目里面引用的第三方庫(kù)過(guò)多,那么你的vendors就會(huì)很臃腫,文件也會(huì)變大,網(wǎng)站加載該文件的時(shí)候就越耗時(shí),從而影響網(wǎng)站性能。

這個(gè)時(shí)候我們可以考慮把一些比較大的第一方庫(kù)從vendors中分離出來(lái),或者直接配置cdn。這里我們主要來(lái)講如何在vue-cli4中單獨(dú)打包第三方庫(kù)文件從而實(shí)現(xiàn)bundle分割,減小vendors文件體積的目的。

常用參數(shù):

  • -   minSize(默認(rèn)是30000):形成一個(gè)新代碼塊最小的體積
  • -   minChunks(默認(rèn)是1):在分割之前,這個(gè)代碼塊最小應(yīng)該被引用的次數(shù)(譯注:保證代碼塊復(fù)用性,默認(rèn)配置的策略是不需要多次引用也可以被分割)
  • -   maxInitialRequests(默認(rèn)是3):一個(gè)入口最大的并行請(qǐng)求數(shù)
  • -   maxAsyncRequests(默認(rèn)是5):按需加載時(shí)候最大的并行請(qǐng)求數(shù)。
  • -   chunks (默認(rèn)是async) :initial、async和all
  • -   test: 用于控制哪些模塊被這個(gè)緩存組匹配到。原封不動(dòng)傳遞出去的話,它默認(rèn)會(huì)選擇所有的模塊??梢詡鬟f的值類(lèi)型:RegExp、String和Function
  • -   name(打包的chunks的名字):字符串或者函數(shù)(函數(shù)可以根據(jù)條件自定義名字)
  • -   priority :緩存組打包的先后優(yōu)先級(jí)。
module.exports = {
  configureWebpack: config => {
    if (progress.env.NODE_ENV === 'production') {
      config.optimization = {
        splitChunks: {
          cacheGroups: {
            common: {
              name: "chunk-common",
              chunks: "initial",
              minChunks: 2,
              maxInitialRequests: 5,
              minSize: 0,
              priority: 1,
              reuseExistingChunk: true,
              enforce: true
            },
            vendors: {
              name: "chunk-vendors",
              test: /[\\/]node_modules[\\/]/,
              chunks: "initial",
              priority: 2,
              reuseExistingChunk: true,
              enforce: true
            },
            elementUI: {
              name: "chunk-hui",
              test: /[\\/]node_modules[\\/]hui[\\/]/,
              chunks: "all",
              priority: 3,
              reuseExistingChunk: true,
              enforce: true
            },
            echarts: {
              name: "chunk-echarts",
              test: /[\\/]node_modules[\\/](vue-)?echarts[\\/]/,
              chunks: "all",
              priority: 4,
              reuseExistingChunk: true,
              enforce: true
            }
          }
        }
      };
    }
  },
  chainWebpack: config => {
    if (progress.env.NODE_ENV === 'production') {
      config.optimization.delete("splitChunks");
    }
    return config;
  }
};

11.production環(huán)境不生成SourceMap

module.exports = {
  lintOnSave: false,
  productionSourceMap: process.env.NODE_ENV !== "production", //打包不生成map文件
}

12. 添加別名 alias

通常項(xiàng)目較大的時(shí)候我們會(huì)引入別名來(lái)方便引入,添加別名方法如下:

module.exports = { 
    chainWebpack: config => { // 添加別名 
        config.resolve.alias 
        .set("vue$", "vue/dist/vue.esm.js") 
        .set("@", resolve("src")) 
        .set("@assets", resolve("src/assets")) 
        .set("@scss", resolve("src/assets/scss")) 
        .set("@components", resolve("src/components")) 
        .set("@plugins", resolve("src/plugins")) 
        .set("@views", resolve("src/views")) 
        .set("@router", resolve("src/router")) 
        .set("@store", resolve("src/store")) 
        .set("@layouts", resolve("src/layouts")) 
        .set("@static", resolve("src/static")); 
        } 
     };

二、編譯時(shí)間提升

1. 緩存 hard-source-webpack-plugin

npm i hard-source-webpack-plugin

const HardSourceWebpackPlugin = require("hard-source-webpack-plugin")

 plugins: [
      new BundleAnalyzerPlugin(),
      new SpeedMeasurePlugin(),
      new HardSourceWebpackPlugin()
   ],
   
   //提升第二次運(yùn)行時(shí)間

2. Happywebpack

由于運(yùn)行在 Node.js 之上的 webpack 是單線程模型的,我們需要 webpack 能同一時(shí)間處理多個(gè)任務(wù),發(fā)揮多核 CPU 電腦的威力

HappyPack 就能實(shí)現(xiàn)多線程打包,它把任務(wù)分解給多個(gè)子進(jìn)程去并發(fā)的執(zhí)行,子進(jìn)程處理完后再把結(jié)果發(fā)送給主進(jìn)程,來(lái)提升打包速度

npm install HappyPack -D

const HappyPack = require('happypack');
const os = require('os');
// 開(kāi)辟一個(gè)線程池,拿到系統(tǒng)CPU的核數(shù),happypack 將編譯工作利用所有線程
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });

module.exports = {
  configureWebpack: {
     plugins: [
       new HappyPack({
        id: 'happybabel',
        loaders: ['babel-loader'],
        threadPool: happyThreadPool
      })
     ]
  }
}

注意:

1.由于測(cè)試項(xiàng)目較小,打包時(shí)間縮短的不算太多。實(shí)測(cè)發(fā)現(xiàn)越是復(fù)雜的項(xiàng)目,HappyPack 對(duì)打包速度的提升越明顯.

2.由于HappyPack作者已經(jīng)停止了更新維護(hù),現(xiàn)在更多的是推薦使用 thread-loader

3. thread-loader —— 開(kāi)啟多線程優(yōu)化

thread-loader是官方維護(hù)的多進(jìn)程loader,功能類(lèi)似于happypack,也是通過(guò)開(kāi)啟子任務(wù)來(lái)并行解析文件,從而提高構(gòu)建速度。

把這個(gè)loader放在其他loader前面。不過(guò)該loader是有限制的。示例:

  • loader無(wú)法發(fā)出文件。
  • loader不能使用自定義加載器API。
  • loader無(wú)法訪問(wèn)網(wǎng)頁(yè)包選項(xiàng)。

每個(gè)worker都是一個(gè)單獨(dú)的node.js進(jìn)程,其開(kāi)銷(xiāo)約為600毫秒。還有進(jìn)程間通信的開(kāi)銷(xiāo)。在小型項(xiàng)目中使用thread-loader可能并不能優(yōu)化項(xiàng)目的構(gòu)建速度,反而會(huì)拖慢構(gòu)建速度,所以使用該loader時(shí)需要明確項(xiàng)目構(gòu)建構(gòu)成中真正耗時(shí)的過(guò)程。

使用 thread-loader 時(shí),通常會(huì)將其配置在需要進(jìn)行大量計(jì)算或者時(shí)間消耗較大的Loader之前,如Babel這樣的轉(zhuǎn)譯Loader。通過(guò)創(chuàng)建額外的子進(jìn)程處理這些耗時(shí)任務(wù),主線程能夠更好地并發(fā)執(zhí)行其他構(gòu)建步驟,從而提升整體性能。

// vue.config.js

module.exports = {
  chainWebpack: config => {
    config.module.rule('vue')
      .use('thread-loader')
      .loader('thread-loader')
      .end()
      // 在目標(biāo) loader 前插入 thread-loader
      .use('vue-loader')
      .loader('vue-loader')
      .end()
  }
}

優(yōu)化后

1. 打包體積:1.41M

2. 添加HardSourceWebpackPlugin后,第二次啟動(dòng)耗費(fèi)時(shí)間:3.8秒

3. 編譯耗費(fèi)時(shí)間: 13.38s

以上就是Vue2中項(xiàng)目打包優(yōu)化的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue2打包優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue+SpringBoot使用WebSocket方式

    vue+SpringBoot使用WebSocket方式

    WebSocket是一種全雙工通信協(xié)議,通過(guò)HTTP升級(jí)機(jī)制建立連接,支持實(shí)時(shí)雙向數(shù)據(jù)傳輸,示例代碼展示了如何在Java Spring Boot和Vue.js中實(shí)現(xiàn)WebSocket服務(wù)和客戶端
    2025-02-02
  • Vue.js 單頁(yè)面多路由區(qū)域操作的實(shí)例詳解

    Vue.js 單頁(yè)面多路由區(qū)域操作的實(shí)例詳解

    這篇文章主要介紹了 Vue.js 單頁(yè)面多路由區(qū)域操作的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Vue中request.js封裝及調(diào)用示例詳解

    Vue中request.js封裝及調(diào)用示例詳解

    這篇文章主要為大家介紹了Vue中request.js封裝及調(diào)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 為什么Vue3.0使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)(defineProperty表示不背這個(gè)鍋)

    為什么Vue3.0使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)(defineProperty表示不背這個(gè)鍋)

    這篇文章主要介紹了為什么Vue3.0使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)?defineProperty表示不背這個(gè)鍋,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Vue項(xiàng)目中如何使用Axios封裝http請(qǐng)求詳解

    Vue項(xiàng)目中如何使用Axios封裝http請(qǐng)求詳解

    這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中如何使用Axios封裝http請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • vue實(shí)現(xiàn)懸浮球效果

    vue實(shí)現(xiàn)懸浮球效果

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)懸浮球效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue3 響應(yīng)式偵聽(tīng)與計(jì)算的實(shí)現(xiàn)

    Vue3 響應(yīng)式偵聽(tīng)與計(jì)算的實(shí)現(xiàn)

    這篇文章主要介紹了Vue3 響應(yīng)式偵聽(tīng)與計(jì)算的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Vue路由配置項(xiàng)和參數(shù)使用及說(shuō)明

    Vue路由配置項(xiàng)和參數(shù)使用及說(shuō)明

    文章介紹了Vue路由中query和params參數(shù)的傳遞與接收、命名路由簡(jiǎn)化跳轉(zhuǎn)、props配置參數(shù)、router-link的replace屬性、編程式導(dǎo)航、路由組件緩存及activated和deactivated兩個(gè)生命周期鉤子的用法
    2025-10-10
  • vue實(shí)現(xiàn)在線預(yù)覽pdf文件和下載(pdf.js)

    vue實(shí)現(xiàn)在線預(yù)覽pdf文件和下載(pdf.js)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)在線預(yù)覽pdf文件和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Vue.js遞歸組件構(gòu)建樹(shù)形菜單

    Vue.js遞歸組件構(gòu)建樹(shù)形菜單

    這篇文章主要介紹了用Vue.js遞歸組件構(gòu)建一個(gè)可折疊的樹(shù)形菜單的教學(xué)內(nèi)容,有興趣的朋友跟著學(xué)習(xí)下。
    2017-12-12

最新評(píng)論

巴楚县| 连南| 达拉特旗| 涞水县| 布拖县| 呼伦贝尔市| 南江县| 江川县| 定兴县| 江门市| 封开县| 东方市| 瓮安县| 永宁县| 巴中市| 随州市| 平阳县| 通化县| 肥乡县| 崇信县| 鹤庆县| 高陵县| 贡觉县| 邛崃市| 孟州市| 阜新市| 彩票| 托里县| 德阳市| 武义县| 浮山县| 庄浪县| 武冈市| 五常市| 花莲市| 灌阳县| 砀山县| 泽库县| 新乡市| 抚顺县| 双牌县|