Vue工程linux构建遇到的坑

问题一:编译器版本差异问题,报错信息如下:

Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 10.x

Found bindings for the following environments:
  - Windows 64-bit with Node.js 8.x

这个问题是版本不一致导致了,正常开发环境使用版本为windows node 8.x;使用服务器构建时采用了Linux node 10.x; read more

基于Vue进行web开发的前端常见错误

* 值设置缺少冒号(如采用ESLint等进行代码校验可避免此问题出现)

Vue开发过程中,一般情况下,只有在属性为变量时才会在属性前添加冒号,如直接填写为属性值则不添加冒号;
但也有一些特殊情况,例如进行tree开发时使用的indent属性,按照一般情况的说法,此属性设置应如下:

indent=“8”

这个时候如果打开页面F12会看到报类型错误

错误原因:该字段的值类型应为number,可我们填写的类型是string

解决办法:在前添加冒号

:indent=“8”

相同的情况还有应为boolean类型却填写String类型等,解决办法同上

* 不同环境相同代码某一环境显示异常,相关错误信息不再展示(基础数据未及时更新)

此种情况第一反应为:数据问题或配置问题

因为配置问题造成此种情况的可能性相对较小,一般出现在首次部署的时候,后期一旦调通之后几乎不会发生变化

下面来说下数据问题引起异常的情况

因每个系统业务不同,所以针对业务数据的排查可结合自己的业务进行分析

剩下的基本就是系统参数或数据字典了(暂时只考虑到了这些情况,如有补充可留言)

举例说明下我这边遇到的一个问题

有一个页面展示,内置table,table有一个类型字段,后台传给我的是类型的代码,此时我需要根据数据字典进行值映射,添加对应的数据字典到库中,好的页面开发完成。这个时候打包部署,页面显示异常,要现在来说很明显是部署后的测试库或生产库数据字典的问题,但我们很可能因为一个小的疏忽花费大量的时间去解决

* 变量赋值成功,但页面无法显示

场景说明:

data:{A:null,B:null,C:null}//有ABC两个字段,假设A字段为登录名,B字段为所属部门,需要通过选择A来得到B的值,C用来保存其他信息

新增和修改共用一套组件

因为新增和修改公用一套组件,为了防止修改后新增表单元素出现上次修改的值,所以我需要在点击新增的时候,初始化data:

data={}//出错原因

设置初始化之后,选择下拉框A的值,通过监听事件给B赋值,但页面没有改变显示,反复查看,B已经得到了值

造成错误的原因就是因为初始化的方式不对,在初始化时我直接为data重新赋值,相当于原来的data已经不存在了,原来的ABC也不存在了,所以VUE无法去监听B发生了变化无法刷新页面,因为他根本就是两个B

解决办法:
写一个通用的clear方法

clearData(data){
  for(var k in data){
    data[k]=null;
  }
  return data;
}
* 后续如遇到其他类型的错误会持续更新...

MockJs中Random详解

随机生成一个常见的英文名
Random.first()

随机生成一个常见的英文姓
Random.last()

随机生成一个常见的英文姓名
Random.name( middle? )
说明:
middle(可选),布尔值。指示是否生成中间名

随机生成一个常见的中文名
Random.cfirst()

随机生成一个常见的中文姓
Random.clast()

随机生成一个常见的中文姓名
Random.cname()

随机生成一个 URL
Random.url( protocol?, host? )
调用方式:
Random.url()
Random.url( protocol, host )
说明:
protocol(可选),指定 URL 协议。例如 http。
host(可选),指定 URL 域名和端口号。例如 nuysoft.com。

随机生成一个 URL 协议
Random.protocol()

说明:
返回以下值之一:’http’、’ftp’、’gopher’、’mailto’、’mid’、’cid’、’news’、’nntp’、’prospero’、’telnet’、’rlogin’、’tn3270’、’wais’。

随机生成一个域名
Random.domain()

随机生成一个顶级域名
Random.tld()

随机生成一个邮件地址
Random.email( domain? )

说明:
domain(可选),指定邮件地址的域名

随机生成一个 IP 地址
Random.ip()

随机生成一个(中国)大区
Random.region()

随机生成一个(中国)省(或直辖市、自治区、特别行政区)
Random.province()

随机生成一个(中国)市
Random.city( prefix? )
说明:
prefix(可选),布尔值。指示是否生成所属的省

随机生成一个(中国)县
Random.county( prefix? )
说明:
prefix(可选),布尔值。指示是否生成所属的省、市

随机生成一个邮政编码(六位数字)
Random.zip()

随机生成一个Boolean类型
Random.boolean

随机生成1到100的自然数
Random.natural(1, 10)

随机生成1到100的整数
Random.integer(1, 100)

随机生成0到100之间的浮点数,小数点后尾数为0到5位
Random.float(0, 100, 0, 5)

随机生成字符串,可加参数定义规则
Random.character()

随机生成2到10个字符之间的字符串
Random.string(2, 10)

随机生成一个数组
Random.range(0, 10, 2)

随机生成一个日期,可加参数定义日期格式
Random.date()

随机生成一个颜色值
Random.color()

随机生成2至5个句子的文本
Random.paragraph(2, 5)

随机生成一个图片
Random.image(Random.size, ‘#02adea’, ‘Hello’)
其中Random.size表示将从size数据中任选一个数据,size集合是自定义的集合,如下:
let size = [‘300×250’, ‘250×250’]

* 如发现有新的使用需求会继续添加

Vue生命周期

每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期

我们可以再不同的声明周期对vue进行设置,以达到我们想要的效果

vue一整个的生命周期中会有很多钩子函数提供给我们在vue生命周期不同的时刻进行操作

beforeCreate :创建之前或者说刚刚创建,属性渲染等都还未进行
created :创建之后,属性设置完成,但还未生成DOM
在created的时候数据和data属性进行绑定
beforeMount :加载之前
此时vue的引用模板还未进行渲染
mounted :加载之后
在mounted进行了占位符的替换,例如:{{message}}
在此时可加入一些需要初始调用的方法等
beforeUpdate :更新之前
updated :更新之后
当vue的data发生变化时会先后调用beforeUpdate和updated,在进行一些异步操作时,数据发生变动,从而页面也需要进行一定的操作,这是可调用这两个方法进行设置
beforeDestroy:销毁之前
此时Vue实例还在,但即将销毁
destroyed :销毁之后

* 最常用的应是mounted,一般情况下会在此处进行一些初始化逻辑
* updated本人在点击某个元素刷新其他元素集的时候进行过一些引用,用于重新渲染一些元素集
* 创建阶段可加入一些权限验证,如果不通过则停止声明周期的继续进行
* 销毁阶段可进入一些记录等

Vue项目引入mockjs实现模拟数据开发

1.安装mockjs: npm install mockjs –save-dev
2.在main.js中引入:
require('./mock') // simulation data
3.在src/api下新建index.js用来对请求进行封装
import axios from 'axios'

// 封装axios的post请求
export function fetch(url, params) {
return new Promise((resolve, reject) => {
axios.post(url, params)
.then(response => {
resolve(response.data)
})
.catch((error) => {
reject(error)
})
})
}

export default{
getData(url, params) {
return fetch(url, params)
}
}

4.在main.js旁边新建mock.js文件,用来定义生成数据的类型
// 引入mockjs
const Mock = require('mockjs')
// 获取 mock.Random 对象
const Random = Mock.Random
// mock一组数据
const produceNewsData = function() {
const articles = []
for (let i = 0; i < 100; i++) {
const newArticleObject = {
title: Random.csentence(5, 30), // Random.csentence( min, max )
thumbnail_pic_s: Random.dataImage('300x250', 'mock的图片'), // Random.dataImage( size, text ) 生成一段随机的 Base64 图片编码
author_name: Random.cname(), // Random.cname() 随机生成一个常见的中文姓名
date: Random.date() + ' ' + Random.time() // Random.date()指示生成的日期字符串的格式,默认为yyyy-MM-dd;Random.time() 返回一个随机的时间字符串
}
articles.push(newArticleObject)
}
return {
articles: articles
}
}
//
// // Mock.mock( url, post/get , 返回的数据);
Mock.mock('/news/index', 'post', produceNewsData)

5.在页面中引入请求(下面为js片段)

import api from '../../api/index'
/**
* @Author: justin.Sun
* @Date: 2018/11/7 9:24
*/
export default {
data() {
return {
data: []
}
},
created() {
this.setNewsApi()
},
methods: {
setNewsApi: function() {
api.getData('/tree/info', '')
.then(res => {
console.log(res)
this.data.push(...res.articles)
})
}
}
}

Vue项目在Nginx下部署

前提:nginx可正常启动

1.切换目录到nginx配置目录下:cd /usr/local/nginx/conf
2.编辑nginx.conf文件:vi nginx.conf
3.主要进行service部分配置即可:
server
{
listen 8081;#监听端口,即配置好之后用来访问项目的端口
server_name localhost;#域名,没有就localhost吧,写ip也可以
root /app/vue/;#站点目录,该目录为vue项目编译后的静态资源放置目录,即build后dist下的文件copy到/app/vue/下
index index.html;
location ^~/vue { #过滤请求前缀为vue的进来这里,此处正则可以百度到
alias /app/vue;
try_files $uri $uri/ /vue/index.html;
}
location /api/ { #这里主要进行后端接口的代理转发,将包含api的请求全部转发到下面的连接,需开发环境就采用代理模式
proxy_pass http://110.120.130.140:0000/;

#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
access_log off;
}
4.保存修改并退出
5.切换到执行目录下:cd ../sbin
6.更新nginx引用的配置 ./nginx -s reload
7.如果无信息显示则说明执行成功,否则启动nginx,如显示配置的端口信息则说明更新成功: ./nginx

* 启动后可能会出现404或页面空白等问题,需要做的是检查vue项目里的配置、检查nginx的配置、检查nginx是否安装成功等
tomcat部署vue项目遇到的问题:
1.如项目启用代理模式进行开发,则在tomcat部署静态页面后需采用nginx或其他进行数据代理转发,否则无法正常请求后台
2.如未使用代理模式且请求数据状态码为403则为跨域问题,可在后端添加支持跨域的注解或者采用其他方法开启跨域
3.建议采用代理模式,可将数据接口隐藏,保证数据安全性