热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue项目优化上线

1.移除consol.log()的babel插件安装:npmibabel-plugin-transform-remove-console-D配置:babel.config.js:这

1. 移除 consol.log() 的 babel 插件

安装:npm i babel-plugin-transform-remove-console -D

配置:babel.config.js:

// 这是项目发布阶段需要用到的bebel插件
const prodPlugins = []
// 如果是发布阶段,处于生产环境,就向prodPlugins数组里添加一个插件
if (process.env.NODE_ENV === 'production') {
prodPlugins.push('transform-remove-console')
}
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
plugins: [
[
'component',
{
libraryName: 'element-ui',
styleLibraryName: 'theme-chalk'
}
],
...prodPlugins // 这里...展开运算符,把上面定义的prodPlugins数组里面的每一项展开添加到这个plugins数组里面
]
}

2. 项目优化


1.1 项目优化策略

1. 生成打包报告
2. 第三方库启用 CDN
3. Element-UI 组件按需加载4. 路由懒加载
5. 首页内容定制


1. 生成打包报告

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

1 通过命令行参数的形式生成报告

// 通过 vue-cli 的命令选项可以生成打包报告
// --report 选项可以生成 report.html 以帮助分析包内容
vue-cli-service build --report

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


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

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

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

// vue.config.js
// 这个文件中,应该导出一个包含了自定义配置选项的对象
module.exports = {
// 选项...
}

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

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


4. configureWebpack 和 chainWebpack

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

在这里, configureWebpack 和 chainWebpack 的作用相同,唯一的区别就是它们修改 webpack 配置的方式不同:
1 chainWebpack 通过链式编程的形式,来修改默认的 webpack 配置
2 configureWebpack 通过操作对象的形式,来修改默认的 webpack 配置

两者具体的使用差异,可参考如下网址:

https://cli.vuejs.org/zh/guide/webpack.html#webpack-%E7%9B%B8%E5%85%B3


5. 通过 chainWebpack 自定义打包入口

代码示例如下:

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')
})
}
}

6. 通过 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 资源引用(示例):










7. 通过 CDN 优化 ElementUI 的打包

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

具体操作流程如下:
1 在 main-prod.js 中,注释掉 element-ui 按需加载的代码
2 在 index.html 的头部区域中,通过 CDN 加载 element-ui 的 js 和 css 样式




8. 首页内容定制

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

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 === 'development', cOnfig=> {
config.plugin('html').tap(args => {
args[0].isProd = false
return args })
}) }

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




<% if(htmlWebpackPlugin.options.isProd) { %>
<% } %>

9. 路由懒加载

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

具体需要 3 步:
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" */ './Baz.vue')

关于路由懒加载的详细文档,可参考如下链接:

https://router.vuejs.org/zh/guide/advanced/lazy-loading.html


3. 项目上线

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


2.1 项目上线相关配置


1. 通过 node 创建 web 服务器

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

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. 开启 gzip 配置

1 使用 gzip 可以减小文件体积,使传输速度更快。
2 可以通过服务器端使用 Express 做 gzip 压缩。

其配置如下:

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

3. 配置 HTTPS 服务

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

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

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

在后台项目中导入证书

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);

4. 使用 pm2 管理应用

1 在服务器中安装 pm2:npm i pm2 -g
2 启动项目:pm2 start 脚本 --name 自定义名称 3 查看运行项目:pm2 ls
4 重启项目:pm2 restart 自定义名称
5 停止项目:pm2 stop 自定义名称
6 删除项目:pm2 delete 自定义名称

 

本文来自博客园,作者:RHCHIK,转载请注明原文链接:https://www.cnblogs.com/suihung/p/16199727.html



推荐阅读
  • 本打算教一步步实现koa-router,因为要解释的太多了,所以先简化成mini版本,从实现部分功能到阅读源码,希望能让你好理解一些。希望你之前有读过koa源码,没有的话,给你链接 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 本文详细介绍了如何在 Vue CLI 3.0 和 2.0 中配置 proxy 来解决开发环境下的跨域问题,包括具体的配置项和使用场景。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • 本文详细介绍了如何在 Node.js 环境中利用 Nodemailer 库实现邮件发送功能,包括环境配置、代码实现及常见问题解决方法。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 高效的JavaScript异步资源加载解决方案
    本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 在移动端开发中,多点触控手势是提升用户体验的重要手段。然而,目前只有iOS浏览器原生支持手势事件,其他设备需要通过touchstart、touchmove和touchend等基础事件进行自定义实现。本文将详细介绍如何在Vue项目中实现多点触控手势。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 1.绑定htmlcss1.1对象语法:  传给v-bind:class一个对象,以动态地切换class   ... [详细]
  • 本篇文章详细探讨了微机原理实验中的指令系统,特别是第三章的内容。对于希望深入了解微机工作原理和技术实现的朋友来说,这是一篇不可多得的技术指南。文章不仅涵盖了基础概念,还深入讲解了指令格式、操作数类型以及各种寻址方式,旨在帮助读者更好地掌握微机指令系统的应用。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 探讨在ES6中使用更为简洁和高效的代码来判断两个数组中的元素是否完全相同,不考虑元素的顺序。 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
author-avatar
2335286cc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有