您访问的是非正式的站点,不是最新内容哦,请点击这里前往Dnocm ヾ(=゚・゚=)ノ喵♪

若白驹过隙,忽然而已

Gradle 初探

第一次接触 Gradle 是在数年前做android开发的时候,然而后来我的工作都是 Maven 做web开发,所以 Gradle 也就忘得差不多了(其实本来就没学多少)

我相信每个看到这篇文章的人,都是用过 Maven 的, 想学习 Gradle,但在开始前,我们应该弄清楚为什么要学它,它能带来怎样的益处(相对于 Maven)?

Why

如果你问 Gradle 优于 Maven 么? 答案必定是不一定

在 Maven 中有完善的依赖管理以及成熟的构建流程,在绝大多数的项目中都能很好的运行。但也是那一套流程,使的 Maven 十分死板。而且 Maven 是只属于 Java 的项目构建工具

在 Gradle 中就灵活的多,你可以随意的定义流程,但一个大型的项目规范是十分重要的,即便是构建流程,也要有规范,也是要统一的,试问假如我要构建一个普通的Web应用,自己定的构建流程又怎么能比过这么长时间积累下来的 Maven 的流程的? 但我的项目是个缝合怪呢,有java有node,那么 Gradle 就能同时组织它们。 Gradle 是 Java 环境下的构建工具, 它不是 Java 项目构建工具, 就如 node 里的 Gulp

新网址!

netlify免费版的网络真的太差了(跟1年多前刚使用的时候比,差太多),所以原本打算迁移到github pages

看对比,github pages整体比netlify稳定的多,但github不支持重定向。而腾讯云的解析服务,重定向需要备案,所以dnocm只好保持不动,选择新增了一个部署

同时也尝试了coding,但在国外的ping不理想,所以干脆一次性部署了多个

假如,你在访问当前地址时,感觉卡,可以试试前往我的其他域名下

造了套自己的 Promise

Promise 很火,没看源码,仅参考平时的使用,造了一个小轮子(有时间再去看源码把)

class PromiseT {
  constructor() {
    this.status = 'running';
    this.val = null;
    this.pendingList = [];
  }
  then(...list) {
    this.pendingList.push(...list);
    return this.run();
  }
  resolve(val) {
    this.status = 'running';
    if (val !== undefined) {
      this.val = val;
    }
    return this.run();
  }
  pending() {
    this.status = 'pending';
  }
  run() {
    if (this.status === 'pending') {
      return this;
    }
    const cal = this.pendingList.shift();
    if (cal === undefined) {
      return this;
    }
    const result = cal(this.val, this);
    if (result === undefined) {
      return this.run();
    }
    if (result.constructor === PromiseT) {
      return result.then(...this.pendingList);
    }
    this.val = result;
    return this.run();
  }
}

测试:

new PromiseT()
  .resolve(5)
  .then(x => x + 1)
  .then(x => new PromiseT().resolve(2).then(a => x / a))
  .then(x => console.log(x))
  .then((x, p) => {
    p.pending();
    setTimeout(() => {
      p.resolve(x - 3);
    }, 2000);
  })
  .then(x => console.log(x));

// 输出 3
// 等待 2s
// 输出 0

毕竟是小轮子,catch() finally() 这些没写。。。

发布 npm 包到 GitHub Packages

GitHub Packages在半年前尝试过,那时候存在些问题

  1. 不能使用yarn安装(这个已经修复了)
  2. 必须认证授权才能使用,即便你的包是开源的,很不方便

但不管怎样,GitHub Packages始终是个不错的备选方案

JUnit 5 教程

JUnit 5 作为新一代的 Java 单元测试框架,提供很多改进。例如对比 JUnit4JUnit5 的官网,JUnit5 的设计更加简约与时尚,至少不会抗拒阅读的程度了(像破烂一样的网站,看了整个人都难受,不影响效率?不存在的)

而且,除此外,他的文档使用了 Asciidoc, 相对于markdown复杂,主要是它还支持具有包含另一个文件内容,这对于写API文档来说挺重要的,有兴趣可以了解下~

Okay, 结束吐槽,让我来看看 JUnit5 到底带来了哪些变化吧

Intersection Observer 简介

Intersection Observer API提供了一种异步观察目标元素与祖先元素或顶级文档viewport的交集中的变化的方法。这使得以往较难实现的功能,更加简单,例如,监听图片元素,在适当的时候懒加载图片。

探究:优惠券的设计

最近几天,和朋友讨论了许多优惠券相关的问题,他以产品的角度,探究优惠券的意义场景等。他阐释,优惠券的本质是价格歧视,通过对不同消费者提供不同的收费标准,以此来增加营收。

当然,从我的角度出发(程序猿),我并不关心优惠券的目的,而更感兴趣于架构的设计,毕竟这块很有挑战性。比如满减或者折扣等涉及支付系统,用户领取使用又涉及用户系统等等(这里假设在微服务架构下)通常优惠券会影响多个系统,除此外,优惠规则与限制条件又十分复杂。但越难才越有意思。

我初步将优惠券系统分为以下四个部分:

  • 优惠券主体,简单说定义名称或者一些说明之类
  • 优惠策略,定义处理优惠的方式
  • 限制规则,在这部分中定义什么条件下可使用或者“过期”
  • 发放策略,定义何时如何发放,一般情况下与用户和活动系统相关

为了实现一个我理想中的优惠券系统

  • 支持多张券同时使用
  • 支持各种限制,甚至自定义限制
  • 尽可能的降低各个系统与优惠券系统的耦合性

npm 免密 publish

做个笔记,毕竟多台电脑,需要配置

  1. 创建token

  1. 添加.npmrc文件至用户目录下
    //npm.pkg.github.com/:_authToken=*****************
    //registry.npmjs.org/:_authToken=*****************