# 一、开发规范
开发人员需遵照开发规范执行
# 1、基本原则
- 由于jquery在移动端的开发存在性能问题,页面不允许导入jquery库,如果已经习惯了jquery开发的,可以导入zepto库进行代替;
- 样式需进行兼容处理;
- UE交互保持一致性、UI风格保持一致性、代码风格保持一致性;
- 谨慎引入第三方前端库,引入时需要充分考虑性能、稳定性、可维护性和技能要求。
# 2、页面开发规范
- 页面使用UTF-8编码
- 页面首屏数据量大小在1M以内,多余的部分需要使用异步导入的方式;
- 禁止ajax同步请求;
- 尽可能减少 div 嵌套;
- 样式代码不能使用CSS表达式;
- dom选择尽量使用ID选择;
- 所有的标签名必须小写;
- 所有的标签属性名必须小写;
- z-index的最高使用层级为49;
- 不要随意的使用position定位;
- link标签写在head标签内;
- script标签写在body标签结尾处;
- 国际化资源以中文简体资源为首选资源;
- 业务逻辑入口需放在cmp.ready回调里,如:cmp.ready(function(){业务逻辑}):
http://cmp/v1.0.0/js/cordova/__CMPSHELL_PLATFORM__/cordova.js
http://cmp/v1.0.0/js/cordova/cordova-plugins.js
- 必须导入cmp平台的js,导入文件规则:
//======== 代码运行在M3 app上
<link href="http://cmp/v/css/cmp.css" rel="stylesheet" type="text/css" />
<script src="http://cmp/v/js/cmp-i18n.js"></script>
<script src="http://cmp/v/js/cmp.js"></script>
//=======代码运行在微信、钉钉等或者第三方app以url的方式接入oa的H5页面时
<link href="/seeyon/m3/cmp/css/cmp.css" rel="stylesheet" type="text/css" />
<script src="/seeyon/m3/cmp/js/cmp-i18n.js"></script>
<script src="/seeyon/m3/cmp/js/cmp.js"></script>
- 页面采用自适应屏幕宽度设置:
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
# 3、代码结构
- html文件放到html文件夹;
- css文件放到css文件夹;
- js文件放到js文件夹;
- 图片文件放到img文件夹;
- 国际化资源文件放到i18n文件夹。
# 4、命名
- camel命名风格
# 二、项目结构规范
project
|----html <!--html文件夹-->
-- index.html
|----js <!--js文件夹-->
-- index.js
|----css <!--css文件夹-->
-- index.css
|----img <!--图片文件夹-->
|----i18n <!--国际化文件夹-->
-- project_en.js
-- project_zh_CN.js
-- project_zh_TW.js
|----s3scriptjspdata <!--S3编译文件夹-->
-- project_m3_commandata.data
-- project_wechat_commandata.data
-- project_dingding_commandata.data
-- manifest.json <!--模块配置文件-->
-- newModule_m_api.s3js <!--模块消息穿透、门户待办穿透api设置文件-->
# 三、cmp.ready里面应该做什么
首先要知道在运行cmp.ready时内部做了什么东西:
function CMPReady() {
var _this = this;
_ready.setDeviceClass();
this.CMPISReady = $.platform.CMPShell ? false : true;
this.handles = [];
//M3中的cordova ready
try {
!window.parent.CMPREADYMARK && _ready.deviceReadyListener();
} catch (error) {
console.log(error);
}
//文档ready
_ready.documentReadyTask();
//第三方sdk
_ready.loadJSSDKTask();
//调试JS任务
_ready.loadDebugJsTask();
//除debugJS任务外,其余任务完成后的操作
pool.free(function() {
//CMPREADYMARK这个变量业务层在用,没搞懂为啥要开放这个
window.CMPREADYMARK = _this.CMPISReady = true;
_ready.setTheme();
_ready.releaseHandles(_this);
});
}
可以看见里面做了加载设备类名、加载第三方SDK、加载主题、等一系列操作,所以只能在cmp.ready里面才能做很多操作,比如注册返回事件cmp.backbutton、比如ready里面获取body元素上的类名等,其实归根结底就是类似jquery的ready,在完成一系列加载之后,才能在ready里面使用api或者一些方法等等。
# 四、js、css在cmp平台下导入的顺序规范以及微协同和M3上导入的差异性
M3平台文件路径
CSS导入参考:
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
<meta name="format-detection" content="telephone=no,email=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-touch-fullscreen" content="yes" />
<meta http-equiv="Content-Security-Policy" />
<meta name="author" content="Clyne" />
<title></title>
<meta name = "cmp-screen-orientation" content = "all">
<!--cmp样式-->
<link rel="stylesheet" href="http://cmp/v/css/cmp.css" />
<link rel="stylesheet" href="http://cmp/v/css/cmp-sliders.css" />
<!--基础样式-->
<link rel="stylesheet" href="http://commons.m3.cmp/v/css/base.css" />
<!--图标样式-->
<link rel="stylesheet" href="http://commons.m3.cmp/v/fonts/iconfont.css" />
<!--业务样式-->
<link rel="stylesheet" href="http://application.m3.cmp/v/css/app_application.css" />
</head>
JS导入参考:
<!-- 基础模块 -->
<script src="http://cmp/v/js/cmp-i18n.js"></script>
<script src="http://cmp/v/js/cordova/__CMPSHELL_PLATFORM__/cordova.js"></script>
<script src="http://cmp/v/js/cordova/cordova-plugins.js"></script>
<script src="http://cmp/v/js/cmp.js"></script>
<!-- cmp组件(按需引入) -->
<script src="http://cmp/v/js/cmp-asyncLoad.js"></script>
<script src="http://cmp/v/js/cmp-webviewListener.js"></script>
<!-- 针对M3应用的公共文件(V5应用可忽略) -->
<script src="http://commons.m3.cmp/v/js/m3-path.s3js"></script>
<script src="http://commons.m3.cmp/v/lib/seajs-2.2.1.js"></script>
<script src="http://commons.m3.cmp/v/config.js"></script>
<!-- 自己业务的模块入口文件 -->
<script async src="http://application.m3.cmp/v/js/sea-app-workbench.js"></script>
</body><!--!!!js的导入必须到body页签的结尾处!!!-->
微协同平台路径
CSS导入参考:
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
<meta name="format-detection" content="telephone=no,email=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-touch-fullscreen" content="yes" />
<meta http-equiv="Content-Security-Policy" />
<meta name="author" content="Clyne" />
<title></title>
<meta name = "cmp-screen-orientation" content = "all">
<!--cmp样式-->
<link rel="stylesheet" href="/seeyon/m3/cmp/css/cmp.css" />
<link rel="stylesheet" href="/seeyon/m3/cmp/css/cmp-sliders.css" />
<!--业务样式-->
<link rel="stylesheet" href="/seeyon/m3/apps/v5/bulletin/css/bulletinIndex.css" />
</head>
JS导入参考:
<!-- 基础模块 -->
<script src="/seeyon/m3/cmp/js/cmp-i18n.js"></script>
<script src="/seeyon/m3/cmp/js/cmp.js"></script>
<!-- cmp组件(按需引入) -->
<script src="/seeyon/m3/cmp/js/cmp-asyncLoad.js"></script>
<script src="/seeyon/m3/cmp/js/cmp-webviewListener.js"></script>
<!-- 自己业务的模块入口文件 -->
<script async src="/seeyon/m3/apps/v5/bulletin/js/bulletinIndex.js"></script>
</body><!--!!!js的导入必须到body页签的结尾处!!!-->
注:导入的顺序需要严格按照规范执行,不然会有报错和找不到方法或者变量的情况。
# 五、国际化资源使用properties开发以及在页面中导入的规范
# 1、文件命名:应用模块名+下横线+通用语言标识
# 2、国际化资源,必须以fI18nData JS对象进行扩展
<script>
if(typeof fI18nData == "undefined"){
fI18nData = {};
}
fI18nData["mobileWork.label.back"] = "返回";
fI18nData["mobileWork.label.submit"] = "提交";
</script>
# 3、国际化资源调用使用规则
<html>
<div><i18n key="mobileWork.label.back"></i18n></div> <!-- 使用国际化标签,key为国际化字符串 -->
</html>
<script>
var backStr = cmp.i18n("mobileWork.label.back"); //返回国际化字符串"返回";
</script>
# 4、国际化资源版本差异
版本 | 国际化代码开发规范 |
---|---|
7.1以下的版本(不包含7.1) | 开发源码按照第1点的规范直接用js文件写国际化资源 |
7.1及以上的版本(包含7.1) | 1、源码使用properties文件进行开发 |
2、需使用S3工具编辑后生成如第1点中的js文件 |
# 六、ajax调用规范
cmp.ajax({
url:cmp.seeyonbasepath + "/rest/.....", //seeyon的rest接口,cmp.seeyonbasepath是seeyon服务器路径,兼容M3和微协同
type:"GET",
headers:{ //请求headers,异步seeyon的rest接口设置如下headers字段
'Accept' : 'application/json; charset=utf-8',
'Accept-Language' : cmp.language,
'Content-Type': 'application/json; charset=utf-8',
'token' : cmp.token,//微协同请求必带上token
'option.n_a_s' : '1'
},
success:function(result){
//请求成功的业务逻辑
},
error:function(error){
if(cmp.errorHandle(error) == false){ //请求错误时,先使用cmp的错误处理组件,如果cmp的错误处理组件为false,说明cmp组件处理不了这个错误,需要业务自己处理(cmp处理的错误包括被迫下线、网络断开、session失效、更新密码等)
cmp.notification.alert("请求数据失败")
}
}
});
# 七、应用包之间穿透API设计规范
# 1、文件命名:应用模块名+下划线+api.s3js(文件命名必须和manifest.json中的entry下的jsapi字段保持一致)
# 2、穿透函数命名规范(openApp对应manifest.json的entry里的openAppMethod的值)
# 3、穿透函数开发例子(已在初始化应用包里自带)
var mobileWorkApi = (function(){ //api定义的名字和manifest中的openAppMethod字段相对应
var mobileWorkApi = function(){
this.basePath = "${data:dependencies.mobilework}";//编辑本模块的路径
}
mobileWorkApi.prototype.openApp = function(type,backUrl,option,obj) {
if(!option) {
return false;
}
var params = {};
var penetrateUrl = "";//数据穿透页面地址
if(type=="message") { //如果数据来自消息
params.from = "message";
}
if("todo" == type){ //如果数据来自待办
params.from = "todo";
}
var params.dataId = option.id;
var params.xxId = option.xxId;
if(option.dataType == "chooseCustomer"){//如果数据类型是打开选择客户页面
penetrateUrl = this.basePath + "/html/chooseCustomer.html";
}else if(option.dataType == "register"){//如果数据是打开外勤签到记录页面
penetrateUrl = this.basePath + "/html/register.html";
}
cmp.href.next(penetrateUrl,params);
}
return new mobileWorkApi();
# 七、UE样式规范
<!-- 以W3C标准的页面布局为例 -->
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
<meta name="format-detection" content="telephone=no,email=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-touch-fullscreen" content="yes" />
<meta http-equiv="Content-Security-Policy" />
<meta name="author" content="Clyne" />
<title></title>
<meta name = "cmp-screen-orientation" content = "all">
<!--cmp样式-->
<link rel="stylesheet" href="http://cmp/v/css/cmp.css" />
<link rel="stylesheet" href="http://cmp/v/css/cmp-sliders.css" />
<!--基础样式-->
<link rel="stylesheet" href="http://commons.m3.cmp/v/css/base.css" />
<!--图标样式-->
<link rel="stylesheet" href="http://commons.m3.cmp/v/fonts/iconfont.css" />
<!--业务样式-->
<link rel="stylesheet" href="http://application.m3.cmp/v/css/app_application.css" />
<style>
.red{color:red;}
</style>
</head>
<body>
<header class="cmp-bar cmp-bar-nav cmp-flex-header">
<div class="cmp-header-left">
<span class="cmp-icon see-icon-v5-common-arrow-back"></span>
</div>
<div class="cmp-title">
<span>header布局</span>
</div>
<div class="cmp-header-right cmp-flex2">
<span class="cmp-icon see-icon-add-round"></span>
<span class="cmp-icon see-icon-add-round"></span>
</div>
</header>
<div class="cmp-content">
//主容器
</div>
<footer class="cmp-bar cmp-bar-footer">底部按钮</footer>
<script src="/seeyon/m3/cmp/js/cmp-i18n.js"></script>
<script src="/seeyon/m3/cmp/js/cmp.js"></script>
<!-- cmp组件(按需引入) -->
<script src="/seeyon/m3/cmp/js/cmp-asyncLoad.js"></script>
<script src="/seeyon/m3/cmp/js/cmp-webviewListener.js"></script>
<!-- 自己业务的模块入口文件 -->
<script async src="/seeyon/m3/apps/v5/bulletin/js/bulletinIndex.js"></script>
</body>
</html>
编撰人:admin
快速跳转
