febs 库是一些常用的工具的合集;
支持browser端与node server端;
browser支持 IE9及以上浏览器.
browser支持常用的jquery操作, 可以在大多数场景下替代jquery.
browser详见 reamde
febs 包含browser端与server端代码.
独立的 browser端代码在 febs-browser 库中
Install
Use npm to install:
npm install febs --save
nodejs
以下列方式使用
var febs = require('febs');
febs.string.replace();
browser
以下列方式使用
copy directory node_modules/febs/browser/dist/febs
to client
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<link rel="stylesheet" type="text/css" href="path/febs/febs.css" />
<script charset='UTF-8' type="text/javascript" src="path/febs/febs.min.js"></script>
<script>
febs.string.replace();
</script>
babel
以下列方式使用
import febs from 'febs';
febs.string.replace();
framework
febs web库分为客户端与服务器端;
-
通用于客户端与服务端的库如下
-
客户端独有库
-
服务端独有库
说明
客户端中已将旧版本中的jquery依赖的相关内容抽出到 febs-ui 库中, febs
将不再依赖 jquery
. (ie9以下浏览器需要jquery/zepto).
name | description |
---|
__line | 当前所在行, 可以配合 __filename 定位错误日志 |
__debug | 判断当前的环境process.env.NODE_ENV是否为development, 如对此值设置后, 使用设置后的值. |
console.debug | development 环境下输出日志 |
其他
- 函数调用使用
类名.xxx
的方式调用, 例如: febs.utils.browserIsMobile()
- 对早期的浏览器定义了
window.requestAnimationFrame
和window.cancelAnimationFrame
方法,可进行动画帧操作. - 对早期的浏览器添加了
Promise
支持.
utils
utils库包含了一些常用的函数, 如判断浏览器是否是手机/时间字符串格式化等.
febs.utils.sleep(ms)
febs.utils.browserIsMobile(userAgent?:string)
febs.utils.browserIsIOS(userAgent?:string)
febs.utils.browserIsPhone(userAgent?:string)
febs.utils.browserIsWeixin(userAgent?:string)
febs.utils.browserIsIE()
febs.utils.browserIEVer()
febs.utils.browserIsSupportHtml5()
febs.utils.getTimeString(time, fmt, weekFmt)
febs.utils.getTimeStringFromNow(time, strFmt);
febs.utils.getDate(strDate)
febs.utils.getDate2(strDate)
febs.utils.mergeMap(...)
febs.utils.isNull(e)
febs.utils.denodeify(fn, self, argumentCount) `仅服务端`
febs.utils.bigint_check(v)
febs.utils.bigint_add(a, b)
febs.utils.bigint_minus(a, b)
febs.utils.bigint_dividedBy(a, b)
febs.utils.bigint_mul(a, b)
febs.utils.bigint_equal(a, b)
febs.utils.bigint_more_than(a, b)
febs.utils.bigint_more_than_e(a, b)
febs.utils.bigint_less_than(a, b)
febs.utils.bigint_less_than_e(a, b)
febs.utils.bigint_toFixed(a, fixed)
string
string 提供了一些js string对象缺少且较常使用的函数.
febs.string.isPhoneMobile(str)
febs.string.isEmpty(s)
febs.string.getByteSize(s)
febs.string.replace(str, strSrc, strDest)
客户端独有.
febs.string.escapeHtml(str);
crypt
目前提供了uuid,crc32,base64.
服务端独有.
febs.crypt.md5_file(filename)
febs.crypt.sha1_file(filename)
febs.crypt.uuid()
febs.crypt.crc32_file(filename)
febs.crypt.md5_begin():any;
febs.crypt.md5_update(hash:any, str: string|Buffer):void;
febs.crypt.md5_finish(hash:any):string;
febs.crypt.sha1_begin():any;
febs.crypt.sha1_update(hash:any, str: string|Buffer):void;
febs.crypt.sha1_finish(hash:any):string;
febs.crypt.base64_decode(strBase64, c2 = 0, c3 = 0, c4 = 0)
客户端独有.
febs.crypt.crc32_file(fileObj, cb)
febs.crypt.base64_decode(strBase64)
通用.
febs.crypt.crc32( str, crc )
febs.crypt.md5( strOrBuffer )
febs.crypt.sha1( strOrBuffer )
febs.crypt.base64_encode(arrByte)
animationFrame
各浏览器兼容的 requestAnimationFrame
, cancelAnimationFrame
动画方法.
var total = 0;
var timer;
var now = Date.now();
function foo(tm) {
var now2 = Date.now();
total += now2-now;
now = now2;
if (total > 10000) {
cancelAnimationFrame(timer);
} else {
timer = requestAnimationFrame(foo);
}
}
timer = requestAnimationFrame(foo);
net
net封装了浏览器通信方法: fetch, jsonp
febs.net.fetch(url, option)
febs.net.jsonp(url, option)
exception
定义了服务端常用的错误类型.
febs.code = code;
febs.msg = msg;
febs.filename = filename;
febs.line = line;
febs.exception.ERROR
febs.exception.PARAM
febs.exception.OUT_OF_RANGE
异常类如下
febs.exception(msg, code, filename, line)
file
febs.file.dirIsExist(dir)
febs.file.dirAssure(dir)
febs.file.dirCopy(src, dest, callback)
febs.file.dirRemoveRecursive(dir)
febs.file.dirExplorer(dir)
febs.file.dirExplorerFilesRecursive(dir, pattern)
febs.file.dirExplorerDirsRecursive(dir, pattern)
febs.file.fileSize(file)
febs.file.fileIsExist(file)
febs.file.fileCopy(src, dest, callback)
febs.file.fileRemove(file)
upload
multipart/form-data方式上传.
febs.upload.accept(ctx, conditionCB, checkCrc32=true)
base64数据流分段方式上传.
febs.upload.base64_acceptHeader(ctx, conditionCB, sessionSet)
febs.upload.base64_accept(ctx, finishCB, sessionGet, sessionSet, sessionClear)
febs.upload.base64_cleanup(sessionGet, sessionClear, cleanFile = true)
multipart/form-data方式实例
客户端使用multipart/form-data方式上传文件时, 需使用url参数上传如下参数:
name | description |
---|
crc32 | 文件内容的crc32计算值 |
size | 文件字节大小 |
data | (可选) 自定义数据; 自定义数据会在字节流上传完成后, 通过回调传递. |
例如: 上传url为 /upload?crc32=2134141&size=11231
也可以在浏览器端直接使用 febs-ui
中的上传方法.
服务端调用如下接口接收文件.
exports.upload = async function(ctx, next)
{
var r = await require('febs').upload.accept(ctx, async function(data, filesize, filename, filemimeType){
console.log(filesize);
console.log(filename);
console.log(filemimeType);
return 'tempPath/temp.filename';
});
};
前台:
<script type="text/javascript" charset="utf-8" src="/jquery/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="/jquery/jquery.form.min.js"></script>
<script type="text/javascript" charset="utf-8" src="/febs/febs.min.js"></script>
<script type="text/javascript">
function upload() {
febs.ui.upload({
formObj: $('#fileForm'),
fileObj: $("#filec"),
uploadUrl: '/uploadFile',
finishCB: function(err, fileObj, serverData){
console.log(serverData);
},
progressCB: function(fileObj, percent){
console.log(percent);
})
});
}
</script>
<form method="post" role="form" enctype="multipart/form-data" id="fileForm">
<input id="filec" type="file" name="file" onchange="javascript:upload()" multiple>
</form>
base64方式上传.
base64方式上传, 浏览器端将数据编码为base64后, 分段上传给服务端; 服务端对数据进行分段解码后存储至文件中.
服务端调用如下接口接收文件.
exports.uploadByBase64Header = async function (ctx) {
await febs.upload.base64_acceptHeader(ctx,
async function(data, filesize){
return "/tmp/filename.jpg";
}, function(data){
ctx.session.uploadSegInfo = data;
});
}
exports.uploadByBase64 = async function (ctx) {
await febs.upload.base64_accept(ctx,
async function(filename){
let img = sharp(filename);
let info = await img.metadata();
return febs.utils.mergeMap(errCode.OK, { width: info.width, height: info.height });
}, function(){
return ctx.session.uploadSegInfo;
}, function(data){
ctx.session.uploadSegInfo = data;
}, function() {
ctx.session.uploadSegInfo = undefined;
});
}
前台:
<script type="text/javascript" charset="utf-8" src="/jquery/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="/febs/febs.min.js"></script>
<script type="text/javascript">
febs.ui.uploadBase64({
data: {msg :'这是一个用户数据'},
fileBase64Str: base64Imagestr,
headerUrl: '/api/mgr/uploadimgByBase64Header',
uploadUrl: '/api/mgr/uploadimgByBase64',
finishCB: function(err, serverData) {
if (err) {
console.log('err: ');
console.log(err);
console.log(serverData);
}
else {
console.log('finish: ');
console.log(serverData);
}
},
progressCB: function(percent) {
console.log(Math.ceil(percent*100)+'%');
}
});
</script>