如果使用 Vue-CLI 创建的项目启动和打包过程过慢,可以尝试以下几种优化方法。
1. 升级 Node.js 版本
Node.js 的版本有时也会影响 Vue-CLI 项目的启动和打包速度,建议将 Node.js 升级到最新版本(如果项目有依赖对于node版本要求,谨慎升级)。新版本的 Node.js 通常会优化一些性能问题,并且在某些情况下可以提高项目的构建速度。
2. 使用 yarn
如果使用 npm 安装依赖时速度较慢,可以尝试使用 yarn。yarn 使用了并行下载和缓存等优化技术,可以大幅提高依赖包的安装速度。
3. 使用 CDN 引入第三方库
对于一些常用的第三方库,可以考虑使用 CDN 引入,这样可以避免每次打包时都要重新下载这些库,从而提高打包速度。例如:
html
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
4. 使用 gzip 压缩
对于一些较大的静态资源,可以考虑启用 gzip 压缩。gzip 压缩可以减小文件大小,并且可以提高文件传输速度。可以使用 Webpack 中的 compression-webpack-plugin 插件来启用 gzip 压缩。
5. 优化 Webpack 配置
可以通过优化 Webpack 配置来提高 Vue-CLI 项目的启动和打包速度。例如:
-
使用 Webpack 的 HappyPack 插件来开启多线程构建,提高构建速度。
-
使用 Webpack 的 DllPlugin 插件来提前打包一些常用的依赖包,从而提高打包速度。
-
对于一些不常用的第三方库,可以考虑使用 external 配置来避免打包这些库,从而减小打包体积。
6. 拆分代码
对于一些较大的模块或者组件,可以考虑将它们拆分成更小的模块或组件,从而减小单个模块或组件的打包体积。可以使用 Webpack 中的代码分割和动态导入功能来实现拆分代码。
以上是一些常用的 Vue-CLI 项目启动和打包优化方法,可以根据具体情况进行选择和调整。
7. 使用 PWA
使用 PWA(Progressive Web Apps)可以将 Web 应用程序转变为类似原生应用的形式,提供离线访问、推送通知、主屏幕快捷方式等功能,从而提高应用的用户体验。Vue-CLI 3 提供了 PWA 插件,可以快速地将应用转换为 PWA 形式。
8. 使用懒加载
懒加载是指将某些组件或路由在需要时才进行加载,从而减少初始加载时间。Vue-CLI 3 中内置了懒加载的配置项,只需要将组件或路由的 import() 语句包裹在函数中即可实现懒加载。例如:
javascript
const Foo = () => import('./Foo.vue')
9. 使用 Tree Shaking
Tree Shaking 是指将代码中未使用的部分从最终的打包结果中删除,从而减小打包体积。Vue-CLI 3 中使用了 Webpack 4,自带支持 Tree Shaking。可以使用 ES6 的 import/export 语法或者动态 import() 语法来实现 Tree Shaking。
10. 使用 PurgeCSS
PurgeCSS 是一种用于删除未使用 CSS 的工具,可以将不必要的 CSS 从最终的打包结果中删除,从而减小打包体积。Vue-CLI 3 中可以使用 PurgeCSS 插件来实现。
javascript
// vue.config.js
const PurgecssPlugin = require('purgecss-webpack-plugin')
const glob = require('glob-all')
const path = require('path')
module.exports = {
configureWebpack: {
plugins: [
new PurgecssPlugin({
paths: glob.sync([
path.join(__dirname, './src/**/*.html'),
path.join(__dirname, './src/**/*.vue'),
path.join(__dirname, './src/**/*.js')
])
})
]
}
}
11. 配置 CDN 加速
将静态资源(如图片、字体、JS/CSS 文件等)放在 CDN 上,可以有效地加速网站的访问速度,减少加载时间。Vue-CLI 3 中可以使用 copy-webpack-plugin 插件将静态资源复制到指定的目录,并配合 publicPath 和 externals 配置项使用 CDN 加速。
javascript
// vue.config.js
const CopyWebpackPlugin = require('copy-webpack-plugin')
module.exports = {
configureWebpack: {
plugins: [
new CopyWebpackPlugin({
patterns: [
{
from: path.join(__dirname, 'src', 'assets'),
to: path.join(__dirname, 'dist', 'assets')
}
]
})
],
output: {
publicPath: 'https://cdn.example.com/',
filename: '[name].[contenthash].js'
},
externals: {
vue: 'Vue',
'vue-router': 'VueRouter',
vuex: 'Vuex'
}
}
}
在上述配置中,将静态资源复制到 dist/assets 目录下,指定了 publicPath 为 CDN 地址,使用了 contenthash 作为文件名的一部分(保证每个文件都有唯一的文件名),并将 Vue、Vue Router、Vuex 等库设为 externals,使用时从 CDN 加载。
12. 使用 Vite
Vite 是一种新型的前端构建工具,与传统的 Webpack 不同,采用了 ES Module 的方式加载模块,从而实现了更快的启动和重载速度。Vue-CLI 3 中也可以使用 Vite 来构建项目,只需要将项目中的 package.json 文件中的 "vue": "^3.0.0" 改为 "vite": "^2.0.0",并执行 npm install,即可使用 Vite。
json
// package.json
{
"dependencies": {
"vite": "^2.0.0"
}
}
13. 使用 Nginx 反向代理
Nginx 是一种高性能的 Web 服务器,可以用作 Vue-CLI 项目的反向代理,提高应用的访问速度和并发能力。可以通过修改 Nginx 的配置文件来实现反向代理。
nginx
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
以上配置将 example.com 的访问请求转发到本地的 8080 端口,从而实现反向代理。
14. 代码拆分
对于大型的项目,代码拆分也是提高打包速度的有效方式之一。Vue CLI 4 中默认开启了代码拆分功能,即将不同的页面和路由组件打包为不同的 chunk,可以根据需要按需加载,从而减少首次加载的时间。
代码拆分可以通过以下几种方式实现:
-
使用 Vue CLI 4 自带的代码拆分功能,开启 splitChunks 配置项,根据需要配置不同的 chunk。
-
使用 webpack-bundle-analyzer 插件,可视化分析代码中各个模块的大小和依赖关系,从而优化拆分方案。
-
使用 dynamic import 实现按需加载,将一些不常用的组件和功能单独打包,按需加载时再动态加载。
下面是一个使用 dynamic import 实现按需加载的例子:
javascript
const router = new VueRouter({
routes: [
{
path: '/about',
component: () => import('./views/About.vue')
},
{
path: '/login',
component: () => import('./views/Login.vue')
}
]
})
在这个例子中,About 和 Login 组件会在第一次访问对应路由时才会被加载,从而减少首次加载的时间。
15. 缓存
为了提高页面的加载速度,我们可以使用浏览器缓存技术。在开发过程中,需要注意以下几点:
-
对于静态资源,如图片、样式和脚本等,可以通过配置缓存控制头(Cache-Control 和 ETag 等)来实现缓存。
-
对于动态生成的 HTML 页面,可以通过设置 HTTP 响应头中的 Expires 和 Cache-Control 等来实现缓存。
在 Vue CLI 中,可以通过配置 webpack 的 output.filename 和 output.chunkFilename 来实现缓存。
javascript
output: {
filename: '[name].[contenthash].js',
chunkFilename: '[name].[contenthash].js'
}
其中,[contenthash] 会根据文件的内容生成一个哈希值,当文件内容改变时,哈希值也会改变,从而实现缓存更新。
16. 压缩和优化
我们还可以对代码进行压缩和优化,从而减小文件的体积和加载时间。Vue CLI 默认开启了代码压缩和优化功能,但我们也可以通过以下方式进一步优化:
-
使用 webpack-bundle-analyzer 插件分析代码体积和依赖关系,从而进一步优化代码拆分方案。
-
使用 babel 和相关插件实现代码的转译和优化,从而兼容更多的浏览器和提高性能。
-
使用 tree shaking 和 dead code elimination 等技术,从代码中删除不需要的部分,从而减小文件体积。
-
使用 CDN 加速静态资源的加载速度
17. 使用Preset(预设)
vue-cli提供了许多可配置的preset(预设),可以根据自己的需求选择合适的preset来优化项目。例如,可以选择vue-router预设,以快速添加路由功能;也可以选择vuex预设,以快速添加状态管理功能。选择合适的预设可以减少手动配置的工作量,提高开发效率。
18. 开启Tree Shaking
Tree Shaking是一种代码优化技术,可以去除未使用的代码,减少打包体积。在vue-cli创建的项目中,可以通过配置webpack的optimization选项来开启Tree Shaking。在vue.config.js文件中加入如下代码:
yaml
module.exports = {
configureWebpack: {
optimization: {
usedExports: true
}
}
}
19. 懒加载路由
在应用中,可能存在一些路由组件只有在特定条件下才会被加载。这时,可以使用路由的懒加载功能,按需加载路由组件,减少首屏加载时间。在vue-router中,可以使用import函数实现路由懒加载。例如:
javascript
const Home = () => import('./views/Home.vue')
20. 配置babel缓存
babel是一个JavaScript编译器,可以将ES6+的代码转换为ES5代码,以兼容低版本浏览器。在vue-cli创建的项目中,默认会使用babel-loader来处理JavaScript代码。可以通过babel-loader的cacheDirectory选项来开启缓存,以提高编译速度。在vue.config.js文件中加入如下代码:
arduino
module.exports = {
chainWebpack: config => {
config.module
.rule('js')
.use('babel-loader')
.loader('babel-loader')
.tap(options => {
// 修改官方默认配置,开启缓存
options.cacheDirectory = true
return options
})
}
}
通过以上方法的使用,可以有效地优化 Vue-CLI 项目的启动和打包速度,并减小打包体积。但需要注意的是,不同的项目和场景可能需要不同的优化方案,需要根据具体情况进行选择和调整。