NodeJs各版本新特性(持续更新)
NodeJs各版本新特性(持续更新)

NodeJs各版本新特性(持续更新)

Node.js最新版本分为Current系列和LTS系列,两者分别面向不同需求场景:前者提供最新功能,后者强调长期稳定性。本文主要以偶数版本介绍。

阅读全文
如何使用ffmpeg将mp4转换为m3u8
如何使用ffmpeg将mp4转换为m3u

如何使用ffmpeg将mp4转换为m3u8

M3U8 是一种基于文本的播放列表格式,通常用于 HTTP Live Streaming(HLS)协议,该协议是由苹果公司开发的一种流媒体传输方式。M3U8 文件包含了指向媒体片段(如视频或音频)的 URL 链接,这些片段会被播放器逐个请求并拼接起来,以达到流畅播放的效果。

阅读全文
TS试炼-3
TS试炼-3

TS试炼-3

本项目意在于让你更好的了解 TS 的类型系统,编写你自己的类型工具,或者只是单纯的享受挑战的乐趣!我们同时希望可以建立一个社区,在这里你可以提出你在实际环境中遇到的问题,或者帮助他人解答疑惑 - 这些问题也可能被选中成为题库的一部分!

阅读全文

⌈小技巧⌋ 获取一个随机颜色

一行代码获取一个随机颜色。

javascript 复制代码
`#${((Math.random() * 0xffffff) | 0).toString(16)}`
2025-11-24

⌈地理⌋ 获取多个经纬度的中间坐标

获取多个经纬度的中间坐标

javascript 复制代码
/**
 * 获取多个经纬度的中间坐标
 * @param {{lat: number, lng: number}[]} points 多个经纬度点
 * @returns {{lat: number, lng: number}} 中间坐标
 */
export function getPointsCalculateCenter(points) {
  const point_num = points.length; //坐标点个数
  let X = 0,
    Y = 0,
    Z = 0;
  for (let i = 0; i < points.length; i++) {
    if (!points[i]) {
      continue;
    }
    const point = points[i];
    const lat = (point.lat * Math.PI) / 180;
    const lng = (point.lng * Math.PI) / 180;
    const x = Math.cos(lat) * Math.cos(lng);
    const y = Math.cos(lat) * Math.sin(lng);
    const z = Math.sin(lat);
    X += x;
    Y += y;
    Z += z;
  }
  X = X / point_num;
  Y = Y / point_num;
  Z = Z / point_num;
  const tmp_lng = Math.atan2(Y, X);
  const tmp_lat = Math.atan2(Z, Math.sqrt(X * X + Y * Y));
  return { lat: (tmp_lat * 180) / Math.PI, lng: (tmp_lng * 180) / Math.PI };
}
2025-11-24

⌈工具⌋ 整合压缩包下载

将多个在线文件地址,通过压缩包下载。

javascript 复制代码
const script = document.createElement('script')
script.setAttribute(
  'src',
  'https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.min.js'
)
// 文件地址
const urls = []
// 压缩包的名字
const name = Date.now()
script.onload = () => {
  const zip = new JSZip()
  Promise.all(
    urls.map((url) => fetch(url).then(res => res.arrayBuffer()))
  ).then((arrayBuffers) => {
    arrayBuffers.forEach((arrayBuffer, index) => {
      const filename = `${index + 1}.${urls[index].split('.').pop()}`
      zip.file(filename, arrayBuffer)
    })
    zip.generateAsync({ type: 'blob' }).then((content) => {
      const link = document.createElement('a')
      link.href = URL.createObjectURL(content)
      link.download = name + '.zip'
      link.click()
    })
  })
}
document.body.appendChild(script)
2024-09-28

⌈地理⌋ WGS84坐标转换为GCJ02坐标

WGS84坐标转换为GCJ02坐标。

javascript 复制代码
/**
 * 判断是否在国外
 * @param { number } lng 经度
 * @param { number } lat 纬度
 * @returns { boolean } 是否在国外
 */
export function outOfChina(lng, lat) {
  return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271 || false;
}

/**
 * 转换纬度
 * @param { number } lng 经度
 * @param { number } lat 纬度
 * @returns { number } 转换后的纬度
 */
export function transformlat(lng, lat) {
  const PI = Math.PI;
  let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
  ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;
  ret += ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) / 3.0;
  ret += ((160.0 * Math.sin((lat / 12.0) * PI) + 320 * Math.sin((lat * PI) / 30.0)) * 2.0) / 3.0;
  return ret;
}

/**
 * 转换经度
 * @param { number } lng 经度
 * @param { number } lat 纬度
 * @returns { number } 转换后的经度
 */
export function transformlng(lng, lat) {
  const PI = Math.PI;
  let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
  ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;
  ret += ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) / 3.0;
  ret += ((150.0 * Math.sin((lng / 12.0) * PI) + 300.0 * Math.sin((lng / 30.0) * PI)) * 2.0) / 3.0;
  return ret;
}

/**
 * WGS84坐标转换为GCJ02坐标
 * @param { number } lng 经度
 * @param { number } lat 纬度
 * @returns { { lat: number, lng: number } } GCJ02坐标
 */
export function wgs84togcj02(lng, lat) {
  const PI = Math.PI;
  const a = 6378245.0;
  // eslint-disable-next-line @typescript-eslint/no-loss-of-precision
  const ee = 0.00669342162296594323;
  if (outOfChina(lng, lat)) {
    return { lng, lat };
  } else {
    let dlat = transformlat(lng - 105.0, lat - 35.0);
    let dlng = transformlng(lng - 105.0, lat - 35.0);
    const radlat = (lat / 180.0) * PI;
    let magic = Math.sin(radlat);
    magic = 1 - ee * magic * magic;
    const sqrtmagic = Math.sqrt(magic);
    dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI);
    dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI);
    const mglat = lat + dlat;
    const mglng = lng + dlng;
    return { lng: mglng, lat: mglat };
  }
}
2025-11-24
进击的巨人

进击的巨人

在艾伦他们居住的帕拉迪岛之外,还存在一个其他人类居住的世界。当中一个国家「玛雷」与其他各国爆发战争。陷入苦战之际,他们决定要攻进帕拉迪岛,把「始祖的巨人」抢过来。在这里又看到另一群孩子们拼命求生存的身影……

2024-07-19
绝命毒师第四季

绝命毒师第四季

故事发展到第四季,沃尔特(布莱恩·科兰斯顿 Bryan Cranston 饰)和古斯(吉安卡洛·埃斯珀西多 Giancarlo Esposito 饰)之间的关系开始变得越来越紧张起来,古斯不仅加强了对于沃尔特的监视,还企图控制杰西(亚伦·保尔 Aaron Paul 饰),希望有朝一日他能够替代沃尔特。  一些蛛丝马迹让汉克(迪恩·诺里斯 Dean Norris 饰)对古斯逐渐产生了怀疑,这让沃尔特的身份几次濒临暴露。沃尔特发现了古斯对自己的杀意,他想要用积攒下来的存款带着家人远走高飞,哪想到,巨额财产竟被斯凯勒(安娜·古恩 Anna Gunn 饰)用于自保。沃尔特被逼到了绝境,在他的面前只有唯一的选择,那就是不惜一切代价,先下手为强,除掉古斯。

2024-07-19
绝命毒师第五季

绝命毒师第五季

故事紧接着上一季,通过一场精心策划的大爆炸,沃尔特(布莱恩·科兰斯顿 Bryan Cranston 饰)终于除掉了长久以来的威胁古斯塔沃(吉安卡洛·埃斯珀西多 Giancarlo Esposito 饰),也将古斯塔沃一手建立的毒品帝国连根拔起。然而,“事业”上的成功并没有为沃尔特带来太多的快乐,因为他和妻子斯凯勒(安娜·古恩 Anna Gunn 饰)之间的关系再次跌落到了冰点。  古斯塔沃死了,但沃尔特的野心并没有消失,他联手杰西(亚伦·保尔 Aaron Paul 饰)与麦克(乔纳森·班克斯 Jonathan Banks 饰),开始建立属于他的新的帝国。一次偶然中,汉克(迪恩·诺里斯 Dean Norris 饰)在沃尔特家中发现了沃尔特就是海森堡的确凿证据,巨大的打击之下,他决心大义灭亲,昔日的连襟,如今沦为对手。与此同时,一股新的势力正在毒品圈内逐渐壮大,他们即将成为汉克最强大的敌人。

2024-07-19
风骚律师第六季

风骚律师第六季

故事发展到第六季,吉米(鲍勃·奥登科克 Bob Odenkirk 饰)和金(蕾亚·希霍恩 Rhea Seehorn 饰)决定对霍华德(帕特里克·法比安 Patrick Fabian 饰)实行小小的“复仇”。那边厢,纳乔(迈克尔·曼多 Michael Mando 饰)在将萨拉曼卡家族一锅端之后踏上了逃往的旅途。  这场屠杀中,拉罗(托尼·达尔顿 Tony Dalton 饰)成为了幸存者,这对于纳乔和古斯(吉安卡罗·埃斯波西托 Giancarlo Esposito 饰)来说无疑是一场不幸。古斯一边派出麦克(乔纳森·班克斯 Jonathan Banks 饰)接应纳乔,一边还要提防血债血偿的拉罗随时出现在眼前。最终,吉米和金顺利的毁掉了霍华德的事业,但事情的发现很显然超越了两人的预期和控制。

2024-06-22