vue项目-项目优化

项目上线

此项目优化是基于vue项目的一种项目优化方式

一 项目优化策略

1.1 生成打包报告

打包时,为了直观地发下项目中存在的问题,可以在打包时生产报告。生产报告有两种方式:

① 通过命令行参数的形式生产报告

// --report 选项可以生成 report.html 以帮助分析包内容
vue-cli-service build --report

② 直接通过可视化的 UI 面板查看包括(推荐)
  在可视化的 UI 面板中,通过控制台分析面板,可以方便地看到项目中所存在的问题

1.2 通过 vue.config.js 修改 webpack 的默认配置

  通过 vue-cli 3.0 工具生成的项目,默认隐藏了所有 webpack 的配置项,目的是为了屏蔽项目的配置过程,让程序员把工作的重心,放到具体功能和业务逻辑的实现上

  如果程序员有修改 webpack 默认配置的需求,可以在项目的根目录中,按需创建 vue.config.js 这个配置文件,从而对项目的打包发布过程做自定义的配置(具体配置参考https://cli.vuejs.org/zh/config/#vue-config-js)

1.3 为开发者模式与发布模式指定不同的打包入口

  默认情况下,Vue 项目的开发模式发布模式,共用同一个打包的入口文件(即 src/main.js)。为了将项目的开发过程与发布过程分离,我们可以为两种模式,各自指定打包入口文件,即:
① 开发模式的入口文件为 src/main-dev.js
② 发布模式的入口文件为 src/main-prod.js

修改 webpack 打包配置:
  在 vue.config.js 导出的配置对象中,新增 configureWebpack 或 chainWebpack 节点,来自定义 webpack 的打包配置

在这里,configureWebpack 和 chainWebpack 的作用相同,唯一区别就是它们修改 webpack 配置的方式不同:

  • chianWebpack 通过 链式编程 的形式,来修改默认的 webpack 配置
module.exports = {
	chainWebpack: config => {
		config.when(process.env.NODE_ENV === 'production', config => {
			config.entry('app').clear().add('./src/main-prod'.js)
		})
		config.when(process.env.NODE_ENV === 'development', config => {
			config.entry('app').clear().add('./src/main-dev.js')
		})
	}
}
  • configureWebpack 通过 操作对象 的形式,来修改默认的 webpack 配置

1.4 通过 externals 加载外部 CDN 资源

  默认情况下,通过 import 语法导入的第三方依赖包,最终会被打包合并到同一个文件中,从而导致打包成功后,单文件体积过大的问题

为了解决上述问题,通过 webpack 的 externals 节点,来配置并加载外部的 CDN 资源。凡是声明在 externals 中的第三方依赖包,都不会被打包

具体配置如下:

config.set('externals', {
	vue: 'Vue',
	'vue-router': 'VueRouter',
	axios: 'axios',
	lodash: '_',
	echarts: 'echarts',
	nprogress: 'NProgress',
	'vue-quill-editor': 'VueQuillEditor'
})

同时,需要在 public/index.html 文件的头部,添加如下的 CDN 资源引用:

<!-- nprogress 的样式表 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.css" />
<!-- 富文本编辑器的样式表 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.core.min.css" />
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.snow.min.css" />
<link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.bubble.min.css" />

<script src="https://cdn.staticfile.org/vue/2.6.11/vue.min.js"></script>
<script src="https://cdn.staticfile.org/vue-router/3.4.3/vue-router.min.js"></script>
<script src="https://cdn.staticfile.org/axios/0.19.2/axios.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.20/lodash.min.js"></script>
<script src="https://cdn.staticfile.org/echarts/4.8.0/echarts.min.js"></script>
<script src="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.js"></script>
<!-- 富文本编辑器的 js 文件 -->
<script src="https://cdn.staticfile.org/quill/1.3.4/quill.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.6/dist/vue-quill-editor.js"></script>

1.5 通过 CDN 优化 ElementUI 的打包

  虽然在开发阶段,我们启用了 element-ui 组件的按需加载,尽可能的减少了打包的体积,但是那些被按需加载的组件,还是占用了较大的文件体积。此时,我们可以将 element-ui 中的组件,也可以通过 CDN 的形式来加载,这样能够进一步减少打包后的文件体积

具体操作流程如下:

  1. 在 main-prod.js 中,注释或删除掉 element-ui 按需加载的代码
  2. 在 index.html 头部区域中,通过 CDN 加载 element-ui 的js和css样式
<!-- element-ui 的样式表 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.13.2/theme-chalk/index.css" />
<!-- element-ui 的 js 文件 -->
<script src="https://cdn.staticfile.org/element-ui/2.13.2/index.js"></script>

1.6 首页内容定制

不同的打包环境下,首页内容可能会有所不同,我们可以通过插件的方式进行定制,插件配置如下:

chainWebpack: config => {
	config.when(process.env.NODE_ENV === 'production', config => {
		config.plugin('html').tap(args => {
			args[0].isProd = true
			return args
		})
	})
	config.when(process.env.NODE_ENV === 'developemnt', config => {
		config.plugin('html').tap(args => {
			args[0].isProd = false
			return args
		})
	})
}

然后在 public/index.html 首页中,可以根据 isProd 的值,来决定如何渲染页面结构:

<!-- 按需渲染页面的标题 -->
<title><%= htmlWebpackPlugin.isProd ? '' : 'dev - ' %>电商管理系统</title>

<!-- 按需加载外部的 CDN 资源 -->
<% if(htmlWebpackPlugin.isProd) { %>
<!-- 通过 externals 加载的外部 CDN 资源 -->
<% } %>

1.7 路由懒加载

  当打包构建项目时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应的组件,这样就更加高效了。

具体步骤如下:

  1. 安装 @babel/plugin-syntax-dynamic-import
  2. babel.config.js 配置文件中声明插件
  3. 将路由改为按需加载的形式,示例代码如下:
const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
const Bar= () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
const Baz= () => import(/* webpackChunkName: "group-boo" */ './Bar.vue')

关于路由懒加载的详情文档,可参考如下链接:
https://router.vuejs.org/zh/guide/advanced/lazy-loading.html

二 项目上线

  1. 通过 node 创建 web 服务器
  2. 开启 gzip 设置
  3. 配置 https 服务
  4. 使用 pm2 管理应用

2.1 通过 node 创建 web 服务

  创建 node 项目,并安装 express,通过 express 快速创建 web 服务器,将 vue 打包生成的 dist 文件夹,托管为静态资源即可,具体代码如下:

// 安装 express
npm install express -S
// 导包
const express = require('express')
// 创建 web 服务器
const app = express()
// 托管静态资源
app.use(express.static('./dist'))
// 启动 web 服务器
app.listen(80, () => {
	console.log('web server running at http://127.0.0.1')
})

2.2 开始 gzip 设置

  使用 gzip 可以减少文件体积,是文件传输速度更快
其配置如下:

// 安装 compression
npm install compression -D
// 导入包
const compression = require('comporession')
// 启用中间件
app.use(compression())

注意: 启用中间件必须放在托管静态资源前。

2.3 配置 https 服务

为什么要启用 HTTPS 服务?

  • 传统的 HTTP 协议传输的数据都是明文的,不安全
  • 采用 HTTPS 协议对传输的数据进行了加密处理,可以防止数据被中间人窃取,使用更安全

申请 SSL 正书(https://freessl.org)

  1. 进入 https://freessl.cn/ 官网,输入要申请的域名并选择品牌
  2. 输入自己的邮箱并选择相关的选项
  3. 验证 DNS (在域名管理后台添加 TXT 记录)
  4. 通过验证之后,下载 SSL 证书(full_chian.pem 公钥;private.key 私钥)

在后台项目中导入证书

const https = require('https')
const fs = require('fs')
const options = {
	cret: fs.readFileSync('./full_chian.pem')
	key: fs.readFileSync('./private.key')
}
https.createServer(options, app).listen(443)

2.4 使用 pm2 管理应用

  1. 在服务器中安装 pm2 npm intall pm2 -g
  2. 启动项目:pm2 start 入口文件 --name 自定义名称
  3. 查看运行项目:pm2 ls
  4. 重启项目:pm2 restart 自定义名称
  5. 删除项目:pm2 delete 自定义名称
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值