生成打包报告
- 通过命令行参数的形式生成报告
在终端执行命令:vue-cli-service build --report。会生成一个report.html文件的打包报告。 - 在终端执行命令:vue ui ,进入可视化ui面板,可以在其中的build模块查看打包报告。
修改webpack的默认配置
通过vue-cli创建的项目中,默认隐藏了webpack的配置。
- 通过创建vue.config.js修改webpack的默认配置。参考文档:https://cli.vuejs.org/zh/config/#vue-config-js
修改打包入口
***//将main.js改成两个相同的main-dev.js,main-prod.js***
module.exports = {
chainWebpack: config => {
config.when(process.env.NODE_ENV === 'production', config =>{
//发布阶段的打包入口,process.env.NODE_ENV可以拿到当前的模式。
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')
})
}
}
加载外部CDN资源(externals)
默认情况下,通过impor语法导入的第三方依赖包,最终会被打包并合并到同一个文件中,从而导致打包成功后,单文件体积过大的问题。
- 在vue.config.js文件中的发布模式配置externals节点
如:
***//将main.js改成两个相同的main-dev.js,main-prod.js***
module.exports = {
chainWebpack: config => {
config.when(process.env.NODE_ENV === 'production', config =>{
//发布阶段的打包入口,process.env.NODE_ENV可以拿到当前的模式。
config.entry('app').clear().add('./src/main-prod.js')
config.set('externals',{**//externals需要用config.set来设置。**
vue: 'Vue',**//健为要引入的包名,值为为其的重命名**
vue-router: 'VueRouter',**//有短横线分隔的需要用引号包裹。**
axios: 'axios',
lodash: '_',
echarts: 'echarts',
nprogress: 'nprogress',
'vue-quill-aditor': 'VueQuillEdutor'
})
})
config.when(process.env.NODE_ENV === 'development', config =>{
//开发阶段的打包入口
config.entry('app').clear().add('./src/main-dev.js')
})
}
}
- 把main-prod.js中的inport语句删掉。在index.html中通过link标签和script标签的方式把相应的css样式、js做全局导入。
通过CDN优化ElementUI的打包
发布阶段由于element-ui的组件包比较大,导致文件本身体积过大。也通过CDN的形式来加载。
- 在main-prod.js中,注释掉element-ui按需加载代码
- 在index.html中的头部通过link和script标签导入element-ui的js和css样式。
首页自定义配置
- 在vue.config.js文件中配置config.plugin来配置参数变量。如:
***//将main.js改成两个相同的main-dev.js,main-prod.js***
module.exports = {
chainWebpack: config => {
config.when(process.env.NODE_ENV === 'production', config =>{
//发布阶段的打包入口,process.env.NODE_ENV可以拿到当前的模式。
config.entry('app').clear().add('./src/main-prod.js')
config.set('externals',{**//externals需要用config.set来设置。**
vue: 'Vue',**//健为要引入的包名,值为为其的重命名**
vue-router: 'VueRouter',**//有短横线分隔的需要用引号包裹。**
axios: 'axios',
lodash: '_',
echarts: 'echarts',
nprogress: 'nprogress',
'vue-quill-aditor': 'VueQuillEdutor'
})
**config.plugin('html').tap(args => {
args[0].isProd = true//isProd是自定义的变量名
return args
})**
})
config.when(process.env.NODE_ENV === 'development', config =>{
//开发阶段的打包入口
config.entry('app').clear().add('./src/main-dev.js')
**config.plugin('html').tap(args => {
args[0].isProd = false
return args
})**
})
}
}
- 在index.html的title标签中做一个三元运算用来判断是开发模式还是发布模式。如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
**<title><%=htmlWebpackPlugin.options.isProd?'发布模式' : '开发模式' %></title>**
//也可以用来控制按需加载的CDN(CDN是指通过link和script方式加载的资源)
**<% if(htmlWebpackPlugin.options.isProd) { %>** //左大括号不能省
//通过externals加载的外部CDN资源。
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> //发布模式需要加载的css样式
<script src=""></script>//发布模式需要加载的js文件样式
**<% } %>** //右大括号不能省,表示结束
</head>
<body>
<div id="app"></div>
</body>
</html>
路由懒加载
当项目过大时,路由文件会随之变大,为了避免文件过大,设置路由懒加载,通过分组的形式加载整组路由,而不是单独加载。
- 安装@babel/plugin-syntax-dynamic-import 包。在vue ui可视化中加载开发依赖中搜索
- 在babel.config.js配置文件中申明该插件。在plugins中申明插件
module.exports = {
'presets': [
'@vue/cli-plugin-babel/preset'
],
'plugins': [
[
'component',
{
'libraryName': 'element-ui',
'styleLibraryName': 'theme-chalk'
}
]
**'@babel/plugin-syntax-dynamic-import'//这里就是申明插件**
]
}
- 将路由改为按需加载的形式
import Vue from 'vue'
import VueRouter from 'vue-router'
//路由懒加载主要改变import载入的方式
//import Login qqq '../components/qqq.vue'
//import Login www '../components/www.vue'
//import Login eee '../components/eee.vue'
///第一组改编
const qqq = () => import(/* webpackChunkName: group-name1 */ '../components/qqq.vue')//group-name1为组名,同组路由会一同加载
const www = () => import(/* webpackChunkName: group-name1 */ '../components/www.vue')
const eee = () => import(/* webpackChunkName: group-name1 */ '../components/eee.vue')
//import Login aaa '../components/aaa.vue'
//import Login sss '../components/sss.vue'
//import Login ddd '../components/ddd.vue'
///第二组改编
const aaa = () => import(/* webpackChunkName: group-name2 */ '../components/aaa.vue')//group-name2为组名,同组路由会一同加载
const sss = () => import(/* webpackChunkName: group-name2 */ '../components/sss.vue')
const ddd = () => import(/* webpackChunkName: group-name2 */ '../components/ddd.vue')
//路由懒加载的分组设置
Vue.use(VueRouter)
export default new VueRouter({
routes: [
//第一组
{path: '/qqq', component: qqq },
{path: '/www', component: www },
{path: '/eee', component: eee },
//第二组
{path: '/aaa', component: aaa },
{path: '/sss', component: sss },
{path: '/ddd', component: ddd }
]
})
项目上线
创建node服务器
创建node项目,安装express,通过express快速创建web服务器,将vue打包生成的dist文件夹托管为静态资源即可。代码如下:
const express = require('express')
const app = express()//创建服务器
app.use(express.static('./dist'))//托管静态资源
app.listen(8000,()=>{//启动服务器
console.log('服务器已启动')
})
开启gzip配置
使用gzip可以减少文件体积,使传输速度更快
可以通过服务器端使用express做gizp压缩。配置如下:
- 安装compression包,如:npm install compression -D
- 导包。如:const compression = require(‘compression’);
- 启动中间件,如:app.use(compression()) //一定要卸载托管今天资源之前,不然不会生效。
如:
const express = require('express')
const compression = require('compression')
const app = express()//创建服务器
app.use(compression())//必须放在托管静态资源之前。
app.use(express.static('./dist'))//托管静态资源
app.listen(8000,()=>{//启动服务器
console.log('服务器已启动')
})
配置HTTPS服务
数据加密
- 申请SSL证书。(个人测试申请网站:https://freessl.org)
- 注册并下载ssl证书。(full_chain.pem公钥,private.key私钥)
- 在后台证书导入:
如:
//在app.js中写的
const https = require('https')
const fs = require('fs');
const options = {
cert: fs.readFileSync('./full_chain.pem')
key: fs.readFileSync('./private.key')
}
https.createServer(options,app).listen(443)//默认端口443
使用pm2管理应用
都是在终端上运行的
使node项目可以后台运行
- 在服务器中安装pm2:npm i pm2 -g
- 启动项目:pm2 start脚本 --name自定义名称
- 查看运行项目:pm2 ls
- 重启项目:pm2 restart 自定义名称
- 停止项目:pm2 stop 自定义名称
- 删除项目:pm2 delete 自定义名称