Detailed explanation of optimization steps using vue-admin-template
This time I will bring you a detailed explanation of the optimization steps for using vue-admin-template. What are the precautions for using vue-admin-template optimization? The following is a practical case, let's take a look.
Preface
The company has several projects with backend management systems. In order to facilitate development, we chose the popular backend template in vue. Developed as a basic template. However, when I started using it, the author did not optimize this. When the project went online, I discovered that the packaged files were very large, with just one vendor having a volume of 770k (the picture below is the basic template, everything is No packaged file information is added):
can be analyzed through webpack-bundle-analyzer
. The volume mainly comes from the Ele.me UI ( The volume is 500k), because the split components were not partially introduced, causing webpack to package the entire component library. The second is vue itself, which has a size of 80k.
# Therefore, it is urgent to optimize its packaging.
Optimization
The main purposes of optimization are:
Speed up resource loading and reduce user waiting time and home page white screen time to improve user experience.
Speed up packaging and don’t waste time waiting for packaging.
To solve the first problem, many people will think that resource files can be placed on CDN. Yes, this time we will solve the loading problem through CDN.
CDN - Improve loading speed
More mature frameworks/component libraries like vue and element ui generally have free, high-speed, The public cdn is for developers to use. Since most users are in China, the bootcdn library is used this time. The popular resources of this library are relatively complete, available in various versions, and the domestic access speed is very fast, which is simply good news for developers.
Introduce vue and Ele.me components into index.html
.
nbsp;html> <meta> <meta> <title>vue-admin-template</title> <!-- 同时也要引入对应版本的 css --> <link> <p></p> <!-- built files will be auto injected --> <!-- 先引入 Vue --> <script></script> <!-- 引入组件库 --> <script></script> <script></script>
Because dependencies are introduced from outside, webpack needs to be informed of the source of dependencies when packaging.
Modifywebpack.base.conf.js
:
module.exports = { ... externals: { vue: 'Vue', 'element-ui':'ELEMENT' } }
Packaging it again can indeed greatly compress the packaging volume, from 700k to 130k:
But then there is a problem:
Obviously I am developing locally, but due to the introduction The online production version of the vue file is removed, so vue-dev-tools cannot be debugged.
Therefore, we need to adjust the webpack configuration again, webpack.base.conf.js
, and the js injected by webpack is always at the end, so we need html-webpack-include-assets-plugin
helps to inject app.js
and then inject the corresponding component library:
const HtmlWebpackIncludeAssetsPlugin = require('html-webpack-include-assets-plugin') const externals = { // 因为打包时,还没注入,所以这里要去掉。 // 'element-ui':'ELEMENT' } // 生产环境中使用生产环境的 vue // 开发环境继续使用本地 node_modules 中的 vue if (process.env.NODE_ENV === 'production') { externals['vue'] = 'Vue' // 如发现打包时依旧将 element-ui 打包进入 vendor,可以在打包时将其加入外部依赖。 externals['element-ui'] = 'ELEMENT' } // 生产环境默认注入 vue // 开发环境中不注入 const defaultJS = process.env.NODE_ENV === 'production' ? [{ path: 'https://cdn.bootcss.com/vue/2.4.2/vue.min.js', type: 'js' }] : [] const plugins = [ new HtmlWebpackIncludeAssetsPlugin({ assets: defaultJS.concat([ { path: 'https://cdn.bootcss.com/element-ui/2.3.2/index.js', type: 'js' }, { path: 'https://cdn.bootcss.com/element-ui/2.3.2/locale/zh-CN.min.js', type: 'js' }, ]), // 是否在 webpack 注入的 js 文件后新增?true 为 append, false 为 prepend。 // 生产环境中,这些 js 应该先加载。 append: process.env.NODE_ENV !== 'production', publicPath: '', }) ] module.exports = { ... externals, plugins, ... }
OK. At this time, both packaging and The final size can also be debugged using vue-dev-tool in development mode.
DLL - Improve packaging speed
# Front-ends that often package will find that many times, in order to fix certain bugs (such as promise in ie bug under Safari), and a new polyfill was introduced. However, after packaging, it was found that the hash value of the vendor has changed, and the entire vendor only added a new dependency of es6-promise
, but it cost The price is that the previously packaged vendor needs to be discarded, and when the user revisits, they need to pull a brand new vendor again, which is a bit expensive.
At this time, using dllPlugin packaging has advantages. It can package some basic dependent modules together first. When officially packaging, these modules can be skipped and no longer packaged into the vendor repeatedly. This improves the packaging speed and also reduces the size of the vendor.
如,后台管理系统基础模块基本有以下几个:
axios: ajax 请求。
vuex: 全局状态管理。
js-cookie: 前端处理 cookie
vue-router: 路由管理。
这四个基础模块几乎是必须的,那么可以先提取出来。
step 1 打包基础模块
先在 build
文件夹下新建一个用于打包 dll 的配置文件 webpack.dll.conf.js
:
const webpack = require('webpack'); const path = require('path'); const vueLoaderConfig = require('./vue-loader.conf') const utils = require('./utils') function resolve(dir) { return path.join(dirname, '..', dir) } const vendor = [ // 'vue/dist/vue.runtime.esm.js', // 由于 vue 在生产环境中使用的是 cdn 引入,所以也无需提前打包进 dll // 'raven-js', // 前端监控,若无此需求,可以忽略。 'es6-promise', // 修复 promise 中某些 bug。 'vue-router', 'js-cookie', 'axios', 'vuex', ]; const webpackConfig = { context: dirname, output: { path: path.join(dirname, '../static/js/'), filename: '[name].dll.js', library: '[name]_[hash]', }, entry: { vendor }, plugins: [ new webpack.DllPlugin({ context: dirname, path: path.join(dirname, '.', '[name]-manifest.json'), name: '[name]_[hash]', }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false }, sourceMap: true, // parallel: true }) ], module: { rules: [{ test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.js$/, loader: 'babel-loader', include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('media/[name].[hash:7].[ext]') } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('fonts/[name].[hash:7].[ext]') } } ] } }; module.exports = webpackConfig
然后在 package.json
中加入一条命令:
{ "scripts": { ... "build:dll": "webpack --config build/webpack.dll.conf.js", ... } }
执行 yarn build:dll
或者 npm run build:dll
即可完成打包 dll。执行完成后:
yarn build:dll yarn run v1.5.1 $ webpack --config build/webpack.dll.conf.js Hash: f6894dff019b2e0734af Version: webpack 3.10.0 Time: 1295ms Asset Size Chunks Chunk Names vendor.dll.js 62.6 kB 0 [emitted] vendor [8] dll vendor 12 bytes {0} [built] + 32 hidden modules ✨ Done in 1.89s.
同时,可以在 build
目录下,找到各个模块对应关系文件 vendors-manifest.json
和 static/js
下的 vendor.dll.js
。
step 2 页面中引入 vendor
打包后的 dll 文件需要手动在 index.html
引入:
<p></p> <!-- built files will be auto injected --> <script></script>
step 3 告诉 webpack 使用 dllPlugin 进行打包
修改 build/webpack.prod.conf.js
:
module.exports = { plugins: [ ... new webpack.DllReferencePlugin({ context: dirname, manifest: require('./vendor-manifest.json') }), ... ] }
再次打包:
$ yarn build:report yarn run v1.5.1 $ npm_config_report=true node build/build.js Hash: b4ff51852866ed865cfd Version: webpack 3.10.0 Time: 6532ms Asset Size Chunks Chunk Names static/js/manifest.42b9584a653aec2b9c5e.js 1.5 kB 5 [emitted] manifest static/img/404.a57b6f3.png 98.1 kB [emitted] static/js/1.9e4133a25808e2101dd3.js 1 kB 1 [emitted] static/js/2.2a8a8e01c51473fab882.js 4.34 kB 2 [emitted] static/js/vendor.c7b076ef3341d4711402.js 39.4 kB 3 [emitted] vendor static/js/app.6d52c7a5bf1bacb5cc85.js 21.4 kB 4 [emitted] app static/js/0.cbc645864aab28ae8055.js 15.3 kB 0 [emitted] static/css/app.1b30f8eba210e245a5f96d7bf0d6fb6c.css 7.6 kB 4 [emitted] app favicon.ico 67.6 kB [emitted] index.html 986 bytes [emitted] static/js/vendor.dll.js 62.6 kB [emitted] Build complete. Tip: built files are meant to be served over an HTTP server. Opening index.html over file:// won't work.
发现 vendor 现在只有 40k 的体积,减少了一半的体积,而且打包速度也快了 2s,而相对于最开始的基础模板,打包速度快了 12s,这是很让人欣慰。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
如何使用v-model与promise两种方式实现vue弹窗组件
怎样使用Vue+Jwt+SpringBoot+Ldap完成登录认证
The above is the detailed content of Detailed explanation of optimization steps using vue-admin-template. For more information, please follow other related articles on the PHP Chinese website!

JavaandJavaScriptaredistinctlanguages:Javaisusedforenterpriseandmobileapps,whileJavaScriptisforinteractivewebpages.1)Javaiscompiled,staticallytyped,andrunsonJVM.2)JavaScriptisinterpreted,dynamicallytyped,andrunsinbrowsersorNode.js.3)JavausesOOPwithcl

JavaScript core data types are consistent in browsers and Node.js, but are handled differently from the extra types. 1) The global object is window in the browser and global in Node.js. 2) Node.js' unique Buffer object, used to process binary data. 3) There are also differences in performance and time processing, and the code needs to be adjusted according to the environment.

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

The main difference between Python and JavaScript is the type system and application scenarios. 1. Python uses dynamic types, suitable for scientific computing and data analysis. 2. JavaScript adopts weak types and is widely used in front-end and full-stack development. The two have their own advantages in asynchronous programming and performance optimization, and should be decided according to project requirements when choosing.

Whether to choose Python or JavaScript depends on the project type: 1) Choose Python for data science and automation tasks; 2) Choose JavaScript for front-end and full-stack development. Python is favored for its powerful library in data processing and automation, while JavaScript is indispensable for its advantages in web interaction and full-stack development.

Python and JavaScript each have their own advantages, and the choice depends on project needs and personal preferences. 1. Python is easy to learn, with concise syntax, suitable for data science and back-end development, but has a slow execution speed. 2. JavaScript is everywhere in front-end development and has strong asynchronous programming capabilities. Node.js makes it suitable for full-stack development, but the syntax may be complex and error-prone.

JavaScriptisnotbuiltonCorC ;it'saninterpretedlanguagethatrunsonenginesoftenwritteninC .1)JavaScriptwasdesignedasalightweight,interpretedlanguageforwebbrowsers.2)EnginesevolvedfromsimpleinterpreterstoJITcompilers,typicallyinC ,improvingperformance.

JavaScript can be used for front-end and back-end development. The front-end enhances the user experience through DOM operations, and the back-end handles server tasks through Node.js. 1. Front-end example: Change the content of the web page text. 2. Backend example: Create a Node.js server.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Atom editor mac version download
The most popular open source editor

Dreamweaver Mac version
Visual web development tools

SublimeText3 Chinese version
Chinese version, very easy to use

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

SublimeText3 English version
Recommended: Win version, supports code prompts!
