Home > Web Front-end > JS Tutorial > body text

How to optimize Vue projects

php中世界最好的语言
Release: 2018-06-08 10:46:18
Original
1327 people have browsed it

This time I will show you how to optimize the Vue project and what are the precautions for optimizing the Vue project. The following is a practical case, let's take a look.

The project structure of the Vue class project development is basically similar to the Vue-cli generation method. In this method of development, the most commonly used mode is to enable the agent for mock debugging or remote debugging, that is, using Configure the proxyTable set by Vue-cli or directly use the proxy option provided by Webpack-dev-server. It uses the http-proxy library, so the specific configuration can be viewed:

https://github.com/nodejitsu/node-http-proxy#options

Using these configured parameters we You can make more flexible configurations to achieve better results

Usage requirements

Assume that our local development is currently in the following status:

  • Local development, use local mock Server for data

  • Permission-related interfaces use local mock data, and all others use a designated remote machine

  • The permissions-related interface uses local mock data, and other data sub-interfaces use different remote machines

  • All interfaces use the same remote machine

## Solution

Let’s first look at the classic proxyTable writing method:

proxyTable: {
 '/authui/': {
  target: target,
  changeOrigin: true
 },
 '/vendor/': {
  target: target,
  changeOrigin: true
 }
}
Copy after login
The changeOrigin field is used, mainly Is the header used to change the request. Refining the requirements:

  • Local development: The target can point to a certain port of localhost. As for the verification of the host, it is definitely not necessary.

  • Part of the local machine, and the other fixed remote machine: localhost and remote addresses need to be configured. Most of the remote addresses need to be verified by the host.

  • Same as two, but there are multiple machines: multiple machines need to be manually configured

  • The same remote machine, at this time the machine may need to be strictly verified, That is, the IP must also use the domain name, and the system host can be used only after configuring the system host.

Note: The main difference between strict verification host and ordinary verification host is that during strict verification, the requested URL must be from the remote machine. Domain name,

cannot directly modify the host implementation of the requested header, that is, the domain name must be configured at the system host level.

After analyzing the specific requirements, start preparing the implementation method. The original development method is to execute

npm run dev. If we need to add configuration at the command line level, we need to set it to npm run dev --param=paramvalue. For commands executed using npm's script script, its parameters cannot be obtained through process.env, and are obtained through
process.env.npm_config_paramName , It is not very convenient to use the ready-made command line parameter parsing library, but to save trouble, for the time being, I will use the parsing that comes with npm.

The following parameters are required during the request initiation process:

  • host: The host that needs to be pointed to when initiating the request may not be the same for each machine.

  • port: The port forwarded by the proxy

  • receiver: the remote address used for push, including the ip address. To save trouble, the ip address is not listed separately

Then define the proxy request custom type for configuration:

  • local: local address, that is, localhost

  • remote: The specified remote machine

  • Other custom types: used for other types that have been specified in the configuration file

  • The original version of the request, such as 'http://xxx' or Object type configuration, such proxy will never process

As needed, we add the following parameters to control the proxy Pointing address:

  1. rd: The address of the remote machine

  2. #focus: Strict mode, all custom type proxies are converted to the specified rd machine , only available when the rd parameter exists

  3. allLocal: Custom type proxies all point to the local

  4. host: Request to discover whether to use host, and Not an IP address

To summarize (the serial number points to the previous requirement):

  • Situations where host is required for access: 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'
 }
}
Copy after login

proxyTable 配置方式

{
 proxyTable: {
  '/api1': 'remote',
  '/api2': 'rd2',
  '/auth/xx': 'local',
  '/other': 'http://example.com'
 }
}
Copy after login

获取 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
 }
}
Copy after login

用法

用法中需要配置两种指向:系统 host 和浏览器代理 Host。
之所以要两种 host, 本质上是因为接口使用的域名
和我们的本地访问的域名是相同的,同一域名无法指向两个地址,所以相当于对浏览器端进行了拦截。
系统 host 推荐使用 switchHost 进行切换,浏览器推荐使用 whistle 进行切换。

本地开发

host 配置:无
whistle 配置:默认的域名

127.0.0.1 dev.example.com

启动命令:

npm run dev
npm run dev --allLocal
Copy after login

注: 此时 proxyTable 中配置的 remote 全部转换为 local,在 allLocal 参数时将所有自定义类型转换为 local

本地 + 1 台远程

host 配置:无
whistle 配置:默认的域名
127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com
Copy after login

启动命令:

npm run dev --rd=rd1
npm run dev --rd=rd1 --host
Copy after login

注: --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'
 }
}
Copy after login

proxyTable 配置:

启动命令:

npm run dev
Copy after login

远程 1 台机器

host 配置:

1.1.1.1 dev1.example.com
1.1.1.1 dev2.example.com
Copy after login

whistle 配置:默认的域名

127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com
Copy after login

启动命令:

npm run dev --rd=rd1 --focus
Copy after login

组件优化

vue 的组件化深受大家喜爱,到底组件拆到什么程度算是合理,还要因项目大小而异,小型项目可以简单几个组件搞定,甚至不用 vuex,axios 等等,如果规模较大就要细分组件,越细越好,包括布局的封装,按钮,表单,提示框,轮播等,推荐看下 Element 组件库的代码,没时间写这么详细可以直接用 Element 库,分几点进行优化

•组件有明确含义,只处理类似的业务。复用性越高越好,配置性越强越好。

•自己封装组件还是遵循配置 props 细化的规则。

•组件分类,我习惯性的按照三类划分,page、page-item 和 layout,page 是路由控制的部分,page-item 属于 page 里各个布局块如 banner、side 等等,layout 里放置多个页面至少出现两次的组件,如 icon, scrollTop 等

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

redux-thunk实战项目案例详解

如何使用Angular数据绑定机制

The above is the detailed content of How to optimize Vue projects. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template