记录发布的第一个javascript项目及遇到的一些问题

前言

在去年12月份刚开始学习编程的时候,看到这样一句话:“初学者不要写博客,要多记笔记。”
细想言之有理,便没有申请博客,开始在Onenote上记录各种网上复制下来的笔记。

然而过了没多久,又看到这么一句话:“好的代码就相当于笔记。”
细想亦言之有理,便停了onenote的笔记,导致在这半年多的时间里除了代码基本上没有写过些什么。

而在前两天,发布了自己的第一个npm包之后,觉得似乎应该记录下自己编写代码和发布包的过程中遇到的问题,顺便发布项目Demo,
便花一天时间开始一步步折腾搞定github pages,hexo,和域名之类。

项目预览及地址

功能:Youtube之类网站在进行ajax请求时顶部出现的载入条

Demo

Github地址

为什么要写这个项目

之前在一个天气预报App的Demo,搜索然后ajax请求是基本功能,请求过程中就想到了实现载入效果,便在github上寻找开源项目。

因为希望这个天气预报App尽量轻便(使用了React,撇除React-Router及Redux之类),所以放弃一些包含各种载入效果的库,
最后使用了NprogressNanobar两个功能简单的库。

这俩个库相比较,Nanobar体积更小,功能更简单(只有一个go函数),Nprogress则更漂亮(有一个peg元素,制造了box-shadow阴影),
可以调用的函数也更多(有渐渐载入的效果)。

但是这两个库年代都比较久远,都没有选择构造函数来创建对象,所有函数都没有绑在原型链上(当然对于这种功能简单的库来说没有什么大的影响)、
都是使用setTimeout方式实现动画(当然对这种简单的动画也没有什么大的影响)、都需要引入css文件使用transform作为实现动画效果的辅助。
最终在参考了两个库的源代码后决定自己写一个。

在项目中遇到的问题和解决方法

构造函数、打包工具

使用ES6 class构造对象,使用rollup打包成umd形式的函数。

rollup在打包之后不是生成传统的Object.prototype形式,而是定义了一个createClass函数

var createClass = function () {
  function defineProperties(target, props) {
    for (var i = 0; i < props.length; i++) {
      var descriptor = props[i];
      descriptor.enumerable = descriptor.enumerable || false;
      descriptor.configurable = true;
      if ("value" in descriptor) descriptor.writable = true;
      Object.defineProperty(target, descriptor.key, descriptor);
    }
  }

  return function (Constructor, protoProps, staticProps) {
    if (protoProps) defineProperties(Constructor.prototype, protoProps);
    if (staticProps) defineProperties(Constructor, staticProps);
    return Constructor;
  };
}();

动画函数

使用window.requestAnimationFrame来进行动画,使用了一般通用的polyfill

const rAF = window.requestAnimationFrame ||
  window.webkitRequestAnimationFrame ||
  window.mozRequestAnimationFrame ||
  window.oRequestAnimationFrame ||
  window.msRequestAnimationFrame ||
  function (callback) { window.setTimeout(callback, 1000 / 60); };

setTimeout函数间隔为1000 / 60以满足帧数。

合并对象

在库中使用了Object.assign函数合并对象,该函数有浏览器兼容问题,需要额外使用babel插件进行编译。

一般比较大的库都会定义自己的merge函数,lodashunderscore也定义了合并函数,另外ES6有实验性质的展开对象合并的方法,
这应该也是极为遥远的将来展开和合并对象的标准方法

限制对象属性的值

渲染进度条最重要的是确定什么时候渲染完成,按照逻辑来说进度条达到最大值的时候就应该淡出,
用代码表示就应该是if (this.barWidth === this.maxWidth) this.stop();
但实际运行中发现由于递增barWidth使用的是缓动函数,
所以barWidth未必会接触到maxBarWitdh,可能上一帧在99.8%,下一帧却出现在100.2%。

nanobar解决这个问题是直接重新创建实例

if (p >= 100) {
  init()
}

这个方式可能有点太粗暴了。而我最终选择的是Object.defineProperty方法:

Object.defineProperties(this, {
  // constant max width
  'maxWidth': { value: 100 },
  // limit bar width
  'barWidth': {
    get() { return barWidth; },
    set(value) {
      if (value <= 0) value = 0;
      // set to 0 if width touch 100%
      if (value >= 100) value = 100;
      barWidth = value;
    }
  }
});

一旦barWidht超过100,就会被设置成100,进而出发stop函数。

当然这个方法是否有什么弊端我还没有研究过。

youtube的进度条在淡出的时候是定格在101%的。

Promise

原本处理进度条淡出后移除DOM是选择了Promise

_fadeOut(el) {
  if (!el.style.opacity) el.style.opacity = 1;
  el.style.opacity -= 0.1;
  if (el.style.opacity > 0) rAF(this._fadeOut.bind(this, el));
  return Promise.resolve();
}

最终还是因为浏览器兼容问题选择callback

_fadeOut(el, callback) {
  el.style.opacity -= 0.1;
  if (el.style.opacity > 0) {
    rAF(this._fadeOut.bind(this, el, callback));
  } else {
    setTimeout(() => { callback(); }, 300);
  }
}

ease function

第一次接触了javascript的缓动函数,看了很多资料还是一知半解,项目里使用的欢动函数属于比较简单的

const easing = (t, b, c, d) => c * t / d + b;

如果有兴趣的话可以参考这里看更多缓动函数资料

如果你对该项目有兴趣,欢迎你贡献代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容