移动端开发思考
Git commit前eslint自动检查代码质量
package.json
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"src/**/*.{js,vue}": [
"npm run lint"
]
},
.eslintrc.js
![](/Users/huajun/Library/Application Support/typora-user-images/image-20221227153243215.png)
vue/jsx页面是如何适配不同手机
postcss-pixel-to-viewpor:它是一个利用JS插件来对CSS进行转换的工具,将px单位自动转换成viewport单位
配置 Postcss.config.js
module.exports = {
plugins: [
// require('./webpack-local-plugins/postcss-plugin-border-1px'),
require('autoprefixer')({
browsers: ['last 5 version', 'Android >= 4.0'],
// 是否美化属性值 默认:true
cascade: true,
// 是否去掉不必要的前缀 默认:true
remove: true
}),
require('postcss-pixel-to-viewport')({
viewportWidth: 375, // 视窗的宽度,对应的是我们设计稿的宽度,一般是750
viewportUnit: 'vw', // 指定需要转换成的视窗单位,建议使用vw
propertyBlacklist: ['.ignore'], // 指定不转换为视窗单位的类,可以自定义,可以无限添加,建议定义一至两个通用的类名
minPixelValue: 1, // 小于或等于`1px`不转换为视窗单位,你也可以设置为你想要的值
enableConvertComment: 'on',
disableConvertComment: 'off',
mediaQuery: false
})
]
};
![image-20221227154013201](/Users/huajun/Library/Application Support/typora-user-images/image-20221227154013201.png)
效果
.class {
margin: -10px .5vh;
padding: 5vmin 9.5px 1px;
border: 3px solid black;
border-bottom-width: 1px;
font-size: 14px;
line-height: 20px;
}
### after build
.class {
margin: -3.125vw .5vh;
padding: 5vmin 2.96875vw 1px;
border: 0.9375vw solid black;
border-bottom-width: 1px;
font-size: 4.375vw;
line-height: 6.25vw;
}
组件样式覆盖
由于交互设计是明确的,引入组件需要做全局或者局部样式覆盖
组件二开
尺寸兼容性、安卓ios兼容性、版本过低
高度、宽度尽量使用vh、vw来处理
string replace vs replaceAll (String.prototype.replaceAll()
方法是在ES2021/ES12中被加入)
ios企业微信用的ios系统自带的WKWebview
Android的是tbs x5
mac版的微信浏览器内核是系统的safari
windows版cef核心浏览器版本是Chromium框架53
ios特有的底部横条兼容,不处理会导致页面与底部重叠
/*兼容iosx + */
padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/
![image-20221227165614710](/Users/huajun/Library/Application Support/typora-user-images/image-20221227165614710.png)
按需引入组件库组件
elementUI仅引入upload组件
jsx双刃剑
Good: 逻辑、代码结构类似后端容易理解等;
Bad: 组件库demo都用写法,存在到jsx转换的过程,特别是通过双向绑定的属性值获取;
举例1:由于mand mobile组件dialog demo写法是, 导致无法完全复用,通过阅读mand mobile dialog组件发现,文档中未提到的input事件可以关闭窗口 https://github.com/didi/mand-mobile/blob/master/components/dialog/dialog.vue
举例2:v-html对应的jsx写法 https://v2.cn.vuejs.org/v2/guide/render-function.html 提取公共css 文件上传问题 Nginx client_max_body_size限制,默认1M<md-dialog
title="窗口标题"
:closable="true"
v-model="basicDialog.open"
:btns="basicDialog.btns">
人生的刺,就在这里,留恋着不肯快走的,偏是你所不留恋的东西。
</md-dialog>
// MARK: public methods
close() {
this.$emit('input', false)
},
<div v-html='<p>xxx</p>'/>
// DOM property
h('div',{domProps: {innerHTML: 'xxx'})