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

挪動端H5多頁開闢敲門磚履歷

兩年前剛打仗挪動端開闢,剛最先比較迷惑,每次碰到題目都是到社區里發問或許吸收先輩的履歷分享,謝謝熱衷於分享的開闢者為前端社區帶來欣欣向上的生命力。本文連繫先前寫的文章和開闢履歷分享

《挪動端H5多頁開闢敲門磚履歷》
兩年前剛打仗挪動端開闢,剛最先比較迷惑,每次碰到題目都是到社區里發問或許吸收先輩的履歷分享,謝謝熱衷於分享的開闢者為前端社區帶來欣欣向上的生命力。本文連繫先前寫的文章和開闢履歷分享給人人,願望也能協助剛步入挪動端開闢的新人解惑。以下會以其中一個以公積金頁面開闢項目作為例子,引見挪動端的一些常見題目和使用Vuejs作為lib舉行多頁開闢的履歷。

挪動端自適應規劃

在項目中挪動端最經常運用的自適應規劃計劃就是flexbox連繫rem。範例的分欄式運用flexbox,其他大部份不規則視圖運用rem,關於rem最經常運用的計劃就是淘寶開源的可伸縮規劃計劃。

依據裝備裝備像素比設置scale的值(scale = 1 / deviceRatio),如許能夠堅持視口device-width一直即是裝備物理像素,接着依據屏幕大小動態盤算根字體大小,詳細是將屏幕劃分為100平分,每份為a,1rem就即是10a。

標註

平常我們會拿到750寬的設想稿,這是基於iPhone6的物理分辨率。有的設想師或許會偷懶,設想圖上面沒有任何的標註,假如我們邊開闢邊量尺寸,無疑效力是比較低的。要麼讓設想師標註上,要麼自力更生。

假如設想師着實沒有時刻,引薦運用markman舉行標註,免費版閹割了一些功用(比方沒法保存當地)不過基礎滿足了我們的需求了。

厥後我發明比markman更好的標註東西PxCook,該東西能夠顯現PSD設想圖中的圖層的款式代碼,關於前端來講幾乎輕易極了。

標註完成后最先寫我們的款式,運用了淘寶的lib-flexible庫以後,我們的根字體基準值就為750/100*10 = 75px。此時我們從圖中若某個標註為100px,那末css中就應當設置為100/75 = 1.333333rem。所以為了進步開闢效力,能夠運用px轉化為rem的插件。下面是sublimeText和Vscode的轉換插件:

px轉rem插件

  • sublimeText插件:rem-unit

《挪動端H5多頁開闢敲門磚履歷》

  • Vscode插件: cssrem

《挪動端H5多頁開闢敲門磚履歷》

運用rem的幾點總結

  • 在一切的單元中,font-size引薦運用px,然後連繫媒體查詢舉行重要節點的掌握,如許能夠滿足凸起或許弱化某些字體的需求,而非團體調解。
  • 眾向的單元能夠悉數運用px,橫向的運用rem,因為挪動裝備寬度有限,而高度能夠無窮向下滑動。但這也有慣例,比方關於一些運動註冊頁面,須要在一屏幕內完整顯現,沒有下拉,這時刻一切眾向或許橫向都應當運用rem作為單元。如圖:

《挪動端H5多頁開闢敲門磚履歷》

左圖的表單高度單元因為下邊空距較大,運用px在差別屏幕顯現越發;而右側的運動註冊頁因為不能湧現滾動條,一切的眾向高度、margin、padding都應當運用rem。

  • border、box-shadow、border-radius等一些結果應當運用px作為單元。

手機狀況欄和瀏覽器導航欄的影響

之前宣布的文章中,有個SF的前端小夥伴提出的題目:
文中作者有重點強調規劃悉數鋪滿,和下方與許多閑暇的處置懲罰計劃是差別的,在工作中我碰到這類狀況,設想師的設想稿寬度為750×1334,但現實的展現高度並沒有那末多,因為上方有導航欄還包含手機本身的狀況欄展現,所以團體高度就達不到750,然則設想師設想稿是嚴厲根據750舉行設想的,這類狀況下運用rem,嚴厲根據設想師尺寸舉行復原就會湧現屏幕湧現滾動條狀況,叨教針對這類狀況您是怎樣處置懲罰的?是從設想稿上範例,照樣從開闢上有響應的步伐

照舊以我的分享界面為例:
展現高度差別平常發生在微信及瀏覽器端,因為前者沒有地址欄和東西欄,如許顯現高度平常會和設想師設想的視圖符合。那假如根據純padding,margin縱然悉數運用rem,在瀏覽器端照舊會超越一屏高度,關於分享頁面這類不是我們想要看到的。這時刻就要做出棄取,我對主體地區採納相對定位,如許上面間隙雖然小,不過仍能堅持在一個屏幕高度顯現。若採納margin padding在設置,必定已湧現滾動條。固然如許的條件是依靠設想圖的,平常設想師會為了空間感有保存肯定的間隙,也不會將重要對象高度設的太高,不然太撐滿也不好看,開闢上假如設想圖寬高沒有在肯定界線以內,超越也沒法防止,不過我們這類分享界面平常是經由歷程微信分享摯友,經由歷程瀏覽器翻開的視圖結果湧現滾動條實在也不怎樣影響不是么?
下面附上微信端和瀏覽器端的結果圖:

微信端:《挪動端H5多頁開闢敲門磚履歷》

瀏覽器端: 《挪動端H5多頁開闢敲門磚履歷》

Vuejs作為lib開闢挪動端頁面

為什麼不運用SPA情勢

平常挪動端運用vue是為了數據交互頻仍而且疾速開闢的頁面,為什麼不運用單頁SPA開闢情勢,緣由也許幾點。

  • 為了疾速開闢,疾速上線
  • 項目其他成員不熟悉SPA,不熟悉webpack
  • 介入項目時項目已運用多頁開闢,短時刻沒法重構

拋開運用單頁的架構,開闢多頁應用時,一個頁面交互邏輯與一個Vue實例對應。

基於接口返回數據的屬性注入

“基於接口返回數據的屬性注入”是個人豎立的話術,拋開此觀點,先說一下錶單數據的綁定體式格局。

表單的數據綁定

一個重要的點是有幾份表單就離開幾個表單對象舉行數據綁定

以上圖公積金查詢為例,因為差別都市會有差別的查詢要素,能夠上岸體式格局只要一種,也能夠有幾種。比方上圖有三種上岸體式格局,在運用vue規劃時,有兩種計劃。

  • 1、 只豎立一個表單用於數據綁定,點擊按鈕觸發推斷
  • 2、有幾種上岸體式格局豎立幾個表單,用一個字段標識當前顯現的表單

因為運用第三方的接口,一最先也沒有先舉行接口返回數據結構的檢察,採納了第一種毛病的體式格局,毛病一是每種上岸體式格局下面的上岸要素的數目也差別,毛病二是數據綁定在同一個表單data下,當用戶在用戶名上岸體式格局輸入用戶名暗碼后,切換到客戶號上岸體式格局,就會湧現數據紊亂的狀況。

處理完規劃題目后,我們須要依據設想圖定義一些狀況,比方當前上岸體式格局的切換、贊同受權狀況的切換、按鈕是不是能夠點擊的狀況、是不是處於要求中的狀況。固然另有一些app穿過來的數據,這裏就疏忽了。

data: {
tags: {
arr: [''],
activeIndex: 0
},
isAgreeProxy: true,
isLoading: false
}

接着檢察一下接口返回的數據,引薦運用chrome插件postman,比方呼和浩特的上岸要素以下:

{
"code": 2005,
"data": [
{
"name": "login_type",
"label": "身份證號",
"fields": [
{
"name": "user_name",
"label": "身份證號",
"type": "text"
},
{
"name": "user_pass",
"label": "暗碼",
"type": "password"
}
],
"value": "1"
},
{
"name": " login_type",
"label": "公積金賬號",
"fields": [
{
"name": "user_name",
"label": "公積金賬號",
"type": "text"
},
{
"name": "user_pass",
"label": "暗碼",
"type": "password"
}
],
"value": "0"
}
],
"message": "登錄要素要求勝利"
}

能夠看到呼和浩特有兩種受權上岸體式格局,我們在data中定義了一個loginWays,初始為空數組,接着methods中定義一個要求接口的函數,內里就是基於返回數據的基礎上為上面fields對象注入一個input字段用於綁定,這就是所謂的基於接口返回數據的屬性注入。

methods: {
queryloginWays: function(channel_type, channel_code) {
var params = new URLSearchParams();
params.append('channel_type', channel_type);
params.append('channel_code', channel_code);
axios.post(this.loginParamsProxy, params)
.then(function(res) {
console.log(res);
var code = res.code || res.data.code;
var msg = res.message || res.data.message;
var loginWays = res.data.data ? res.data.data : res.data;
// 查詢失利
if (code != 2005) {
alert(msg);
return;
}
// 增加input字段用於v-model綁定
loginWays.forEach(function(loginWay) {
loginWay.fields.forEach(function(field) {
field.input = '';
})
})
this.loginWays = loginWays;
this.tags.arr = loginWays.map(function(loginWay) {
return loginWay.label;
})
}.bind(this))
}
}

縱然返回的數據有我們不須要的數據也沒有關聯,如許保證我們不會丟失舉行下一步上岸所須要的數據。

如許多個表單綁定數據題目處理了,那末怎樣舉行頁面間數據通報?假如是app傳過來,那末平常運用URL拼接的體式格局,運用window.location.search取得queryString后再舉行截取;假如經由歷程頁面套入javaWeb中,那末直接運用”${字段名}”就可以獵取,注重要js中獵取java字段須要加雙引號。

computed: {
// 實在姓名
realName: function() {
return this.getQueryVariable('name') || ''
},
// 身份證
identity: function() {
return parseInt(this.getQueryVariable('identity')) || ''
},
/*If javaWeb
realName: function() {
return this.getQueryVariable('name') || ''
},
identity: function() {
return parseInt(this.getQueryVariable('identity')) || ''
}*/
},
methods: {
getQueryVariable: function(variable) {
var query = window.location.search.substring(1);
var vars = query.split('&');
for (var i = 0; i var pair = vars[i].split('=');
if (decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
console.log('Query variable %s not found', variable);
}
}
關於前端跨域調試

在舉行接口要求時,我們的頁面平常是在sublime的當地服務器或許vscode當地服務器預覽,所以要求接口會碰到跨域的題目,假如運用Gulp舉行打包,能夠運用插件http-proxy-middleware,或許運用nginx。

運用Gulp

在項目構建的時刻平常我們源代碼會放在src文件夾下,然後運用gulp舉行代碼的緊縮、兼并、圖片的優化(依據須要)等等,我們會運用gulp。

處理跨域的題目能夠用gulp-connect連繫http-proxy-middleware,此時我們在gulp-connect中的當地服務器舉行預覽調試。

gulpfile.js以下: 開闢歷程運用gulp server:dev敕令,監聽文件修改並運用livereload革新,而且代辦src目次;運用gulp敕令舉行打包;運用gulp server:dist代辦dist臨盆目次。

var gulp = require('gulp');
var cOncat= require('gulp-concat');
var uglify = require('gulp-uglify');
var autoprefixer = require('gulp-autoprefixer');
var useref = require('gulp-useref');
var cOnnect= require('gulp-connect');
var proxyMiddleware = require('http-proxy-middleware');
// 開闢跨域代辦 將localhost:8088/api 映照到 https://api.xxxxx.com/
gulp.task('server:dev', ['listen'], function() {
var middleware = proxyMiddleware(['/api'], {
target: 'https://api.xxxxx.com/',
changeOrigin: true,
pathRewrite: {
'^/api': '/'
}
});
connect.server({
root: env == 'dev' ? './src' : './dist',
port: 8088,
livereload: true,
middleware: function(connect, opt) {
return [middleware]
}
});
});
// 打包后跨域代辦
gulp.task('server:dist', ['listen'], function() {
var middleware = proxyMiddleware(['/api'], {
target: 'https://api.xxxxx.com/',
changeOrigin: true,
pathRewrite: {
'^/api': '/'
}
});
connect.server({
root: './dist',
port: 8088,
livereload: true,
middleware: function(connect, opt) {
return [middleware]
}
});
});
gulp.task('html', function() {
gulp.src('src/*.html')
.pipe(useref())
.pipe(gulp.dest('dist'));
});
gulp.task('css', function() {
gulp.src('src/css/main.css')
.pipe(concat('main.css'))
.pipe(autoprefixer({
browsers: ['last 2 versions'],
cascade: false
}))
.pipe(gulp.dest('dist/css/'));
gulp.src('src/css/share.css')
.pipe(concat('share.css'))
.pipe(autoprefixer({
browsers: ['last 2 versions'],
cascade: false
}))
.pipe(gulp.dest('dist/css/'));
gulp.src('src/vendors/css/*.css')
.pipe(concat('vendors.min.css'))
.pipe(autoprefixer({
browsers: ['last 2 versions'],
cascade: false
}))
.pipe(gulp.dest('dist/vendors/css'));
return gulp
});
gulp.task('js', function() {
return gulp.src('src/vendors/js/*.js')
.pipe(concat('vendors.min.js'))
.pipe(uglify())
.pipe(gulp.dest('dist/vendors/js'));
});
gulp.task('img', function() {
gulp.src('src/imgs/*')
.pipe(gulp.dest('dist/imgs'));
});
gulp.task('listen', function() {
gulp.watch('./src/css/*.css', function() {
gulp.src(['./src/css/*.css'])
.pipe(connect.reload());
});
gulp.watch('./src/js/*.js', function() {
gulp.src(['./src/js/*.js'])
.pipe(connect.reload());
});
gulp.watch('./src/*.html', function() {
gulp.src(['./src/*.html'])
.pipe(connect.reload());
});
});
gulp.task('default', ['html', 'css', 'js', 'img']);

運用nginx

在nginx設置運用proxy_pass,須要注重一點:
假如在proxy_pass背面的url加/,示意相對根途徑;假如沒有/,示意相對途徑,把婚配的途徑部份也給代辦走。

server {
listen 80;
server_name localhost;
root [Your project root];
index index.html index.htm default.html default.htm; location ^~/api {
proxy_pass https://api.xxxxx.com/;
}
}
民眾號網頁的調試

假如你開闢的H5基於微信jsSDK,你肯定打仗過微信受權域名,微信會將受權數據傳給一個回調頁面,而回調頁面必需在你設置的域名下(含子域名)。比方我們獵取用戶的openid操縱。而微信設置域名歸去該域名根目次下檢測一個xxx_verify_xxx.txt文件,確保該域名是屬於你的。

所以要想在微信開闢調試東西中獵取openid,我們須要運用一種叫做內網穿透的東西。下面是本身比較經常運用的兩個東西:

  • ngrok
  • 花生殼

ngrok

ngrok執行敕令

ngrok -config ngrok.cfg start web

在ngrok.exe目次須要一個設置文件ngrok.cfg
以下是設置示例:

server_addr: "tunnel.cn:4443"
trust_host_root_certs: false
tunnels:
web:
subdomain: "xxx"
proto:
http: 8086
https: 8086

啟動后xxx.tunnel.cn:4443會指向你當地的8086端口,將xxx_verify_xxx.txt文件放到8086端口根目次即可設置受權域名勝利。

花生殼

花生殼免費版關於個人開通僅需6元,然後每個月會供應給你1G的流量,免費版不支撐80端口,最多支撐兩個域名,須要下載桌面客戶端。

增加域名映照很簡單,免費版沒法設置自定義域名,由花生殼自動天生。
《挪動端H5多頁開闢敲門磚履歷》
設置勝利后啟動客戶端可檢察當前的狀況

謝謝瀏覽,迎接任何情勢的手藝發問和交換!迎接關注民眾號前端新視界,把握手藝前沿資訊。

  • 郵箱:me@huzerui.com
  • 主頁:huzerui.com
  • 知乎:hzr

推荐阅读
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 在package.json中有如下两个对象:husky:{hooks:{pre-commit:lint-staged}},lint-staged:{src** ... [详细]
  • VUE中引用路径的配置
    在vue项目开发中经常引用JS、CSS、IMG文件。当项目较大时文件层级很多,导致路径很长,我们可以通过在bulidwebpack.base.conf.js设置简便的引用路径一、 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
author-avatar
skyyyf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有