更新于3 年
403

前端工程化(一):使用Husky和lint-staged配置Git hook

但凡项目质量要求高会涉及到代码质量管理的问题,如何自动化检查代码质量。

git hook

git能在特定的重要动作发生时触发自定义脚本,这种钩子分为两种:一者是客户端的,另外一种就是服务端的。利用git hook,我们可以在提交之前运行脚本,但是脚本需要放在.git/hooks目录下面,团队协作中直接使用脚本是不利于团队内推广的。所以我们需要使用husky来解决这个问题。

安装husky

npm install husky --save-dev

如何使用

编辑package.json > prepare,然后运行一次:

npm set-script prepare "husky install"
npm run prepare

接着添加一个hook:

npx husky add .husky/pre-commit "npm test"
git add .husky/pre-commit

这样husky的配置就初步完成了。但是我们会发现,脚本执行的范围会是所有文件,随着项目体积的增加,文件数量会变得很多,全部走一遍脚本会很耗时间,这时候就需要lint-staged来限制脚本执行的范围,我们只执行在提交的代码上,不管其他未操作过的文件。

安装lint-staged

npx mrm@2 lint-staged

命令行执行这个脚本以后,就会在package.json默认生成一下类似内容:

{
  "lint-staged": {
    "*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}": "eslint --cache --fix",
    "*.{js,css,md}": "prettier --write"
  }
}

同时.husky文件下的pre-commit文件内容也会发生改变。
这样我们就完成提交的脚本操作了。

更新于4 年
206

判断句子是否为全字母句

全字母句含英语字母表中每个字母至少一次的句子。

给你一个仅由小写英文字母组成的字符串sentence,请你判断sentence是否为全字母句

如果是,返回true;否则,返回false

示例1:

输入:sentence = "thequickbrownfoxjumpsoverthelazydog"
输出:true
解释:sentence 包含英语字母表中每个字母至少一次。

示例2

输入:sentence = "leetcode"
输出:false

提示:

  • 1 <= sentence.length <= 1000
  • sentence由小写英语字母组成

解答:

/**
 * @param {string} sentence
 * @return {boolean}
 */
var checkIfPangram = function(sentence) {
  const list = new Set(sentence.split(""))
  return list.size===26
};

思路:

本次使用的方法是去重法,去重之后如果剩下的元素是26个,则是全字母句,反之则不是,这里使用的是es6语法里的Set来进行去重。

更新于4 年
372

相对名次

给你一个长度为n的整数数组score ,其中score[i]是第 i 位运动员在比赛中的得分。所有得分都互不相同

运动员将根据得分决定名次,其中名次第1的运动员得分最高,名次第2的运动员得分第2高,依此类推。运动员的名次决定了他们的获奖情况:

  • 名次第1的运动员获金牌"Gold Medal"
  • 名次第2的运动员获银牌"Silver Medal"
  • 名次第3的运动员获铜牌"Bronze Medal"
  • 从名次第4到第n的运动员,只能获得他们的名次编号(即,名次第x的运动员获得编号"x")。

使用长度为n的数组 answer 返回获奖,其中answer[i]是第i位运动员的获奖情况。

示例1:

输入:score = [5,4,3,2,1]
输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"]
解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。

示例2:

输入:score = [10,3,8,9,4]
输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"]
解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。

提示:

  • n == score.length
  • 1 <= n <= 104
  • 0 <= score[i] <= 106
  • score中的所有值互不相同

解答

function findRelativeRanks(score: number[]): string[] {
    const list = score.sort((a,b)=>b-a)

    return score.map((item)=>{
        const i = list.indexOf(item)
        if(i===0){
            return "Gold Medal"
        }else if(i===1){
            return  "Silver Medal"
        }else if(i===2){
            return "Bronze Medal"
        }
        return `${i+1}`
    })
};

思路
先排序,然后遍历score数组,获取每个元素在新数组的位置,根据位置来输出不同内容。

更新于4 年
322

连续字符

给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。

请你返回字符串的能量。

示例1:

输入:s = "leetcode"
输出:2
解释:子字符串 "ee" 长度为 2 ,只包含字符 'e'

示例2:

输入:s = "abbcccddddeeeeedcba"
输出:5
解释:子字符串 "eeeee" 长度为 5 ,只包含字符 'e'

示例3:

输入:s = "triplepillooooow"
输出:5

示例4:

输入:s = "hooraaaaaaaaaaay"
输出:11

示例4:

输入:s = "tourist"
输出:1

提示:

  • 1 <= s.length <= 500
  • s只包含小写英文字母

解答

/**
 * @param {string} s
 * @return {number}
 */
var maxPower = function(s) {
 var max = 1, count = 1

  for (var i = 0; i < s.length; i++) {
    if (s[i] === s[i + 1]) {
      count += 1
      max = Math.max(max, count)
    } else {
      count = 1
    }
  }

  return max
};

思路

先定义两个变量,maxcount,max用来记录目前最大的字符串,count则是用来记录当前重复字符串重复次数。然后依次变量字符串,比较当前值和下一个值是否相等,当然也可以比较和上一个值是否相等,如果相等则count+1,然后从count和max中取最大值重新赋值给max,如果不相等,则把count重新赋值为1,重新开始计算。

更新于4 年
349

Android开发基础知识(一):Assets和Res目录

创建一个新的Android项目后会产生assets和res两个文件夹,虽然二者都是存放资源的目录,但是二者有着很大的区别。

res目录

这个目录下的文件会在R.java里自动生成该资源的ID,所以访问这种资源文件比较简单,通过R.XXX.ID

assets目录

该目录下的文件在系统的编译的时候不会参与编译,所以我们无法同像R.XXX.ID的方式来访问它们。同时我们也不能通过绝对路径去访问它们,因为apk安装之后会放在/data/app/**.apk目录下,assets被绑定在qapk里,以apk形式存在,并不会解压到/data/data/YourApp目录下面。

res/raw和assets区别

相同点:

  1. 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

不同点:

  1. res/raw中文件可以用R.XXX.ID访问;assets文件夹则需要使用AssetManger
  2. res/raw不可以有目录结构,而assets可以有目录结构
  3. assets目录下的文件尽可能不要超过1M,否则会有bug;而res/raw则可以不受限制

访问assets目录文件

  1. webview.loadUrl("file:///android_asset/demo/index.html")
  2. AssetManager.open(String filename) 返回的是一个InputStream类型的字节流。
更新于4 年
477

短链接网站开发实战(一):项目简介

项目简介

这是一个基于Fiber框架开发的短链接网站,有PC端和小程序端,以后考虑会有基于原生的手机端。

技术栈

Go+Fiber+ent(Facebook开源的ORM框架)+Taro(开发多端小程序)

  1. Fiber框架文档地址 https://docs.gofiber.io/
  2. ent官网 https://entgo.io/
  3. Taro官网 http://taro-docs.jd.com/taro/docs/README

功能

  • 首页
  • 用户登录
  • 一对一短链接
  • 一对多短链接(根据多条件来跳转不同的链接)
  • 短链接访问IP,设备,系统,地区统计
  • 短链接提供第三方API认证调用
  • 二维码生成

目录结构

short-link
├── config # 配置文件
├── controller #控制器
│   └── user.go
├── ent #数据库模型
│   ├── enttest
│   │   └── enttest.go
│   ├── hook
│   │   └── hook.go
│   ├── migrate
│   │   ├── migrate.go
│   │   └── schema.go
│   ├── predicate
│   │   └── predicate.go
│   ├── runtime
│   │   └── runtime.go
│   ├── schema
│   │   └── user.go
│   ├── user
│   │   ├── user.go
│   │   └── where.go
│   ├── client.go
│   ├── config.go
│   ├── context.go
│   ├── ent.go
│   ├── generate.go
│   ├── mutation.go
│   ├── runtime.go
│   ├── tx.go
│   ├── user.go
│   ├── user_create.go
│   ├── user_delete.go
│   ├── user_query.go
│   └── user_update.go
├── repository # 数据库操作
│   └── user.go
├── router # 路由
│   ├── middleware #中间件
│   └── router.go #路由配置
├── service # 服务层
├── util # 工具集
├── bee.json
├── go.mod
├── go.sum
├── main.go
├── README.md

项目地址

https://github.com/lookenghua/short-link

更新于4 年
180

基于WebView搭建混合开发应用开发平台(一):项目简介

随着越来越快的开发迭代,基于WebView的混合开发占据了不少的份额。很多App内部都有着WebView的影子,本项目就是基于Jetpack Compose来搭建WebView混合开发框架。

项目目标

开发基于WebView的混合开发框架。安卓默认支持5.0以上,iOS支持13以上。

项目功能

基础功能

  1. 选择图片和拍照功能
  2. 权限申请
  3. 定位功能(基于高德地图)
  4. 扫码
  5. office文件预览
  6. 文件下载
  7. 选择文件功能
  8. 极光推送
  9. 第三方网页浏览
  10. 剪切板
  11. 自动升级

高级功能

  1. 语音识别
  2. 录音
  3. 录屏

项目地址

https://github.com/lookenghua/WebView

avatar

lookenghua

独立开发者

文章

17

分类

6

标签

5