如何优化Vue项目

作者&投稿:爱保 (若有异议请与网页底部的电邮联系)
~
这次给大家带来如何优化Vue项目,优化Vue项目的注意事项有哪些,下面就是实战案例,一起来看一下。
Vue 类的项目开发中项目结构基本都是类似于 Vue-cli 生成的方式,这种方式开发中,最常用到的模式是开启代理进行 mock 调试或远程调试,也就是使用了 Vue-cli 设置的配置 proxyTable 或者直接使用 Webpack-dev-server提供的 proxy 选项。它是采用了 http-proxy 库,所以具体配置可查看:
https://github.com/nodejitsu/node-http-proxy#options
利用配置的这些参数我们可以做更为灵活的配置,达到更好的效果
使用需求
假设我们本地开发目前以下几种状态:
本地开发,数据使用本地的 mock Server
涉及权限接口使用本地 mock 数据,其他全部使用指定的一台远程机器
涉及权限接口使用本地 mock 数据,其他数据分接口使用不同的远程机器
所有接口使用同一台远程机器
方案
先看下经典的proxyTable 写法:
proxyTable: {
'/authui/': {
target: target,
changeOrigin: true
},
'/vendor/': {
target: target,
changeOrigin: true
}
}其中用到了 changeOrigin 字段,主要是用于改变请求的 header。细化下需求:
本地开发:target 指向 localhost 的某个端口即可。至于 host 的验证肯定是不需要的
部分本地,其他固定的一台远程机器:需要配置 localhost 和远程的地址,远程地址多半是需要验证 host 的
同二,但机器有多台:需要手动配置多台机器
同一台远程机器,此时机器可能要严格验证,即 IP 也必须使用域名,配置好系统 host 才可使用
说明:严格验证 host 和普通验证 host 区别主要在于严格验证时,请求的 url 必须是远程机器的域名,
不能直接修改请求的 header 的 host 实现,即必须在系统 host 层面配置好域名。
分析完成具体需求好,就开始准备实现的方式。原有开发方式是执行 npm run dev,如果我们需要在命令行层面添加配置,就需要设置为 npm run dev --param=paramvalue 的方式。对于使用 npm 的 script 脚本执行的命令,
它参数的获取无法通过 process.env 获得,而且通过 process.env.npm_config_paramName 的方式获取,
使用现成的命令行参数解析库也不是很方便,但为了省事,暂时还是使用 npm 自带的解析。
请求发起过程中需要以下几个参数:
host: 发起请求需要指向的 host,可能每台机器验证并不相同
port: 代理转发的端口
receiver: 用于 push 的远程地址,内包含了 ip 地址,为了省事,没有单独列出 ip 地址
然后定义代理请求自定义类型,用于配置:
local: 本地地址,即 localhost
remote: 指定的远程机器
其他自定义类型:用于在配置文件中已经指定的其他类型
原版本的请求,如 'http://xxx' 或者 Object 类型的配置,此类代理永不处理
根据需要,我们添加以下几个参数用于控制代理指向地址:
rd: 远程机器的地址
focus: 严格模式,所有自定义类型的代理转换为指定的 rd 机器,只在存在 rd 参数时可用
allLocal:自定义类型代理全部指向本地
host:请求发现是否使用 host,而不是 IP 地址
总结一下(序号指向前面的需求):
需要使用 host 进行访问的情形:4
需要更改 host:除 localhost 外都需要更改
需要对已有类型进行转换:1: 需要将所有自定义类型都转换为 local, 2和3:什么也不转换,4:所有的自定义类型全部转换为
remote 类型
这么一看,貌似 host 是不需要的,它的存在主要是针对某些 机器可能需要使用 host 的方式,所以还是保留一下。
实现
逻辑理清了就很简单了,配置文件设置为:
module.export = {
rd1: {
host: 'dev1.example.com',
port: 8838,
receiver: 'http://1.1.1.1:8888/receiver'
},
rd2: {
host: 'dev2.example.com',
port: 8838,
receiver: 'http://1.1.1.1:8888/receiver'
}
}proxyTable 配置方式
{
proxyTable: {
'/api1': 'remote',
'/api2': 'rd2',
'/auth/xx': 'local',
'/other': 'http://example.com'
}
}获取 proxyTable 的代码:
// 处理 proxyTable
const releaseConfig = require('../config/release.conf.js')
const rdConfig = releaseConfig[process.env.npm_config_rd]
const isAllRemote = process.env.npm_config_focus
const useHost = isAllRemote || process.env.npm_config_host
// 是否本机开发,本机开发 remote 会指向 local
const isAllLocal = process.env.npm_config_allLocal
module.exports = function (proxy) {
const localUrl = `http://localhost:${proxy.localProxyPort}`
const defaultHost = proxy.defaultRdHost || 'dev-example.com'
const localProxyPort = proxy.localProxyPort || 8787
const finalConfig = formatReleaseConfig(releaseConfig)
const remote = finalConfig.remote || {}
if (process.env.npm_config_rd) {
if (!rdConfig) {
throw new TypeError('RD 机器名称不存在,请在 config/release.conf.js 中进行配置')
}
if (!remote.ip) {
throw new Error('请配置 rd 机器的 receiver')
}
}
if (isAllRemote && !rdConfig) {
throw new TypeError('focus 只能在提供了 rd 名称后可设置')
}
function formatReleaseConfig (config) {
const result = {}
Object.keys(config).map((key) => {
const value = config[key]
const ipMatch = (value.receiver || '').match(/:\/\/(.*?):\d/)
const ip = ipMatch && ipMatch[1]
result[key] = {
ip,
host: value.host || defaultHost,
port: value.port || '8391'
}
})
// 设置 remote
if (rdConfig) {
const ipMatch = (rdConfig.receiver || '').match(/:\/\/(.*?):\d/)
const ip = ipMatch && ipMatch[1]
result.remote = {
ip,
host: rdConfig.host || defaultHost,
port: rdConfig.port || '8391'
}
}
// 设置 local
result.local = {
ip: 'localhost',
host: 'localhost',
port: localProxyPort
}
return result
}
function setProxy (proxyTable) {
const result = {}
Object.keys(proxyTable).forEach((api) => {
let type = proxyTable[api]
const isCustomType = typeof type === 'string' && !/^http/.test(type)
if (isCustomType && type !== 'remote' && type !== 'local' && !finalConfig[type]) {
throw new TypeError(`代理类型${type}不正确,请提供 http 或 https 类型的接口,或者指定正确的 release 机器名称`)
}
if (type === 'remote' && !finalConfig.remote) {
type = 'local'
}
if (isCustomType) {
if (isAllRemote && type !== 'remote') {
type = 'remote'
}
if (isAllLocal && type !== 'local') {
type = 'local'
}
}
const targetConfig = finalConfig[type]
let target = type
if (targetConfig) {
target = {
target: `http://${useHost ? targetConfig.host : targetConfig.ip}:${targetConfig.port}`,
// 使用 host 时需要转换,其他不需要转换
headers: {
host: `${targetConfig.host}:${targetConfig.port}`
}
}
}
result[api] = target
})
return result
}
return {
proxyTable: setProxy(proxy.proxyTable),
host: remote.host || defaultHost
}
}用法
用法中需要配置两种指向:系统 host 和浏览器代理 Host。
之所以要两种 host, 本质上是因为接口使用的域名
和我们的本地访问的域名是相同的,同一域名无法指向两个地址,所以相当于对浏览器端进行了拦截。
系统 host 推荐使用 switchHost 进行切换,浏览器推荐使用 whistle 进行切换。
本地开发
host 配置:无
whistle 配置:默认的域名
127.0.0.1 dev.example.com
启动命令:
npm run dev
npm run dev --allLocal注: 此时 proxyTable 中配置的 remote 全部转换为 local,在 allLocal 参数时将所有自定义类型转换为 local
本地 + 1 台远程
host 配置:无
whistle 配置:默认的域名
127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com启动命令:
npm run dev --rd=rd1
npm run dev --rd=rd1 --host注: --host 表示使用访问使用 host 而非 ip,使用时需要 host 地址
本地 + n 台远程
host 配置:无
whistle 配置:默认的域名
127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com
{
proxyTable: {
'/api1': 'rd1',
'/api2': 'rd2',
'/auth/xx': 'local',
'/other': 'http://example.com'
}
}proxyTable 配置:
启动命令:
npm run dev远程 1 台机器
host 配置:
1.1.1.1 dev1.example.com
1.1.1.1 dev2.example.comwhistle 配置:默认的域名
127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com启动命令:
npm run dev --rd=rd1 --focus组件优化
vue 的组件化深受大家喜爱,到底组件拆到什么程度算是合理,还要因项目大小而异,小型项目可以简单几个组件搞定,甚至不用 vuex,axios 等等,如果规模较大就要细分组件,越细越好,包括布局的封装,按钮,表单,提示框,轮播等,推荐看下 Element 组件库的代码,没时间写这么详细可以直接用 Element 库,分几点进行优化
?组件有明确含义,只处理类似的业务。复用性越高越好,配置性越强越好。
?自己封装组件还是遵循配置 props 细化的规则。
?组件分类,我习惯性的按照三类划分,page、page-item 和 layout,page 是路由控制的部分,page-item 属于 page 里各个布局块如 banner、side 等等,layout 里放置多个页面至少出现两次的组件,如 icon, scrollTop 等
相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
redux-thunk实战项目案例详解

如何使用Angular数据绑定机制


Vue 和 React 的使用场景和深度有何不同
首先,其实 Vue 也完全可以全量赋值的,唯一需要的小优化就是给 v-repeat 列表一个 track-by 属性,提示一下如何判断两个对象是否是同一份数据。如果是没有复杂交互的列表,可以直接 track-by="$index" 原地复用 DOM 元素。合理使用 track-by 的情况下,Vue 甚至可以比 React 更快(这里渲染的是 ...

web前端是什么
web前端即为网站的前端开发,前端开发是创建Web页面或app等前端界面呈现给用户的过程。web前端开发通过HTML,CSS及JavaScript以及衍生出来的各种技术、框架、解决方案,来实现互联网产品的用户界面交互。它从网页制作演变而来,名称上有很明显的时代特征。在互联网的演化进程中,网页制作是Web1.0时代的产物,...

土星VUE的09款型车
Vue Green Line 双模混合动力车型因其在燃油和排放系统方面采用了多项先进技术和改进措施,而被加利福尼亚和其他采用加州车辆排放法规的州评为部分零排放车型(PZEV)。预计在2008年第四季度正式上市销售的Vue Green Line双模混合动力车型,将成为土星品牌旗下继Vue Green Line混合动力SUV和Aura Green Line轿车之后的第三...

杀毒软件的问题
2.采用类似于破解的方法进行反编,分析整个软件的工作机制,工作量有多大相信都能猜出来,也没有见过有人搞过这种研究。因此我个人只能认为江民可能(较大程度的)参考了卡巴斯基的杀毒引擎设计,但从两款杀毒软件的灵敏程度,杀毒速度等诸多方民看,即使江民采用了卡巴斯基的引擎,江民也应该进行了很大程度的源代码修改或者优...

JAVA培训怎么样?零基础可以学习吗
任何人学任何东西都是0基础,在学习的过程中查漏补缺,逐渐的成为熟手,高手,专家,所以对于零基础的人当然可以学习java技术了,这已经有很多人证明过是可以的。其实零基础学java从来都不可怕,可怕的是没有凿山开路的决心。如果你的内心真的对IT行业感兴趣,对Java语言感兴趣,那么你就多鼓励自己,...

腾冲县19462371446: 用vue搭建的网站 还用做想性能优化吗 -
茹厕小儿: VUE是一种极为轻量化的插件,大小只有几十K,所以深受广大前端爱好者的使用,用VUE开发的页面,加载速度快,性能良好,当然还是有可以优化的部分

腾冲县19462371446: 如何优化vue的内存占用 -
茹厕小儿: 可以安装一个腾讯手机管家清理内存,它能帮你手机加速减少内存占用率,最大化的释放更多的手机内存,直接点击垃圾清理,自动扫描并清理软件缓存、垃圾文件、多余装包、系统缓存,彻底清除软件卸载后的残余

腾冲县19462371446: Vue单页面如何做seo页面优化 -
茹厕小儿: 1、服务端渲染 服务端渲染对于刚接触 vue 的新手来说,并不是那么友好,虽然已有官方 SSR 中文文档.但是对于一个已经开发完毕的 vue 项目去接 SSR 无论是从工作量还是技术角度来说,都是一种挑战. 2、预渲染方式 在构建时 (build time) 简单地生成针对特定路由的静态 HTML 文件.优点是设置预渲染更简单,并可以将您的前端作为一个完全静态的站点.如果您使用 webpack,您可以使用 prerender-spa-plugin 轻松地添加预渲染.它已经被 Vue 应用程序广泛测试.

腾冲县19462371446: 如何精简vue - cli安装的依赖项 -
茹厕小儿: 1.先安装node,检查node版本,node -v,安装vue-cli脚手架,node的版本必须在v4.0以上2.全局安装vue-cli,npm install -g vue-cli,检vue是否安装成功,vue,用vue list可以查看vue有哪些可以安装的模板3.安装一个webpack的模板,vue init ...

腾冲县19462371446: vuejs中怎么对搜索引擎seo进行优化 -
茹厕小儿: 如果你这是一个新的项目.很建议你直接采用这两个 lib 对应的 server-side rendering 框架.React 的话可以用 Next.js(zeit/next.js),零配置,完全无痛.第一屏是完全服务器渲染的.而后续会采用 SPA 的模式,让你拥有 React.js 开发体验和免除了 SPA 带来的 SEO 的烦恼,上手极快,你只要花5分钟体验一下就知道.Vue 有对应的 Nuxt.js. 如果是已有的项目而改写起来比较困难的话,建议你针对爬虫的请求进行特殊处理:给服务器加 http 中间件,识别爬虫请求,然后返回可处理页面给爬虫.

腾冲县19462371446: 请问一个已经开发完毕的 vue 项目用预渲染方式做seo页面优化的话vue的hash路由必须改成history模式吗? -
茹厕小儿: 最好是的,因为搜索引擎对于#后面的内容(锚)点一般是不收录的,改成history模式,在对页面重写就可以了~ 对优化部分进行后端动态赋值

腾冲县19462371446: 使用VUE开发的项目怎么解决SEO问题最好 -
茹厕小儿: 使用Vue,是js加载后台数据的,动态赋值在元素上的,搜索引擎只能抓取html内容并不能执行JS,这样搜索引擎抓取不到数据.解决方法:1、使用CDN缓存静态文件;2、使用服务端对SEO部分进行动态赋值;3、prerender-spa-plugin预渲染插件

腾冲县19462371446: 认识Vue.js+Vue.js的优缺点+和与其他前端框架的区别 -
茹厕小儿: Vue.js与其他框架的区别:1.与AngularJS的区别 相同点:都支持指令:内置指令和自定义指令.都支持过滤器:内置过滤器和自定义过滤器.都支持双向数据绑定.都不支持低端浏览器.不同点:1.AngularJS的学习成本高,比如增加了...

腾冲县19462371446: 创建Vue项目之前需要做哪些准备工作?Vue项目如何创建?指令是什么?并对指令解 -
茹厕小儿: 使用Vue,当然要先去学习它的使用方知法了,请参考官方文档Vue 创建Vue项目,可以用官方的脚手架,请道参考回官方文档vue-cli 指令就是在HTML标签上以v-开头的属性,比如:v-for, v-if等以及自定义指令.Vue会根据指令去执行答相应的操作,自定义指令就执行自定义的操作.详细请参考官文档.

腾冲县19462371446: vue.js和angularjs的区别 -
茹厕小儿: 选择 Vue 而不选择 Angular,有下面几个原因,当然不是对每个人都适合: 在 API 与设计两方面上 Vue.js 都比 Angular 简单得多,因此你可以快速地掌握它的全部特性并投入开发. Vue.js 是一个更加灵活开放的解决方案.它允许你以希望的方...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网